我已经写了一个基于FFMpeg的C++转换器,它可以接收到hls-stream的链接并将其转换为本地.mp4视频。到目前为止,效果如此之好,转换器的运行就像一个魅力,对此毫无疑问。

问题:不管我提供给转换器的输入源是什么,在转换结束时,我只需要接收具有关键帧的视频即可。由于完美地寻求前进和后退,我需要这样的视频。

众所周知,辅助视频帧(P和B)取决于其所有者帧(I帧),因为该帧包含完整的像素图。据此,我们可以通过将它们的数据与它们的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帧),则需要将该流 transcode 转换为。
这意味着对原始流中的所有帧进行解码,并将其编码回仅帧内流中。

关于c++ - 从P和B框架中创建I框架,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50345831/

10-11 17:58