【发布时间】: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。
-
谢谢,您的链接答案(转储比特流,然后重新打包)有效(并且比我在搜索时找到的其他解决方案要简单得多)。仍然希望在编码时有办法做到这一点,但这就足够了。