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

标签 c++ ffmpeg h.264

我有一个实时视频流,想通过准确的时间戳(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/

相关文章:

c++ - 在一个函数中创建多个lock_guards

c++ - 未修复不完整类型的声明转发

h.264 - 包装 H.264 NALU 时的合成时间(CTS)

java - 使用 libffmpeg 时如何计算 AVPicture.data[x] 指针 (YUV420p) 的大小

c++ - 多维数组的函数

c++ - 为什么 std::as_const(T &&v) 不能移动返回它的参数?

bash - 使用 ffmpeg 的 bash 查找循环中的尴尬行为

ffmpeg rtp 流错误 : RTP: dropping old packet received too late

audio - 从传输流中提取音频并保留长度

video - H264 NAL 单元 header - 检测类型并以这种格式引入自定义视频