Android mediacodec实时解码h264流,延迟时间约为1秒

时间:2014-01-04 20:48:39

标签: android h.264 rtsp rtp mediacodec

我试图通过Galaxy S3中的madiacodec从WIFI摄像头解码h264直播流,视频播放正常,但似乎mediacode低电平总是缓冲1秒视频帧,新帧只能通过新的解码进入的NAL单位。这导致大约1秒的延迟。

当调用MediaCodec.createDecoderByType("video/avc");时,我可以从logcat看到分配了22个缓冲区,

01-04 15:39:02.799: I/ExtendedCodec(13374): Smoothstreaming Enabled
01-04 15:39:02.809: I/ACodec(13374): [OMX.qcom.video.decoder.avc] Now Loaded->Idle
01-04 15:39:02.809: I/ACodec(13374): [OMX.qcom.video.decoder.avc] Allocating 22 buffers from a native window of size 245760 on output port
01-04 15:39:02.889: D/DecodeActivity(13374): Decoder started at --- 1388867942894
01-04 15:39:02.889: I/ACodec(13374): [OMX.qcom.video.decoder.avc] Now Idle->Executing
01-04 15:39:03.019: I/ACodec(13374): [OMX.qcom.video.decoder.avc] Now Executing

我可以看到在我可以输出任何帧之前需要将16个NAL单元推入解码器。

我的问题是为什么这个视频缓冲?如果这是问题,我可以尝试分配更少的缓冲区。无论如何我可以减少这个视频缓冲吗?

1 个答案:

答案 0 :(得分:0)

首先,您确定每个NAL单元对应一个帧吗? H.264并没有规定每帧有多少NAL单元,这取决于编码器的实现。 第二件事,我在使用带有Qualcomm芯片组的设备时遇到了类似的问题。我没有使用MediaCodec,而是使用IOMX界面,但基本上我得到了相同的延迟。我想知道你是否在logcat中有关于如何分配mnay输入缓冲区的打印件。这些与问题更相关,而不是输出端口上的缓冲区。