【问题标题】:Is it possible to decode MPEG4 frames without delay with ffmpeg?是否可以使用 ffmpeg 无延迟地解码 MPEG4 帧?
【发布时间】:2015-06-22 21:42:31
【问题描述】:

我使用 ffmpeg 的 MPEG4 解码器。解码器具有 CODEC_CAP_DELAY 能力等。这意味着解码器将为我提供延迟为 1 帧的解码帧。

我有一组来自 AVI 文件的 MPEG4 (I- & P- ) 帧,并将这些帧提供给 ffmpeg 解码器。对于第一个 I 帧解码器,我什么也没给,但成功解码了这些帧。我可以强制解码器通过 avcodec_decode_video2 的第二次调用获取解码帧并提供空值(刷新它),但如果我对每一帧都这样做,我会得到第一组图片的伪像(例如第二个解码的 P 帧是灰色的)。

如果我现在不强制 ffmpeg 解码器给我解码的帧,那么它可以完美地工作并且没有伪影。

问题:但是是否有可能在不给解码器下一帧且没有伪影的情况下获得解码帧?

如何为每一帧实现解码的小例子:

        // decode
        int got_frame = 0;
        int err = 0;
        int tries = 5;
        do
        {
            err = avcodec_decode_video2(m_CodecContext, m_Frame, &got_frame, &m_Packet);
            /* some codecs, such as MPEG, transmit the I and P frame with a
            latency of one frame. You must do the following to have a
            chance to get the last frame of the video */
            m_Packet.data = NULL;
            m_Packet.size = 0;
            --tries;
        }
        while (err >= 0 && got_frame == 0 && tries > 0);

但正如我所说,这给了我第一个 gop 的工件。

【问题讨论】:

    标签: ffmpeg decoder


    【解决方案1】:

    使用“-flags +low_delay”选项(或在代码中设置 AVCodecContext.flags |= CODEC_FLAG_LOW_DELAY)。

    【讨论】:

    • 谢谢,正是我要找的东西
    • @ronald-s-bultje 我在处理延误方面遇到了很多问题,甚至不知道这个标志的存在。查看文档,它所说的只是强制低延迟,这并没有告诉我太多。查看源代码,我发现它仅适用于 h264 和一些 mpegX 代码。它只对那些有效吗?它总是会丢弃所有延迟吗?或者我在哪里可以获得有关此标志功能的更多信息。在此先感谢您,这样可以省去一些麻烦。
    • @maxito:我相信它在遇到 MPEG-4 中的 B 帧时会自动重新启用延迟。我没有检查其他编解码器,但我隐约记得对于 H264(与更复杂的金字塔帧排序结构相关),延迟被解释为“最大延迟”,这意味着如果我们遇到比指示延迟更多的排队帧,我们假设我们错过了一个帧(解码错误?丢包?)并开始输出帧。我建议阅读源代码以查看该标志的确切作用。它仅在 MPEG-1/2/4、H264 和 VC1 中受支持。
    • 感谢您提供的信息,将更深入地查看源代码。
    • @ronald-s-bultje 尝试将此标志用于 mpeg4 编码器 - avcodec_encode_video2 开始失败。但是有了解码器,这个标志就可以工作了。
    【解决方案2】:

    我测试了几个选项,“-flags low_delay”和“-probesize 32”比其他选项更重要。下面的代码对我有用。

    AVDictionary* avDic = nullptr;
    av_dict_set(&avDic, "flags", "low_delay", 0);
    av_dict_set(&avDic, "probesize", "32", 0);
    
    const int errorCode = avformat_open_input(&pFormatCtx, mUrl.c_str(), nullptr, &avDic);
    

    【讨论】:

      猜你喜欢
      • 2017-04-19
      • 2020-06-13
      • 2021-09-09
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多