繁体   English   中英

使用android低级api解码H264流

[英]Decoding H264 streaming using android low level api

我在android中使用MediaCodec低级Api来解​​码从IP CAMERA收到的h264原始流。 来自IP摄像机的原始流,在TCP / IP连接上接收。

要解码流,我的代码是:

@Override
protected void onCreate(Bundle savedInstanceState) {

 MediaCodec mCodecc;
 MediaFormat mFormat;
 BufferInfo mInfo;
 ByteBuffer[] inputBuffers ;
 ByteBuffer[] outputBuffers ;

}
protected void Init_Codec()
{
  mCodecc = MediaCodec.createDecoderByType("video/avc");
  mFormat =  MediaFormat.createVideoFormat("video/avc", width, height);

  mInfo = new BufferInfo();
mFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);
  mCodecc.configure(mFormat, holder.getSurface(), null,0);
}

protected void Start_Codec()
{
  mCodecc.start();          
  inputBuffers = mCodecc.getInputBuffers();
  outputBuffers = mCodecc.getOutputBuffers();
}

private void OnRawStreamReceived(final ByteBuffer buffer)
{

 mHandler.postAtFrontOfQueue(new Runnable() {

@Override
public void run()
{
       int inIndex = mCodecc.dequeueInputBuffer(10000);
   if(inIndex>=0)
     {
    inputBuffers[inIndex] = buffer;
    mCodecc.queueInputBuffer(inIndex, 0,buffer.limit(),System.currentTimeMillis(), 0);
    }
       int outIndex = mCodecc.dequeueOutputBuffer(mInfo, 10000);
       switch (outIndex) {

    case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
    Log.d("DecodeActivity", "INFO_OUTPUT_BUFFERS_CHANGED");
    outputBuffers = mCodecc.getOutputBuffers();
    break;

    case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
    Log.d("DecodeActivity", "New format " + mCodecc.getOutputFormat());
    break;

        case MediaCodec.INFO_TRY_AGAIN_LATER:
    Log.d("DecodeActivity", "dequeueOutputBuffer timed out! --- size : " + mInfo.size );
    break;

    default:
    ByteBuffer buffer = outputBuffers[outIndex];

            mCodecc.releaseOutputBuffer(outIndex, true);
    break;
    }
}


int outIndex = mCodecc.dequeueOutputBuffer(mInfo, 10000);

但是在这行代码中,我总是收到“-1”。 和mInfo.size()也是我得到“0”。 它没有在给定的表面上显示任何东西。

我缺少哪一步。 请指导我。 感谢名单

我假设你正在传递个人“访问单元”,即每个缓冲区一帧视频。

您似乎缺少的是编解码器设置块,它应该在提交的第一个缓冲区中(也可以通过format.setByteBuffer("csd-0", ...)隐藏到MediaFormat )。 假设数据来自您的特定编码器,您所要做的就是使用BUFFER_FLAG_CODEC_CONFIG标志对第一个缓冲区进行排队

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM