从 P 和 B 帧创建 I 帧

Create I Frame out of P and B frames

本文关键字:创建      更新时间:2023-10-16

我写了一个基于 FFMpeg 的C++转换器,它可以接收到 hls-stream 的链接并将其转换为本地.mp4视频。到目前为止,一切都很好,转换器就像一个魅力,毫无疑问。

问题:无论我向转换器提供什么输入源,在转换结束时,我只需要接收带有关键帧的视频。我需要这样的视频,因为完美的正向和反向搜索。

众所周知,附属视频帧(P 和 B(依赖于其所有者帧(I 帧(,因为此帧包含全像素映射。据此,我们可以通过将 P 和 B 帧的数据与其 I 帧合并来为每个 P 和 B 帧重新创建一个 I 帧。这就是为什么这样的 ffmpeg 命令ffmpeg -i video.mp4 output%4d.jpg工作的原因。

问:如何实现帧合并算法,以便在最后重新创建仅关键帧视频?关于合并AVPacket的数据,我需要了解哪些怪癖?

谢谢。

您不能"合并"压缩流的 P 和 B 帧(例如使用 H.264 编解码器(来获取 I 帧。

ffmpeg 做什么

ffmpeg -i video.mp4 output%4d.jpg

正在解码每个帧(因此它需要从 I 帧开始,然后解码流中所有后续的 P 和 B 帧(,并将它们压缩回 JPEG 并为原始输入流中的每个帧输出 JPEG 图像。

如果要将包含 P/B 帧的输入流转换为仅内部流(包含所有 I 帧(,则需要对流进行转码。 这意味着解码原始流中的所有帧,并将它们编码回仅内部流。