evon 发表于 2014-7-16 09:37:54

关于mkvtoolnix批量处理的经验分享

昨天见到@爱你BT 坛友求助mkvtoolnix的批量处理问题,相信很多坛友都有相同的问题,我就单独开贴,将自己的经验分享一下。

需要的工具:
mkvtoolnix、记事本

案例介绍:
用文件A的视频+文件B的音频+字幕合成新MKV,在文件列表中,按A、B、C顺序排列。其中A与B都是Mkv格式,所以A与B不能放在同一个文件夹中(就算不同名也不行),下面会解释。



步骤一:获取单次任务处理的命令行。
相信很多同学都知道了,看上图按UI下面中间的按钮就可以。然后新建记事本粘贴入去。将记事本后缀从TXT改成BAT,就成了一个批处理命令,直接双击运行就会自动调用mkvtoolnix执行任务。以下为案例的单次任务命令行。

@echo off
"C:\Program Files (x86)\mkvtoolnix\mkvmerge.exe" -o "E:\\DB_055_追到企鹅村.mkv""--language" "0:jpn" "--default-track" "0:yes" "--forced-track" "0:no" "--display-dimensions" "0:640x480" "--language" "1:chi" "--forced-track" "1:no" "-a" "1" "-d" "0" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "D:\\comic\\Dragon.Ball\\cc\\DB_055_追到企鹅村.mkv" ")" "--language" "0:chi" "--default-track" "0:yes" "--forced-track" "0:no" "-a" "0" "-D" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "D:\\comic\\Dragon.Ball\\aa\\DB_055_追到企鹅村.mkv" ")" "--language" "0:chi" "--forced-track" "0:no" "-s" "0" "-D" "-A" "-T" "--no-global-tags" "--no-chapters" "(" "D:\\comic\\Dragon.Ball\\aa\\DB_055_追到企鹅村.ssa" ")" "--track-order" "0:0,0:1,1:0,2:0"

大家睇到,命令行中有记录A、B、C文件的详细地址,出现的顺序分别为1.输出文件名,2.A文件名,3.B文件名,4.C文件名。可以简单归纳为先显示输出,然后显示输入(按输入列表的顺序)。

步骤二:将具体文件名变成变量。
为了让此批处理更有通用性,能重复使用,建议将一些具体名字变成变量。不考虑重复使用的同学可以不做这一步。以下将文件地址变成变更
@echo off
set topath="E:\\"
set frompath="D:\\comic\\Dragon.Ball\\cc\\"
set frompath1="D:\\comic\\Dragon.Ball\\aa\\"
"C:\Program Files (x86)\mkvtoolnix\mkvmerge.exe" -o "%topath%DB_055_追到企鹅村.mkv""--language" "0:jpn" "--default-track" "0:yes" "--forced-track" "0:no" "--display-dimensions" "0:640x480" "--language" "1:chi" "--forced-track" "1:no" "-a" "1" "-d" "0" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "%frompath%DB_055_追到企鹅村.mkv" ")" "--language" "0:chi" "--default-track" "0:yes" "--forced-track" "0:no" "-a" "0" "-D" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "%frompath1%DB_055_追到企鹅村.mkv" ")" "--language" "0:chi" "--forced-track" "0:no" "-s" "0" "-D" "-A" "-T" "--no-global-tags" "--no-chapters" "(" "%frompath1%DB_055_追到企鹅村.ssa" ")" "--track-order" "0:0,0:1,1:0,2:0"

步骤三:加入循环命令。
思路是,扫描frompath文件夹上的MKV文件,每扫描出一个就执行一次。所以如果两个源文件都是MKV,则不能都放在同一目录下。

@echo off
set topath="E:\\"
set frompath="D:\\comic\\Dragon.Ball\\cc\\"
set frompath1="D:\\comic\\Dragon.Ball\\aa\\"

pushd %frompath%
for /f "tokens=*" %%i in ('dir/b *.mkv') do call :merge %topath%%%~ni".mkv"   %frompath%%%i   %frompath1%%%i   %frompath1%%%~ni".ssa"
pause

