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