c++ - 从 P 和 B 帧中创建 I 帧
问题描述
我编写了一个基于 FFMpeg 的 C++ 转换器,它可以接收指向 hls-stream 的链接并将其转换为本地 .mp4 视频。到目前为止,一切都很好,转换器就像一个魅力,毫无疑问。
问题:无论我向转换器提供什么输入源,在转换结束时,我只需要接收带有关键帧的视频。由于完美的正向和反向搜索,我需要这样的视频。
众所周知,子视频帧(P 和 B)依赖于它们的所有者帧(I 帧),因为该帧包含全像素图。据此,我们可以通过将它们的数据与它们的 I 帧合并来为每个 P 和 B 帧重新创建一个 I 帧。这就是为什么这样的 ffmpeg 命令ffmpeg -i video.mp4 output%4d.jpg
有效的原因。
问题:如何实现帧合并算法,以便在最后重新创建仅关键帧的视频?关于合并 s 的数据,我需要知道什么样的怪癖AVPacket
?
谢谢。
解决方案
您不能“合并”压缩流的 P 和 B 帧(例如,使用 H.264 编解码器)以获得 I 帧。
ffmpeg 是做什么用的
ffmpeg -i video.mp4 output%4d.jpg
正在解码每一帧(因此它需要从 I 帧开始,然后解码流中所有后续的 P 和 B 帧),并将它们压缩回 JPEG 并为原始输入流中的每一帧输出一个 JPEG 图像。
如果要将带有 P/B 帧的输入流转换为仅内部流(带有所有 I 帧),则需要对流进行转码。这意味着解码原始流中的所有帧并将它们编码回仅内部流。
推荐阅读
- python - NameError 问题:未定义名称“vor”
- ffmpeg - 合并两个命令
- r - 查找非连续观察之间的滞后
- ios - dequeueReusableCell (withIdentifier identifier: String, for indexPath: IndexPath) 在每次调用时返回 2 个不同的单元格
- python - 使用 python 访问受密码保护的网络文件夹
- java - 逐行写入文本文件
- python - 为什么我的 Python 列表在每个元素在 for 循环中发生变异后包含相同的元素?
- snmp - 使用 net-snmp 5.8,当使用特殊字符(&、^、$)作为加密密钥和身份验证密钥时,swnpwalk 远程调用失败
- algorithm - 最大价值决策
- raspberry-pi - 微芯片上的那些黑点是什么?