用P和B帧创建I帧

时间:2018-05-15 08:41:19

标签: c++ video ffmpeg video-streaming video-encoding

我编写了一个基于FFMpeg的C ++转换器,它可以接收到hls-stream的链接并将其转换为本地.mp4视频。到目前为止,这么好,转换器就像一个魅力,没有任何问题。

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

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

问题:如何实现合并帧的算法,以便最后只重新创建关键帧视频?关于合并AVPacket s的数据需要知道什么样的怪癖?

感谢。

1 个答案:

答案 0 :(得分:2)

你不能"合并"压缩流的P帧和B帧(例如,使用H.264编解码器),以获得I帧。

ffmpeg用

做什么
ffmpeg -i video.mp4 output%4d.jpg

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

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