我编写了一个基于FFMpeg的C ++转换器,它可以接收到hls-stream的链接并将其转换为本地.mp4视频。到目前为止,这么好,转换器就像一个魅力,没有任何问题。
问题:无论我向转换器提供什么输入源,在转换结束时我都需要只接收带有关键帧的视频。由于完美的向前和向后搜索,我需要这样的视频。
众所周知,辅助视频帧(P和B)依赖于其所有者帧(I帧),因为该帧包含全像素映射。据此,我们可以通过将它们的数据与它们的I帧合并,为每个P和B帧重新创建一个I帧。这就是为什么这样的ffmpeg命令ffmpeg -i video.mp4 output%4d.jpg
有效。
问题:如何实现合并帧的算法,以便最后只重新创建关键帧视频?关于合并AVPacket
s的数据需要知道什么样的怪癖?
感谢。
答案 0 :(得分:2)
你不能"合并"压缩流的P帧和B帧(例如,使用H.264编解码器),以获得I帧。
ffmpeg用
做什么ffmpeg -i video.mp4 output%4d.jpg
正在解码每个帧(因此它需要从I帧开始,然后解码流中的所有后续P帧和B帧),并将它们压缩回JPEG并输出原始帧中每个帧的JPEG图像输入流。
如果要将具有P / B帧的输入流转换为仅限内部流(包含所有I帧),则需要 transcode 该流。 这意味着解码原始流中的所有帧并将它们编码回仅限内部流。