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


12

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

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

Answers:


12

您可以编写一个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"
}

没有任何GUI选项吗?关于该Windows脚本示例;如果$ title不是数字怎么办?我不确定该代码做什么。关心解释?
新秀

1
GUI选项:是,有:添加到队列->全部添加。但是,它被标记为(实验性),并且在我尝试时不起作用。
Grilse

$ title不是数字:$ title将始终是数字。这就是DVD的工作方式。说明:好吧,这是一个从1到4计数的for循环,对于每个计数,它都使用一些参数执行HandBrakeCLI.exe。查看“ HandBrakeCLI.exe --help”以查看参数的含义。
Grilse

不知道您还想知道什么。问一些具体的问题,我会回答。
Grilse

谢谢,现在我更了解了。因此,所有这些仅涉及命令行参数,我可以做到!
新秀

3

根据Grilse的回答:

该脚本不使用固定数量的标题,但可以通过手刹确定它们。

#!/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

值得注意的是,如果您希望该计数值正确,则需要将--min-duration 0传递给HandBrakeCLI,否则,您在一些DVD光盘上会显得很短。例如,我的测试DVD有10秒的轨道1,在最终输出中将忽略该轨道。
卡塔尔

2

加上一点点的盐,这是我想出的Python脚本,分为几章。该数字是自动提取的。

注意:

  1. 您需要Handbrake CLI(当前可在此地址获得:https : //handbrake.fr/downloads2.php
  2. 您需要在PATH中拥有Handbrake CLI的安装文件夹

您只需要使用DVD的位置作为脚本的参数来调用以下Python脚本。

#!python

import os
import subprocess
import re
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'.*[/\\]', r'', dvd).rstrip('/').rstrip('\\')

s = subprocess.Popen(
        f'HandBrakeCLI -i "{dvd}" -t 0', stdout=subprocess.PIPE, stderr=subprocess.STDOUT
    )
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 = f'HandBrakeCLI --input {dvd} --title {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}"')

0

通过CLI在Linux Ubuntu中提取文件效果很好。我在下面使用的这一行重复了所给出的语法,并做了一些放大,以增强MPEG-4和质量。如果需要字幕,我认为需要扩展命令行(CLI)参数和参数。

patty@patty:~$ for i in `seq 4`; do HandBrakeCLI -i /media/patty/DVDTITLE -t $i -o DVDTITLE_Title$i.mp4 -e x264 -q 18; done

0

该生产线count=$(echo $rawout | grep -Eao "\\+ title [0-9]+:" | wc -l)从@ForestPhoenix当第一章是超过10秒小不起作用。

这是代码的改进:

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

1
欢迎使用超级用户。请访问superuser.com/Tour进行游览,以充分利用本网站。关于这个答案,我建议当问题是英语时,您能用英语回答吗?我看到您写的第一条命令->在第一项少于10秒时不起作用。然后您展示了什么是“更好的”
SDsolar

@SDsolar:我试图翻译,因为这个答案是建设性的。我14年前停止学习德语,所以我希望我不要误译:)
Jean-Francois T.

-1

您可以将任务添加到队列中

从链接2

只需继续更改标题,章节或使用中的来源,并确保重命名目标文件即可。调整所需的任何设置。然后单击工具栏上的“添加到队列”按钮。对您要转换的整个视频重复这些步骤。

一些评论说,他们在覆盖以前的文件时遇到问题。因此,您必须确保正确命名它们。确保一些工作,然后再运行。


添加到队列并不能消除重复的问题:我需要单击以选择下一个标题,更改分辨率,单击“添加队列”,然后重复。我想要的是简单地一次用完全相同的设置转换所有标题。这似乎仅适用于各章
新秀2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.