【问题标题】:FFMPEG API real-time encoding, skipped framesFFMPEG API 实时编码,跳帧
【发布时间】:2015-10-23 13:58:47
【问题描述】:

我正在使用 FFMPEG 对实时视频进行编码。如果我跟不上实时编码,我需要丢帧。目前,我只是跳过原始帧的编码,下一帧的 PTS 是相同的。意思是,即使有跳帧,pts总是1,2,3,4,5,6....

这会导致文件的播放提前跳过。相反,我想在混合文件中添加空白帧。我尝试通过将 PTS 设置为 1、2、4、5、8、.... 来使 PTS 指示跳过的帧,但 FFMPEG h264 编码器依赖于 PTS 是连续的。

如何将空数据传递给我的 mp4/容器,及时指示空白,以便解码器不会出现及时跳转,而只是看到延迟/冻结。

【问题讨论】:

    标签: ffmpeg h.264


    【解决方案1】:

    您不需要创建空框架,在这种情况下,您应该自己管理 PTS。对于视频 PTS,它总是每帧增加 1。它是有保证的,所以你可以保证。

    我还没有任何实时编码经验,但是只要实时进行,如果您只是丢弃视频帧,与音频帧的同步可能会发生冲突。

    为避免这种情况,您应该保存前一帧,并在丢弃帧时进行克隆并填充它,或者您也应该丢弃音频帧。但正如我所说,它只是在玩,所以我不知道什么最适合你。

    在这种情况下,以下是 puedo 代码:

    // you should drop / or drop and make the clone of previous frame.
    
    static int64_t last_pts = 0; // just make sure initialize once.
    if(frame->pts != AV_NOPTS_VALUE && is_video == true)
    {
      if(last_pts) frame->pts = last_pts + 1;
      last_pts = frame->pts;
    }
    

    【讨论】:

    • 但是编码器在没有得到顺序 PTS 时会抱怨。
    • 这就是为什么您必须自己管理视频的 PTS。你不能只将它传递给编码器:)
    猜你喜欢
    • 2015-05-30
    • 2014-02-24
    • 1970-01-01
    • 2019-01-13
    • 2022-01-13
    • 2020-07-14
    • 2012-07-28
    • 1970-01-01
    • 2017-11-27
    相关资源
    最近更新 更多