如何将 HandbrakeCLI 选项转换为 FFmpeg 选项?

iLe*_*ing 16 handbrake ffmpeg video-encoding

我有一堆适用于手刹的命令行设置,但有时在某些视频上(我不知道为什么)手刹会抛出“内存不足异常”。我想知道我是否可以找到相同的选项键并使用 FFmpeg 来完成,但这似乎并不容易。

FFmpeg 有时要么没有这些选项,要么默认执行某些操作。例如,我不知道如何使用 FFmpeg 进行自定义变形。对我来说非常重要的是,生成的视频将与使用手刹完成的视频一样好。这是Handbrake的线路:

HandBrakeCLI.exe --input "d:\input.mpg" --output "d:\output.mp4" --rate 29.97 --cfr --arate 44.1 --format mp4 --width 1920 --height 1080 --custom-anamorphic --display-width 1920 --keep-display-aspect --modulus 8 --crop 0:0:0:0 --encoder x264 --vb 5200 --aencoder faac --ab 128 --mixdown stereo -x bitrate=5200:vbv-bufsize=5200:vbv-maxrate=5200:level=42:bframes=2:min-keyint=60:keyint=60:ref=4:me=umh:merange=64:subme=7:8x8dct:cabac=1  -v3 -2 -a none
Run Code Online (Sandbox Code Playgroud)

如何将其转换为 FFmpeg 命令?

slh*_*hck 23

Handbrake 使用 x264 编码器进行视频转换。有一个站点概述了所有 x264 选项及其 FFmpeg 对应项。但是,这些选项有点过时,其中一些选项不再起作用或可能已重命名。对于大多数细节选项,您应该使用 x264 配置文件 - 但我们会到达那里。

许多基本的手刹选项(例如帧速率)并非特定于 x264,它们分散在FFmpeg 在线文档中

在我们开始之前,请检查您是否使用了最新的 FFmpeg 版本。他们的下载站点有适用于所有主要操作系统的静态版本。

我们走吧:

  • --input "d:\input.mpg" --output "d:\output.mp4"

    FFmpeg 语法是ffmpeg -i input.mpg … d:\output.mp4.

  • --rate 29.97

    用 指定视频帧率-r 29.97。(Handbrake--cfr只是设置一个恒定的帧速率。这里不需要)。

  • --arate 44.1

    使用-ar 44100(以赫兹为单位)设置音频采样率。

  • --format mp4

    不需要,因为 FFmpeg 知道您想要 MP4。

  • --width 1920 --height 1080 --custom-anamorphic --display-width 1920 --keep-display-aspect --modulus 8 --crop 0:0:0:0

    除了将大小设置为 1920×1080 之外,这没有任何作用。在 FFmpeg 中,使用-s:v 1920x1080,或者如果您想使用过滤器,-filter:v "scale=1920:1080".

  • --encoder x264 --vb 5200

    将编码器设置为 ,-c:v libx264并将比特率设置为常数-b:v 5200K。请注意,我们还没有谈到质量设置。

  • --aencoder faac --ab 128 --mixdown stereo

    与上面类似,使用-c:a libfaac -b:a 128K -ac 2. 请注意,FFmpeg 不再支持 FAAC;相反,使用内置的 FFmpeg 编码器-c:a aac -b:a 128K代替。

  • -x bitrate=5200:vbv-bufsize=5200:vbv-maxrate=5200

    这将编码模式设置为VBV,它针对流场景,而不仅仅是恒定比特率或恒定质量。恒定质量也称为CRF,这是 x264 的默认设置——它在 Handbrake 中称为“Rate Factor”。虽然 CRF 通常为您提供最佳质量的编码,但 VBV 模式为您提供更适合在线流式传输或某些功能有限的设备的文件。

    要设置 VBV,请使用ffmpeg 中的-maxrate 5200K-bufsize 5200K选项。

    要设置 CRF,请-crf 23在 ffmpeg 中使用。

  • level=42

    使用-level 42. 这是H.264 级别

  • bframes=2:min-keyint=60:keyint=60:ref=4

    用 设置 B 帧的数量-bf 2。最小关键帧间隔设置为-keyint_min 60,最大间隔设置为-g 60。参考图片的数量用 设置-refs 4

  • me=umh:merange=64:subme=7:8x8dct:cabac=1

    这些是您可以在 ffmpeg 中额外设置的选项-x264-params me=umh:merange=64:subme=7:8x8dct:cabac=1- 就像任何其他未直接映射到 ffmpeg 选项的 x264 编码器设置一样。

    这是“TL;DR”版本,如果你很懒惰,不关心细节,或者如果事情不起作用:使用-preset:v medium(或省略它,因为中等预设是默认的)。x264 预设选择一组选项,这些选项以编码速度换取压缩效率。他们方便地从命名ultrafastsuperfastveryfastfasterfastmediumslowslowerveryslow。选择你觉得舒服的任何东西。

所以,总而言之,长版本:

ffmpeg -i input.mpg -c:v libx264 -r 29.97 -s:v 1920x1080 -b:v 5200K -maxrate 5200K -bufsize 5200K -level 42 -bf 2 -keyint_min 60 -g 60 -refs 4 -x264-params me=umh:merange=64:subme=7:8x8dct:cabac=1 -c:a aac -b:a 128K -ar 44100 d:\output.mp4
Run Code Online (Sandbox Code Playgroud)

或者我会使用的简短代码(删除了 VBV 编码和一些细节选项):

ffmpeg -i input.mpg -c:v libx264 -r 29.97 -s:v 1920x1080 -b:v 5200K -maxrate 5200K -bufsize 5200K -c:a aac -b:a 128K -ar 44100 d:\output.mp4
Run Code Online (Sandbox Code Playgroud)

更改为用于通用转换的恒定质量编码,使用它并将-crf参数从 18更改为 28,其中较低意味着更好的质量,默认值为 23:

ffmpeg -i input.mpg -c:v libx264 -r 29.97 -s:v 1920x1080 -crf 23 -c:a aac -b:a 128K -ar 44100 d:\output.mp4
Run Code Online (Sandbox Code Playgroud)