【问题标题】:Android mediacodec decoding h264 stream in real time with about 1 second latencyAndroid mediacodec 实时解码 h264 流,延迟约 1 秒
【发布时间】:2014-01-04 20:48:38
【问题描述】:

我正在尝试通过 Galaxy S3 中的 mdiacodec 解码来自 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 单元推入解码器,然后才能输出任何帧。

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

【问题讨论】:

    标签: android h.264 rtsp rtp android-mediacodec


    【解决方案1】:

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

    【讨论】:

    • 我很确定编码器实现为一帧设置了一个 NAL,在我的情况下,我认为分配了 16 个缓冲区,我认为这是由低级驱动程序完成的。它实际上与我的 1 秒延迟相匹配,因为我的帧速率是 15fps。
    • 而且很奇怪,我的软件解码器在延迟方面具有更好的性能,无论如何我都实现了以防万一。
    • 我指的是 logcat 打印,上面写着“从本机窗口分配 22 个缓冲区”。那似乎是输出缓冲区,我想知道它是否打印输入端口的数字
    猜你喜欢
    • 2021-08-30
    • 2016-05-27
    • 2013-04-25
    • 2018-10-11
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 2014-02-06
    • 2020-06-13
    相关资源
    最近更新 更多