:merge
"C:\Program Files (x86)\mkvtoolnix\mkvmerge.exe" -o "%1""--language" "0:jpn" "--default-track" "0:yes" "--forced-track" "0:no" "--display-dimensions" "0:640x480" "--language" "1:chi" "--forced-track" "1:no" "-a" "1" "-d" "0" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "%2" ")" "--language" "0:chi" "--default-track" "0:yes" "--forced-track" "0:no" "-a" "0" "-D" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "%3" ")" "--language" "0:chi" "--forced-track" "0:no" "-s" "0" "-D" "-A" "-T" "--no-global-tags" "--no-chapters" "(" "%4" ")" "--track-order" "0:0,0:1,1:0,2:0"

解释一下代码含义。
Pushd %frompath% :将扫描的文件夹定位在frompath

for /f "tokens=*" %%i in ('dir/b *.mkv') :扫描目标文件夹中后缀为mkv的文件,如果输入源是MP4,这里可以改成*.MP4。

do call :merge %topath%%%~ni".mkv" %frompath%%%i %frompath1%%%i %frompath1%%%~ni".ssa":每扫描出一个MKV文件则调用merge函数,后面用空格隔开的是函数的输入参数,%%i是扫描出来文件的带后缀文件名(不含路径信息),如DB_055_追到企鹅村.mkv。%%~ni是扫描出来文件的不带后缀文件名,如DB_055_追到企鹅村。案例中,字幕文件C与文件A同名,所以%%~ni“.ssa”就代表DB_055_追到企鹅村.ssa了。

%1、%2、%3、%4:对应函数merge的4个输入变量,按顺序排列。

步骤四:如何变成比较通用的批处理文件。
按步骤一得到新的命令行,替换掉Merge函数的内容。将里面涉及的变更改成%1、%2、%3、%4等。
变更Topath和Frompath的路径,如果有多个输入源路径,则新建多几个Frompath变更。
按输入源文件的情况,替代Merge函数的输入参数组成,新的批处理文件就此生成。

chrisrex 发表于 2014-7-16 10:32:33

呢个办法专业好多,不过对于初学者嚟讲会混乱啲........

evon 发表于 2014-7-16 10:54:32

chrisrex 发表于 2014-7-16 10:32
呢个办法专业好多,不过对于初学者嚟讲会混乱啲........

我已尽量不要求读者懂代码了,:(。只要懂得替换部分东西就OK了

alexz220 发表于 2014-7-16 11:07:12

其實放起同一目錄都得,可以張兩版視頻按一定規律批量重命名,然後利用字符串之類嘅命令自動獲取對應嘅兩個視頻作爲輸入,由於唔會帶黎几多方便,到目前爲止都無用過。
另一種辦法系批量改變其中一組視頻嘅擴展名,例如mkv變mp4或者avi。
如果本黎就系放起兩個文件夾入面,之前發過嘅教程應該就可以解決問題。

evon 发表于 2014-7-16 11:44:40

alexz220 发表于 2014-7-16 11:07
其實放起同一目錄都得,可以張兩版視頻按一定規律批量重命名,然後利用字符串之類嘅命令自動獲取對應嘅兩個 ...

如果文件的命名是规律的,固定文字+序列,确实可以用你讲的方法。但更复杂的一种情况是,文件名用了那一集的集名,因此无法固定文字。不同输入源只能用相同的名字来匹配,无法用规律重命的方式。当然可以先将集名命名用批量改名工具导出一份,改成固定字符串,转换后再重新命名翻

554968700 发表于 2014-7-16 11:45:05

睇到蒙查查! {:9_361:}

dkmi 发表于 2014-7-16 11:48:07

个软件,既制作方法 睇起来好似复杂左D。但系,就早就左好多既用途,比D心机制作吧,楼主。

492550612 发表于 2014-7-16 11:54:08

shenkee 发表于 2014-7-16 12:11:03

呢代码睇到我眼花花

evon 发表于 2014-7-16 12:54:10

dengyumeng 发表于 2014-7-16 11:48
个软件,既制作方法 睇起来好似复杂左D。但系,就早就左好多既用途,比D心机制作吧,楼主。

批处理语法不在行,都是临时百度学的,唉
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: 关于mkvtoolnix批量处理的经验分享