使用android低级别api解码H264stream媒体

我在android中使用MediaCodec低级别的Api解码从IP CAMERA接收到的h264原始数据stream。 来自IP摄像机的原始数据stream,通过TCP / IP连接进行接收。

为了解码stream,我的代码是:

@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”。 它不显示给定的表面上的任何东西。

我错过了哪一步。 请指导我。 感谢名单

Solutions Collecting From Web of "使用android低级别api解码H264stream媒体"

我假设你正在通过单个“访问单元”,即每个缓冲区的一帧video。

你似乎缺less的是编解码器设置块,预计将在第一个caching提交(也可以通过format.setByteBuffer("csd-0", ...) )卷入MediaFormat 。 假设数据从您的特定编码器中传出,您所要做的就是用BUFFER_FLAG_CODEC_CONFIG标志排队第一个缓冲区。