我正在使用 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 不应该受到影响,但也许我误解了它。
最佳答案
CRF 模式旨在在其编码输出中获得并保持一定的质量水平。如果要以 25 fps 显示同一组帧,则每帧的持续时间为 40 毫秒,观众将无法完全欣赏 transient 特征。 x264/x265 等编码器将更积极地优化这些帧。 OTOH,如果以 2 fps 显示,每帧可见半秒,因此在保留感知质量方面没有多少余地。
对于 x264,这是实现该逻辑的 commit 的消息。
VFR/帧率感知速率控制,第 2 部分
关于ffmpeg - 使用libx264压缩一组图像时,为什么帧率会影响最终输出大小?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49620592/