Handbrake 使用 CLI 进行批量转换

Handbrake 使用 CLI 进行批量转换

使用 GUI 工具总是会崩溃,所以我想出了一个命令来根据需要转换文件。它采用我在 GUI 中创建的预设并转换文件。

我有许多需要转换的视频,想知道是否可以使用某种脚本进行批量转换,该脚本读取文件夹中的所有 .MOV 视频并使用我提供的命令将它们转换为 .mp4。

我正在运行 Windows 10。

这是我的命令,我正在使用夜间构建:

HandBrakeCLI.exe --preset-import-file "preset-name.json" -Z "preset-name" -i video.MOV -o video.mp4

已编辑,要求更清晰。

答案1

好的,我猜你有一堆文件,比如

ant.mov
bug.mov
cat.mov
dog.mov

在目录(又称文件夹)中,你想执行

HandBrakeCLI 工具  (等等等等等等)  -i 蚂蚁.MOV -o 蚂蚁.mp4
HandBrakeCLI.exe … … -i bug.MOV -o bug.mp4
HandBrakeCLI.exe … … -i cat.MOV -o cat.mp4
HandBrakeCLI.exe … … -i dog.MOV -o dog.mp4

对所有*.mov文件执行此操作。这相当简单:

对于 (*.mov) 中的 %F,请执行 HandBrakeCLI.exe  (等等等等等等)  -i “%F” -o “%〜nF.mp4”

运行for %F in (*.mov)一个循环,其中%F接受每个适用的名称。然后对每个文件执行*.mov后面的命令,其中显然被文件名替换。(注意:区分大小写。)(您可能可以不使用引号 — 即说do%F.movF只是 %F,而不是"%F"——但是如果你的文件名中有空格或其他特殊字符,它就会失败。)  %~nF被替换为n文件名的一部分(不包括扩展名),因此%~nF.mp4成为输出文件名。

你可能想把它分成多行,因为你的实际命令太长,和/或因为你想在循环中做其他事情。你可以用括号来做到这一点:

对于(*.mov)中的%F,执行(
    HandBrakeCLI 工具  (等等等等等等)  -i “%F” -o “%〜nF.mp4”
    (其他命令以"%F", "%~nF",ETC。)

键入for /?以查看所有代码的列表~。(例如,%~dF为您提供驱动器号,并 %~pF为您提供路径。文档没有明确说明您可以组合修饰符;例如,%~dpnF为您提供驱动器、路径和名称,但不提供扩展名 — 就像您键入了 一样%~dF%~pF%~nF。)

您还可以使用以下命令将长命令拆分为多行^

对于(*.mov)中的%F,执行(
    HandBrakeCLI.exe --preset-import-file“预设名称.json”^
                      -Z“预设名称”-i“%F”-o“%~nF.mp4”
   (其他命令以"%F", "%~nF",ETC。)

以上所有操作均可在命令提示符(命令行)下进行。批处理脚本中也同样如此,只不过必须将每个操作替换%%%

对于 (*.mov) 中的 %%F 执行(
    HandBrakeCLI.exe --preset-import-file“预设名称.json”^
                      -Z“预设名称”-i“%%F”-o“%%~nF.mp4”
   (其他命令以"%%F", "%%~nF",ETC。)

这已经在 Windows 7 上测试过了,但如果它在 Windows 10 上不起作用,我会感到非常惊讶。

答案2

如果您要将相同文件类型从原始 mkv 文件 (MakeMKV rip) 转换为压缩 mkv 文件,我想对此进行一些补充。上面的代码非常适合查看一个文件,然后转换为另一个文件。我发现的其他代码类似,我从他们的网站复制了它:

FOR /F "tokens=*" %%G IN ('DIR /B /S *.avi') DO "C:\Program Files\Handbrake\HandBrakeCLI" -i "%%G" -o "%%G".mp4 --preset="iPad"

然而,这在转换 .mkv --> .mkv 时没有帮助。通过反复试验,我发现您需要删除/S目录命令中的,以便它仅记录文件名而不是整个路径%%G

这是我用来提取用户配置文件并将编码发送到不同文件夹的代码:

FOR /F "tokens=*" %%G IN ('DIR /B *.mkv') DO "C:\Program Files\Handbrake\HandBrakeCLI" --preset-import-gui -Z "name of user preset" -i "%%G" -o "D:\Users\jeff\Videos\Path\To\File\%%G"
pause

注意事项:

  1. 预设的名称区分大小写,无论是您自己的还是内置的。
  2. 如果使用内置预设,则无需--preset-import-gui在代码中
  3. 确保变量后面有引号,-i如 so -i "%%G"。正如上面的评论者所述,这将允许使用名称中带有空格的文件而不会出现错误。

将您需要的代码复制到文本文件中,然后将该文件保存为要转换的电影目录中的.bat 文件。

我希望这可以帮助您在一次转换大量具有不同名称的文件时节省时间。

答案3

所有子文件夹都导出到您运行程序的文件夹中

FOR /R %G IN (*.mp4) DO "C:\Program Files\HandBrake\CLI\HandBrakeCLI" -Z "Very Fast 720p30" -i "%~G" -o "%~nG-resized.mp4"

每个文件夹中的所有子文件夹均找到 mp4,并使用 -resized 导出到同一文件夹中

FOR /R %G IN (*.mp4) DO (
    "C:\Program Files\HandBrake\CLI\HandBrakeCLI" -Z "Very Fast 720p30" -i "%~G" -o "%~dpnG-resized.mp4"
)

仅当位于相机文件夹中时,每个同一文件夹中的所有子文件夹

for /r /d %i in (Camera) do (
    for %j in ("%i\*.mp4") do (
        "C:\Program Files\HandBrake\CLI\HandBrakeCLI" -Z "Very Fast 720p30" -i "%~j" -o "%~dpnj-resized.mp4"
    )
)

仅当在相机文件夹中时,每个同一文件夹中的所有子文件夹才会跳过 - 调整大小

for /r /d %i in (Camera) do (
    for %j in ("%i\*.mp4") do (
        echo "%~nj" | find /i "-resized" > nul || (
            "C:\Program Files\HandBrake\CLI\HandBrakeCLI" -Z "Very Fast 720p30" -i "%~j" -o "%~dpnj-resized.mp4"
        )
    )
)

相关内容