使用Android的低级API解码H264流低级、Android、API

2023-09-04 11:44:53 作者:没够颓废

我正在使用Android的媒体codeC底层API脱code H264原料流从IP摄像机接收。 从IP相机原始数据流,接收的TCP / IP连接。

I am using MediaCodec low level Api in android to decode h264 raw stream received from IP CAMERA. Raw stream from IP camera , receiving on TCP/IP connection.

要取消code流,我的code是:

To decode stream , My code is :

@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);

但在这行code,我总是收到-1。和mInfo.size()也是我得到0。和它不给定表面上显示什么。

But at this line of code , I'm always receiving "-1". and mInfo.size() is also I'm getting "0". and It is not displaying anything on given surface.

这一步,我很想念。请指导我。 感谢名单

Which step I'm missing. please guide me. thanx

推荐答案

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

I'm assuming you're passing in individual "access units", i.e. one frame of video per buffer.

什么,你似乎缺少的是codeC设置模块,预计将在提交第一个缓冲区(也可以塞进 MediaFormat 通过 format.setByteBuffer(CSD-0,...))。假设数据出来你的特殊的连接codeR,所有你需要做的是队列中第一个与BUFFER_FLAG_$c$cC_CONFIG标志。

What you seem to be missing is the codec setup block, which is expected to be in the first buffer submitted (could also be tucked into the MediaFormat via format.setByteBuffer("csd-0", ...)). Assuming that data is coming out of your particular encoder, all you have to do is queue the first buffer with the BUFFER_FLAG_CODEC_CONFIG flag.