如何在ffmpeg C++api中向h.264视频流插入关键帧(Iframe)

How to insert a key frame(Iframe) to a h.264 video stream in ffmpeg C++ api?

本文关键字:插入 关键帧 Iframe 视频 ffmpeg C++api 中向      更新时间:2023-10-16

我有一个实时视频流,希望通过精确的时间戳(pts)从中剪切一些视频片段。

当我接收到一个avpacket时,我会对它进行解码,然后做一些事情并缓存该avpacket。我不想重新编码所有的avpacket,这需要占用cpu资源。

H.264流中有许多gop结构,通常我们应该从关键帧开始剪切视频,并在关键帧结束。否则,视频剪辑中的前一些帧将显示错误。

现在我使用av_write_frame将avpacket制作成视频。但有时gop的长度很长,比如它可能是2508.3s(每秒30帧)。这意味着两个I帧之间的距离可以是250帧。视频剪辑很短,我不想添加太多未使用的帧。

我该怎么办?我想我应该在视频剪辑的开始位置插入一个I帧。我可以把p帧改成I帧吗?

感谢您的阅读!

这在一般情况下是不可能的,但在特定情况下可能会发生。即便如此,也没有开源/免费的工具可以做到这一点,我也不知道有任何商业工具。我说这在一般情况下是不可能的,因为每个帧最多可以引用16个其他帧。所以你不能只替换一个框架,你需要替换所有被引用的框架。这样做可能需要几乎与编码整个GOP一样多的CPU。