我有一个实时视频流,想通过准确的时间戳(pts)从中剪切一些视频片段。
当我收到一个 avpacket 时,我对其进行解码,然后做一些事情并缓存 avpacket。我不想重新编码所有 avpackets,它会占用 cpu 资源。
有很多gop structure在H.264码流中,通常我们应该把视频从关键帧开始,到关键帧结束。否则视频片段中的前几帧会显示错误。
现在我使用 av_write_frame将 avpacket 制作成视频。但有时gop的长度很长,比如250、8.3s(每秒30帧)。这意味着两个 I 帧之间的距离可以是 250 帧。视频剪辑很短,我不想添加太多未使用的帧。
我该怎么办?我想我应该在视频剪辑的开始位置插入一个 i 帧。我可以将 p 帧更改为 i 帧吗?
感谢您的阅读!
最佳答案
这在一般情况下是不可能的,但在特定情况下可能是这样。即便如此,也没有开源/免费工具可以做到这一点,而且我不知道有任何商业工具。我说在一般情况下不可能的原因是每个帧最多可以引用 16 个其他帧。所以你不能只替换单个帧,你需要替换所有引用的帧。这样做可能会占用几乎与编码整个 GOP 一样多的 CPU。
关于c++ - 如何在 ffmpeg C++ api 中将关键帧 (Iframe) 插入到 h.264 视频流中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34159193/