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

时间:2015-12-08 15:04:22

标签: c++ ffmpeg h.264

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

当我收到一个avpacket时,我会解码它,并做一些事情并缓存avpacket。我不想重新编码所有的avpacket,它花费了cpu资源。

H.264流中有很多gop structure,通常我们应该在关键帧处切换视频,并在关键帧结束。否则视频剪辑中的前面一些帧会显示错误。

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

我该怎么办?我想我应该在视频剪辑的起始位​​置插入一个i帧。我可以将p帧更改为i帧吗?

感谢您的阅读!

1 个答案:

答案 0 :(得分:0)

这在通用案例中是不可能的,但可能在特定情况下。即使这样,也没有开源/免费工具可以做到这一点,我不知道任何商业工具。我在通用情况下说不可能的原因是每个帧最多可以引用16个其他帧。因此,您不能只替换单个帧,您将需要替换所有引用的帧。这样做可能需要几乎与编码整个GOP一样多的CPU。