使用 ffmpeg 实现恒定视频比特率

使用 ffmpeg 实现恒定视频比特率

我们使用 ffmpeg 和转码脚本进行转码,并想制作一些可以用于转码的批处理文件。

例如,我使用一个名为的参数video_kbit,如果我写入 30000,它应该达到 30 Mbit。当然,如果我使用6000参数,它也应该达到 6 MBit,所以我有一个脚本可以达到我想要的每个视频比特率。

就我现在的设置而言,我只能达到 18.1 Mbit。只有当我使用 15000 作为参数时,我才能达到恒定视频比特率为 15 MBit 的目标。如果我使用 8000 作为参数,我得到的结果是 10.1 MBit。因此,低于 15000,我得到的比特率较高,而高于 15000,我得到的比特率低于我想要的比特率。

我的预设是:

ffmpeg -threads "4" -i "$2"  -f mp4 -c:v libx264 -crf 1 \
-bufsize 30000k -maxrate ${FC_PARAM_video_kbit}k \
-acodec libfaac -ac 2 -ab ${FC_PARAM_audio_kbit}k -ar 44100 \
-pix_fmt yuv420p -vf scale=${FC_PARAM_width}:${FC_PARAM_height} -y "$3"

我正在使用这些参数:

FC_PARAM_video_kbit = 30000
FC_PARAM_audio_kbit = 192
FC_PARAM_width = 1920
FC_PARAM_height = 1080

我尝试过使用更高的 bufsize 和profile:v级别设置,但没有什么能让我接近 30000 Mbit 的恒定视频比特率。

你们有什么想法或建议可以帮助我更好地实现我的目标吗?

答案1

设置CRF(恒定质量模式) 和视频比特率同时存在是没有意义的。您只需要其中之一。

为了实现固定比特率,你必须设置 minratemaxrateb:v设置为相同的值。您的脚本看起来应该像这样(但理想情况下您也会进行更改bufsize):

ffmpeg -threads "4" -i "$2" -c:v libx264 \
-bufsize 30000k -maxrate ${FC_PARAM_video_kbit}k \
-minrate ${FC_PARAM_video_kbit}k -b:v ${FC_PARAM_video_kbit}k \
-c:a libfaac -ac 2 -b:a ${FC_PARAM_audio_kbit}k -ar 44100 \
-pix_fmt yuv420p -filter:v scale=${FC_PARAM_width}:${FC_PARAM_height} -y "$3"

但话又说回来,这有意义吗?问题是你真正需要实现什么。当高比特率无法提供更好的视觉质量(并且只会增大文件大小)时,强制使用高比特率几乎没有意义。对于 x264 视频,即使是 1080p 高清内容,要求 30 MBit/s 对我来说似乎有点过头了。*

如果您将 CRF 设置得足够低,x264 就能提供非常好的质量。任何低于 17 或 18 的值在视觉失真方面都应不明显,而 CRF 为 0 则表示无损编码。最好将 CRF 设置为对您来说足够好的值,而不必担心比特率。它实际上是一种设置后就忘掉的选项,您可以将其应用于批量视频以实现类似的质量输出。

最后,不要忘记,如果说一秒钟的视频可以无损压缩(即使用 CRF 0)到仅 10 MBit,那么将比特率设置为 30 MBit/s 不会迫使这部分视频实际消耗 30 MBit。x264 不会“创建”信息只是为了将输出膨胀到请求的比特率。它将保持在 10 MBit。

* 如果您想要存档或分发视频以进行进一步处理,请选择中间编解码器,如 ProRes 或 DNxHD。

相关内容