我使用ffmpeg将一组图像编码为一个简短的timelapse视频,使用的是libx264编解码器。我的第一次尝试是以每秒30帧的速度对其进行编码,使用:
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不会在较长的verison中复制帧,我检查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不应如此,但可能我误解了这一点)。