c++ - 从 P 帧和 B 帧创建 I 帧

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

我编写了一个基于 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 帧),则需要 transcode 流。 这意味着解码原始流中的所有帧并将它们编码回仅内部流。

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

相关文章:

ios - 如何在 iOS 中将命令行参数传递给 FFMpeg

android - 将带有 amr_nb 音频编解码器的 .mov 包装器转换为 aac/mp4a 编解码器

c - 将 alpha channel 写入解码的 ffmpeg 帧

c++ - 基于另一个 vector c++中相似性的 vector 的条件平均

c++ - GetTokenInformation 与 TokenGroups

c# - 用于视频播放的 .NET FFmpeg 包装器

php - 带有区域限制的YouTube流fmt_stream_map错误

c++ - 缓冲的 MySql 连接器 C++ 结果集

c++ - 为什么 C++ 模板定义需要在标题中?

video - 如何通过多个帧号修剪视频然后使用 FFMPEG 连接