我在 android 中使用 MediaCodec 低级 Api 来解码从 IP 摄像机接收到的 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”。并且它在给定表面上没有显示任何内容。
我缺少哪一步。请指导我。
谢谢
我假设您正在传递单独的“访问单元”,即每个缓冲区一帧视频。
您似乎缺少的是编解码器设置块,该块预计位于提交的第一个缓冲区中(也可以塞入MediaFormat
via format.setByteBuffer("csd-0", ...)
)。假设数据来自您的特定编码器,您所要做的就是将第一个缓冲区与BUFFER_FLAG_CODEC_CONFIG http://developer.android.com/reference/android/media/MediaCodec.html#BUFFER_FLAG_CODEC_CONFIG flag.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)