如何使用 HandBrake 轻松地将 DVD 中的 50 集转换为 50 集 .mp4?

如何使用 HandBrake 轻松地将 DVD 中的 50 集转换为 50 集 .mp4?

我加载了一张包含 50 集的 DVD(从程序中选择了 VIDEO_TS),现在当我在 HandBrake 中打开它时,它显示其中有 50 个“标题”。我选择 320x240 输出格式并开始转换。然后我单击下一个标题,重复同样的操作,50 次。

有什么办法可以加快速度吗?因为当我单击下一个标题时,它不记得我的设置。我试图进行预设,但每次我从预设列表中选择它时它都会崩溃。

答案1

您可以编写 shell 脚本来调用HandBrakeCLI每个标题。

Linux(来源):

$ for i in `seq 4`; do HandBrakeCLI --input /dev/dvd --title $i --preset Normal --output NameOfDisc_Title$i.mp4; done

Windows PowerShell:

for ($title=1; $title -le 4; $title++) {
    &"C:\program files\handbrake\HandBrakeCLI.exe" --input D:\ --title $title --preset Normal --output "$title.mp4"
}

答案2

根据 Grilse 的回答:

该脚本不使用固定数量的标题,而是让 handbrake 确定它们。

#!/bin/bash
rawout=$(HandBrakeCLI -i /dev/dvd -t 0 2>&1 >/dev/null)
#read handbrake's stderr into variable

count=$(echo $rawout | grep -Eao "\\+ title [0-9]+:" | wc -l)
#parse the variable using grep to get the count

for i in $(seq $count)
do
    HandBrakeCLI --input /dev/dvd --title $i --preset Normal --output $i.mp4
done

答案3

这是我根据自己的理解编写的 Python 脚本,用于将章节分成几部分。编号会自动提取。

注意:

  1. 你需要Handbrake 命令行界面(目前可从以下地址获取:https://handbrake.fr/downloads2.php
  2. 你需要在你的小路

您只需要调用以下 Python 脚本,并将 DVD 的位置作为脚本的参数(类似于python episodes_splitter.py "path of my folder")。

import os
import re
import subprocess
import sys

# Ugly but simple way to get first argument = folder with DVD
# We will get DVD name by removing all / and \
dvd = sys.argv[1]
dvd_name = re.sub(r'.*[/\\]', '', dvd).rstrip('/').rstrip('\\')

s = subprocess.Popen(
        ['HandBrakeCLI', '-i', dvd, '-t', '0'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT
)

if not s.stdout:
    print(f'ERROR: Could not open "{dvd}"!')
    sys.exit(1)

count = 0
for line in s.stdout:
    if re.search(rb"\+ title [0-9]+:", line):
        count += 1

print(f'==Extracting {count} chapters from "{dvd}"==')
for i in range(1, count+1):
    output = f"{dvd_name}_{i}.mp4"
    cmd = ['HandBrakeCLI', '--input', dvd, '--title', str(i), '--preset', 'Normal', '--output', output]
    log = f"encoding_{output}.log"
    with open(log, 'wb') as f:
        s = subprocess.Popen(cmd, stdout=f, stderr=subprocess.STDOUT)
        s.communicate()
    if not os.path.isfile(output):
        print(f'ERROR during extraction of "{output}"!')
    else:
        print(f'Successfully extracted Chapter #{i} to "{output}"')

答案4

当第一章少于 10 秒时,@ForestPhoenix 的话count=$(echo $rawout | grep -Eao "\\+ title [0-9]+:" | wc -l)不起作用。

这是代码的改进:

rohausgabe=$(HandBrakeCLI -i "$iso" -t 0 2>&1 >/dev/null)
anzahl=$(echo $rohausgabe | grep -Eao "scan: DVD has [0-9]" | awk -F " " '{print $4}')

相关内容