需要的工具:
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函数的输入参数组成,新的批处理文件就此生成。