使用Android mediacodec实时解码h264流,延迟约为1秒。

5
我正在尝试使用Galaxy S3中的mediacodec解码来自WIFI相机的h264实时流,视频播放正常,但是似乎mediacodec低级别始终会缓冲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
首先,您确定每个NAL单元对应于一个帧吗?H.264不规定每个帧将有多少个NAL单元,这取决于编码器实现。 其次,当使用具有高通芯片组的设备时,我遇到了类似的问题。我没有使用MediaCodec,而是使用IOMX接口,但基本上我遇到了相同的延迟。我想知道logcat中是否有打印,显示分配了多少个输入缓冲区。这些将与问题更相关,而不是输出端口上的缓冲区。

我非常确定编码器的实现为一个帧设置一个NAL,在我的情况下,我认为会分配16个缓冲区,这是由底层驱动程序完成的。实际上,它与我的帧率为15fps所产生的1秒延迟相匹配。 - user3161207
很奇怪的是,我的软件解码器在延迟方面表现更好,不管怎样,我两个都实现了以防万一。 - user3161207
我指的是logcat打印输出,它说“从本地窗口分配22个缓冲区”。那似乎是输出缓冲区,我想知道它是否会打印输入端口的数字。 - ArikYa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接