【问题标题】:When compressing a set of images with libx264, why does frame rate affect final output size?使用 libx264 压缩一组图像时,为什么帧速率会影响最终输出大小?
【发布时间】:2018-09-12 05:17:07
【问题描述】:

我正在使用 ffmpeg 使用 libx264 编解码器将一组图像编码为短延时视频。我的第一次尝试,我以 30 FPS 编码,使用:

ffmpeg -r 30 -pattern_type glob -i "*.jpg" -vcodec libx264 -crf 30 -pix_fmt yuv420p output.mp4

60 帧,这给了我一个 2 秒长的 163 KB 文件。然后我意识到我需要它更慢,所以我重新运行了相同的命令,但将 -r 更改为 2。现在我有一个 30 秒长的文件,但大小跳到了 891 KB!视频质量在感知上看起来是一样的。

如何以较慢的帧速率进行编码,而不会使最终文件大小膨胀?


笔记:我的一些理论,以及我检查过的东西。首先,为了确保 ffmpeg 在较长的版本中没有重复帧,我检查了 I/P/B 计数。 30 FPS 文件有:

[libx264 @ 0x7f9b26001c00] frame I:1     Avg QP:30.67  size: 44649
[libx264 @ 0x7f9b26001c00] frame P:15    Avg QP:31.19  size:  5471
[libx264 @ 0x7f9b26001c00] frame B:44    Avg QP:31.45  size:   767

2 FPS 文件有:

[libx264 @ 0x7fcd32842200] frame I:1     Avg QP:21.29  size: 90138
[libx264 @ 0x7fcd32842200] frame P:15    Avg QP:22.48  size: 33686
[libx264 @ 0x7fcd32842200] frame B:44    Avg QP:26.29  size:  6674

因此,I/P/B 计数相同,但 2 FPS 文件的 QP 低得多。为了抵消,我尝试为 2 FPS 文件增加 -crf 以获得大致相同的目标大小,但这只是给了我一个非常模糊的视频(必须转到 crf = 40)。我试着弄乱-minrate,-maxrate,-bt,没有帮助。我猜有一些 x264 编解码器设置取决于帧速率,但我不知道是哪一个(据我了解,恒定比特率受帧速率影响,但 CRF 不应该,但也许我误会了。

【问题讨论】:

  • this answer 可以为您提供线索。作为一种解决方法,您可以强制 ffmpeg 重建文件 changing the timestamps only
  • 谢谢,您的链接答案(转储比特流,然后重新打包)有效(并且比我在搜索时找到的其他解决方案要简单得多)。仍然希望在编码时有办法做到这一点,但这就足够了。

标签: ffmpeg h.264 libx264


【解决方案1】:

CRF 模式旨在在其编码输出中获得并保持一定的质量水平。如果要以 25 fps 的速度显示同一组帧,则每个帧的持续时间为 40 毫秒,并且观看者将无法完全理解瞬态特征。像 x264/x265 这样的编码器会更积极地优化这些帧。 OTOH,如果以 2 fps 显示,每帧可见半秒,因此在保持感知质量方面的余地较小。

对于 x264,这是实现该逻辑的 commit 的消息。

VFR/帧率感知速率控制,第 2 部分

MB-tree 和 qcomp 复杂度 估计现在在他们的计算中考虑一帧的持续时间。 这对于视觉优化非常重要,因为帧持续 更长的时间本质上在质量方面更重要。提高 VFR 感知能力 PSNR 在极端测试用例高达 1-2db,在更普通的测试用例约为 0.5db VFR 剪辑(例如重复数据删除的动漫剧集)。

警告:此更改重新定义了 x264 的内部质量测量。 x264 现在将根据视频的帧速率缩放其质量 由于上述帧持续时间逻辑。也就是说, --crf X 将 60fps 视频的每帧质量低于 30fps 视频。 这将使 --crf 更接近于恒定的感知质量而不是 之前。此更改的“中心”是 25fps:即视频 在相同的 CRF 和视频中,低于 25fps 的质量会提高 上面会下降。这种选择完全是任意的。

请注意,要充分利用这一点,x264 必须对您的视频进行编码 以正确的帧速率和正确的时间戳。

【讨论】:

  • 有趣,说得通。那么,我该如何解决呢?我看不到无需重新编码即可更改帧速率的简单方法。我尝试增加 CRF,但在相同的文件大小下无法获得相同的质量。
  • 你需要 mp4box 来做到这一点。 第 1 步ffmpeg -framerate 30 -pattern_type glob -i "*.jpg" -c:v libx264 -crf 30 -pix_fmt yuv420p output.264 第 2 步mp4box -add output.264 -fps 2 output.mp4 可以使用 ffmpeg ffmpeg -r 2 -i output.264 -c copy output.mp4 执行第 2 步,但对于具有 B 金字塔的流,时间戳生成是错误的。
  • 谢谢,我尝试了 Alex Cohn 的链接答案来做基本相同的事情,但它只有两个 ffmpeg 命令(并且对于我生成的文件工作正常)。接受您的回答,因为您实际上解释了它发生的原因。
猜你喜欢
  • 2010-10-05
  • 1970-01-01
  • 2013-10-18
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2015-11-25
相关资源
最近更新 更多