Board logo

标题: [其他] mkvtoolnix如何批量将avi文件封装为mkv格式? [打印本页]

作者: c_mang    时间: 2016-1-7 23:20     标题: mkvtoolnix如何批量将avi文件封装为mkv格式?

本帖最后由 c_mang 于 2016-1-9 07:39 编辑

求助高手解决视频封装的批处理文件。
一、已知,MKVToolnix 5.8.0 绿色多语版的mmg.exe可以将"I:\\001.AVI"快速封装MKV并保存在"H:\\800首\\001.mkv"。但由于"I:\\"含001.AVI~801.AVI共800个文件,手动一个一个地加入、封装、保存,实在太累。想到批处理应当能解决,可又不知道该怎么写,因此烦劳高手大驾援手。
感激不尽!先行谢过!

二、本次需要封装的800个avi文件原压制在一张非卖品的4.7G的光盘中。不知什么原因,在电脑中打开它每个文件都显示大小为1.99G,不要说全部导出得准备2T的硬盘,还有耗用的时间更无法计算,作为遗留问题我将它制作成镜像文件。近来发现mkvtoolnix能直接添加虚拟光驱中的影音文件并成功封装另存,更为重要的它几乎还原了应有的大小。
    截图在5楼。

三、附上从mkvmerge复制的命令行(002.avi-002.mkv)如下:
"mkvmerge" -o "H:\\800首\\002.mkv"  "--forced-track" "0:no" "--forced-track" "1:no" "-a" "1" "-d" "0" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "I:\\002.AVI" ")" "--track-order" "0:0,0:1"
      附上从mkvmerge复制的命令行(002.avi-002.mkv)如下:
"mkvmerge" -o "H:\\800首\\002.mkv"  "--forced-track" "0:no" "--forced-track" "1:no" "-a" "1" "-d" "0" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "I:\\002.AVI" ")" "--track-order" "0:0,0:1"


四、这样写的批处理为什么只一闪而过,不能运行?
@echo off&setlocal enabledelayedexpansion

for /l %%i in (1,1,800) do (set /a n=1000+%%i

"D:\影音及光盘\mkv专题\MKVToolnix 5.8.0 绿色多语版\mkvtoolnix\mkvtoolnix\mmg.exe" -o "H:\\800首\\[!n:~1!].mkv"--forced-track" "0:no" "--default-track" "1:yes" "--forced-track" "1:no" "--display-dimensions" "1:320x240" "-a" "0" "-d" "1" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "I:\\[!n:~1!].AVI" ")" "--track-order" "0:0,0:1,1:0"

)

pause

五、记得三年前在读书论坛幸遇批处理的大佬namejm,得其帮助一个批处理就从哈佛下载到珍贵的资料,由此切身感受到批处理的神奇之处,借此再向他表达敬意!
    为了加快本题的结案,特将800首AVI(近4.7G)的镜像文件分卷压缩3个包上传百度盘,供高手测试,期待精彩的批处理文件。
    下载链接在24楼。
作者: hlzj88    时间: 2016-1-8 10:38

首先,你要单独echo 你的长句子到一个文本,对比看是否吻合,防止特殊字符引起的问题,然后套入你下面写的语句里,兴许就可以用了

这样的句子,也可以用excel来做
作者: c_mang    时间: 2016-1-8 11:11

回复 2# hlzj88
未能领会“单独echo 你的长句子到一个文本,对比看是否吻合”这句话的意思。
能否赐教一个实例?
作者: hlzj88    时间: 2016-1-8 15:40

本帖最后由 hlzj88 于 2016-1-8 15:45 编辑

你的1 2 问不懂。。仅就第三问,按你的代码直接运行会报错。
  1. @echo off&setlocal enabledelayedexpansion
  2. set xx="D:\影音及光盘\mkv专题\MKVToolnix 5.8.0 绿色多语版\mkvtoolnix\mkvtoolnix\mmg.exe" -o "H:\\800首\\[!n:~1!].mkv"--forced-track" "0:no" "--default-track" "1:yes" "--forced-track" "1:no" "--display-dimensions" "1:320x240" "-a" "0" "-d" "1" "-S" "-T" "--no-global-tags" "--no-chapters"
  3. set yy="--track-order" "0:0,0:1,1:0"
  4. for /l %%i in (1,1,800) do (set /a n=1000+%%i
  5. echo %xx% "(" "I:\\[!n:~1!].AVI" ")" %yy%>>3.txt
  6. )
  7. pause
复制代码
且 你的路径I:\\001.avi,和平时的i:\001.avi不同,,也许是你软件的用法。另你最后的I:\\[!n:~1!].AVI,,,不知对否。
作者: c_mang    时间: 2016-1-8 20:26

回复 4# hlzj88
谢谢关注!
一、关于“路径I:\\001.avi,和平时的i:\001.avi不同”的说明。
    本次需要封装的800个avi文件原压制在一张非卖品的4.7G的光盘中。不知什么原因,在电脑中打开它每个文件都显示大小为1.99G,不要说全部导出得准备2T的硬盘,还有耗用的时间更无法计算,作为遗留问题我将它制作成镜像文件。近来发现mkvtoolnix能直接添加虚拟光驱中的影音文件并成功封装另存,更为重要的它几乎还原了应有的大小。

    因此“路径I:\\001.avi”是虚拟光驱的盘符路径。

二、再附上从mkvmerge复制的命令行(002.avi-002.mkv)如下:
"mkvmerge" -o "H:\\800首\\002.mkv"  "--forced-track" "0:no" "--forced-track" "1:no" "-a" "1" "-d" "0" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "I:\\002.AVI" ")" "--track-order" "0:0,0:1"

三、几年前在读书论坛幸遇批处理的大佬namejm,得其帮助从哈佛下载到珍贵的资料,由此切身感受到批处理的神奇之处,借此再向他表达敬意!
作者: gawk    时间: 2016-1-8 20:45

再请教,这样写的批处理为什么只一闪而过,不能运行?

把你的代码保存为 C:\test.bat
打开一个命令行窗口并执行 C:\test.bat
把报错信息发出来看看
作者: gawk    时间: 2016-1-8 20:47

2,还有,从mkvmerge复制的命令行有什么作用?

这个跟批处理没有关系,全都是 mkvmerge 本身的参数,具体什么意思需要查看它自己的手册。
作者: hlzj88    时间: 2016-1-8 20:48

namejm,,还有坛子里的其他高手,羡慕的紧,只是自己没有一点代码方面的知识,学来也只是门外汉。

不知上面的代码可用否, 再,你附上第二个,什么意思,,
作者: c_mang    时间: 2016-1-8 20:55

回复 7# gawk
谢谢!
也正是想到mkvmerge是开源软件,不同于其他收费软件那样封闭,或许通过写批处理能解决这个问题。
不知这个想法对不对?
作者: hlzj88    时间: 2016-1-8 21:07

他代码的错  此时不应有  "--track-order"
作者: gawk    时间: 2016-1-8 21:13

回复 9# c_mang


    bat调用mkvmerge的这个想法可以行得通
作者: gawk    时间: 2016-1-8 21:15

回复 10# hlzj88


我没有环境,无法测试。转义试试吧。

@echo off&setlocal enabledelayedexpansion

for /l %%i in (1,1,800) do (set /a n=1000+%%i

"D:\影音及光盘\mkv专题\MKVToolnix 5.8.0 绿色多语版\mkvtoolnix\mkvtoolnix\mmg.exe" -o "H:\\800首\\[!n:~1!].mkv"--forced-track" "0:no" "--default-track" "1:yes" "--forced-track" "1:no" "--display-dimensions" "1:320x240" "-a" "0" "-d" "1" "-S" "-T" "--no-global-tags" "--no-chapters" "^(" "I:\\[!n:~1!].AVI" "^)" "--track-order" "0:0,0:1,1:0"

)

pause
作者: hlzj88    时间: 2016-1-8 21:20

回复 12# gawk
我以为我上面已经解决了他的问题,,只需把echo %xx% "(" "I:\\[!n:~1!].AVI" ")" %yy%>>3.txt两端的echo  与 >>3.txt 去掉,即可。也不知他测试结果咋样
作者: c_mang    时间: 2016-1-8 21:43

回复 12# gawk
感谢!
文件不存在,如何改?
作者: gawk    时间: 2016-1-8 21:48

请执行4楼的代码,把代码生成的3.txt压缩之后传上来看看。
作者: c_mang    时间: 2016-1-8 21:56

回复 15# gawk
用4楼的代码,弹出命令行窗口,但按任意键,却退出了。
作者: hlzj88    时间: 2016-1-8 22:04

本帖最后由 hlzj88 于 2016-1-8 22:07 编辑

还是我来贴吧  取了4行
"D:\影音及光盘\mkv专题\MKVToolnix 5.8.0 绿色多语版\mkvtoolnix\mkvtoolnix\mmg.exe" -o "H:\\800首\\[~1no" "--default-track" "1:yes" "--forced-track" "1:no" "--display-dimensions" "1:320x240" "-a" "0" "-d" "1" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "I:\\[001].AVI" ")" "--track-order" "0:0,0:1,1:0"
"D:\影音及光盘\mkv专题\MKVToolnix 5.8.0 绿色多语版\mkvtoolnix\mkvtoolnix\mmg.exe" -o "H:\\800首\\[~1no" "--default-track" "1:yes" "--forced-track" "1:no" "--display-dimensions" "1:320x240" "-a" "0" "-d" "1" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "I:\\[002].AVI" ")" "--track-order" "0:0,0:1,1:0"
"D:\影音及光盘\mkv专题\MKVToolnix 5.8.0 绿色多语版\mkvtoolnix\mkvtoolnix\mmg.exe" -o "H:\\800首\\[~1no" "--default-track" "1:yes" "--forced-track" "1:no" "--display-dimensions" "1:320x240" "-a" "0" "-d" "1" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "I:\\[003].AVI" ")" "--track-order" "0:0,0:1,1:0"
"D:\影音及光盘\mkv专题\MKVToolnix 5.8.0 绿色多语版\mkvtoolnix\mkvtoolnix\mmg.exe" -o "H:\\800首\\[~1no" "--default-track" "1:yes" "--forced-track" "1:no" "--display-dimensions" "1:320x240" "-a" "0" "-d" "1" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "I:\\[004].AVI" ")" "--track-order" "0:0,0:1,1:0"

下午,我echo时,他的这些可以完全echo,在for 里运行报错,,经查为  不应有"--track-order"  ,因此用set.
作者: c_mang    时间: 2016-1-8 22:25

本帖最后由 c_mang 于 2016-1-8 22:27 编辑

回复 17# hlzj88
让你费心,多谢!
然而不知道这四条如何纠正?您能否再另写一个完整的?
我以为,14楼的截图说明,gawk所赐bat已经调用mkvmerge GUI成功,此时如果不直接关闭命令窗口,似乎要连续点击800个“确定”才能让mkvmerge GUI退出。
有点眉目了,只要解决-o(文件不存在)这个问题,就能再进一步。
作者: hlzj88    时间: 2016-1-8 22:34

如果你有单独的句子能成功执行一次,那代码就是可靠的。没有你的测试环境,也只是根据你的代码来写的
作者: gawk    时间: 2016-1-8 22:34

似乎要连续点击800个“确定”才能让mkvmerge GUI退出

下次遇到类似问题可以用taskkill命令杀进程
  1. taskkill /f /im mkvmerge.exe
复制代码
  1. taskkill /f /im cmd.exe
复制代码

作者: gawk    时间: 2016-1-8 22:37

  1. "D:\影音及光盘\mkv专题\MKVToolnix 5.8.0 绿色多语版\mkvtoolnix\mkvtoolnix\mmg.exe" -o "H:\\800首\\001.mkv"--forced-track" "0:no" "--default-track" "1:yes" "--forced-track" "1:no" "--display-dimensions" "1:320x240" "-a" "0" "-d" "1" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "I:\\001.AVI" ")" "--track-order" "0:0,0:1,1:0"
复制代码
这样处理单个文件能成功吗?
作者: hlzj88    时间: 2016-1-8 22:41

http://zhidao.baidu.com/question ... kvmerge%20GUI%20dos
百度知道
作者: c_mang    时间: 2016-1-8 22:44

回复 21# gawk
仍旧是“文件"-o"不存在”这个问题。
作者: c_mang    时间: 2016-1-9 07:29

回复 21# gawk
现提供测试环境,800首AVI(近4.7G)的镜像文件已分卷压缩3个包上传百度盘
链接:http://pan.baidu.com/s/1hrcT7us 密码:uu1w
作者: c_mang    时间: 2016-1-9 07:49

回复 13# hlzj88

按你13楼的意见:“只需把echo %xx% "(" "I:\\[!n:~1!].AVI" ")" %yy%>>3.txt两端的echo  与 >>3.txt 去掉,”,
应为 %xx% "(" "I:\\[!n:~1!].AVI" ")" %yy%
运行修改bat,结果与23楼的截图相似,还是弹出“文件"-o"不存在”提示,而且命令窗口没有字符。
另:
现提供测试环境,800首AVI(近4.7G)的镜像文件已分卷压缩3个包上传百度盘
链接:http://pan.baidu.com/s/1hrcT7us 密码:uu1w
作者: hlzj88    时间: 2016-1-9 08:53

虽然你很辛苦的上传了4G文件,,但是,对我们来说真的压力很大,因此建议你看看22楼的,或者百度更多来修改,只要成功一句,别的都不是大问题
作者: hlzj88    时间: 2016-1-9 08:56

我以为 找不到文件,主要还是在 路径上
作者: c_mang    时间: 2016-1-9 09:32

回复 27# hlzj88

这是第一次动手批处理,还要向你多学习!
如前所引:
"D:\影音及光盘\mkv专题\MKVToolnix 5.8.0 绿色多语版\mkvtoolnix\mkvtoolnix\mmg.exe" -o "H:\\800首\\[!n:~1!].mkv"--forced-track" "0:no" "--default-track" "1:yes" "--forced-track" "1:no" "--display-dimensions" "1:320x240" "-a" "0" "-d" "1" "-S" "-T" "--no-global-tags" "--no-chapters" "^(" "I:\\[!n:~1!].AVI" "^)" "--track-order"
"0:0,0:1,1:0"

其中涉及路径有三:
1,"D:\影音及光盘\mkv专题\MKVToolnix 5.8.0 绿色多语版\mkvtoolnix\mkvtoolnix\mmg.exe"——mmg.exe应用程序的路径。
2,"H:\\800首\\[!n:~1!].mkv"——输出路径。
3,(" "I:\\[!n:~1!].AVI" "^)——目标路径。
究竟是哪一条出了问题,还是通篇语句连贯出错?
作者: hlzj88    时间: 2016-1-9 09:52

  1. @echo off
  2. for %%i in (*.h264) do "C:\Program Files\MKVToolNix\mkvmerge.exe" -o "F:\\合成目录\\%%~ni.mkv"  "--forced-track" "0:no" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "F:\\合成目录\\%%~ni.h264" ")" "--forced-track" "0:no" "-a" "0" "-D" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "F:\\合成目录\\%%~ni.aac" ")" "--track-order" "0:0,1:0"
复制代码
这是22楼的百度知道后面声明的能成功的代码,加了个字幕文件
作者: c_mang    时间: 2016-1-9 10:29

回复 29# hlzj88
注意到这个帖子,但它这里解决的是同一目录下的.h264视频与.aac音频合并问题。
与本题类似的是这个帖子http://zhidao.baidu.com/question/105271490.html,然而所答非所问。
作者: hlzj88    时间: 2016-1-9 10:51

  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1,1,800) do (
  3. set /a n=1000+%%i
  4. set xx="D:\影音及光盘\mkv专题\MKVToolnix 5.8.0 绿色多语版\mkvtoolnix\mkvtoolnix\mmg.exe" -o "H:\\800首\\[!n:~1!].mkv"  "--forced-track" "0:no" "--forced-track" "1:no" "-a" "1" "-d" "0" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "I:\\[!n:~1!].AVI" ")" "--track-order" "0:0,0:1"
  5. echo !xx!>>3.txt
  6. )
  7. pause
复制代码
你试试,,要去掉echo和>>3.txt
作者: c_mang    时间: 2016-1-9 11:01

回复 31# hlzj88
去掉echo和>>3.txt命令窗口一闪而过。
不去echo和>>3.txt,命令窗口提示按任意键,按完也是一闪而过。
作者: hlzj88    时间: 2016-1-9 11:06

不去是会在一起生成一个3.txt,,你把它改为3.bat,,运行看看,
作者: c_mang    时间: 2016-1-9 11:20

回复 33# hlzj88
在"C:\Windows\System32\3.txt"找到,
改3.bat运行的结果如23楼截图,内容是:
C:\Windows\system32>"D:\影音及光盘\mkv专题\MKVToolnix 5.8.0 绿色多语版\mkvtoolni
x\mkvtoolnix\mmg.exe" -o "H:\\800首\\[~1no" "--default-track" "1:yes" "--forced-
track" "1:no" "--display-dimensions" "1:320x240" "-a" "0" "-d" "1" "-S" "-T" "--
no-global-tags" "--no-chapters" "(" "I:\\[001].AVI" ")" "--track-order" "0:0,0:1
,1:0"
作者: hlzj88    时间: 2016-1-9 11:23

没有调用 那软件吗
作者: c_mang    时间: 2016-1-9 11:26

回复 35# hlzj88
见23楼截图,应用软件窗口弹出,仍旧是“文件"-o"不存在”的提示。
作者: c_mang    时间: 2016-1-16 13:54

回复 21# gawk
请继续帮助——
经过反复思考,你和hlzj88的努力通常已能解决问题。但此题似乎有点特殊(见5楼的截图和说明),由于输入文件是加载在虚拟光驱的I:盘符里,或许这就是运行bat找不到文件和路径的原因所在。
如果问题就出在这儿,那么需要补充什么指令才能让bat读取虚拟光驱里的文件?
有劳了二位,感激!
作者: gawk    时间: 2016-1-16 16:54

回复 37# c_mang


    我没有这样的环境,无法做测试。你试试 subst 命令是否可以把虚拟盘符映射到本地。
作者: c_mang    时间: 2016-1-16 18:42

回复 38# gawk
一、测试过subst 命令,一闪而过。原因不明。
二、又参考:判断光驱盘符(路径)
@echo off
for /f "skip=1" %%a in ('wmic logicaldisk where "drivetype=5" get DeviceID') do echo
%%a>>1.txt
说明:将光驱盘符显示出来,并把结果保存到当前盘的“1.txt”文本中。
——结果:“1.txt”文本为空。
作者: gawk    时间: 2016-1-16 20:16

回复 39# c_mang


    删掉 where "drivetype=5" 试试
作者: gawk    时间: 2016-1-16 20:18

测试过subst 命令,一闪而过

在CMD窗口单独执行subst命令可以看到报错信息。以后不要再说“一闪而过”这种词了,对于别人帮助你解决问题来说没有任何意义。
作者: c_mang    时间: 2016-1-16 21:32

回复 41# gawk

谢谢朋友提醒,一定注意细节。
再请关注,subst.bat原来存放在C:盘,没有运行成功。但移动到D:文件夹里保存时,却发现可以运行,时间已过去半小时,仍然在跳转,不知结果是怎样?
主要没有看见001.avi;002.avi……等显示。
作者: c_mang    时间: 2016-1-17 01:14

回复 38# gawk
请教:
如42楼截图,自21:00至凌晨1点,
cmd.exe运行subst w: i:\
始终处于快速上翻的显示。
其间多次查看盘符和硬盘,都没有看出变化。I:\镜像文件(800首avi)大小不过4.37G,看来只好关闭,该休息了。
附:
操作系统:Win7专业版32位。
硬盘:2T

能否指点原因吗?
多谢了!静候。
作者: hlzj88    时间: 2016-1-17 16:57

回复 43# c_mang
同理,前期按你的软件能用的语句已能生成批量语句,但你的不能找到文件,也许和虚拟光驱有关系,但这些已经超出批处理的范畴,超出的部分,也不是我的强项。算是无能为力了。
作者: gawk    时间: 2016-1-18 13:58

回复 42# c_mang


    把 subst.bat 重命名为 test.bat
作者: c_mang    时间: 2016-1-28 01:08

回复 45# gawk
回复gawk、hlzj88二君:对于你们在本帖中给予的帮助,深表谢意!
1,关于调用MKVToolnix批处理800个AVI封装为MKV的实际运用,已经得到另一位高手(不在本坛子)的指导顺利完成,全部耗时不到20分钟。由于革除了每个文件1.99G的冗余,因此镜像文件的4.37G总大小封装后仅为4.14G。不过他给出的批处理是另一种语句表述,所以就本题来说并没有彻底解决。
2,我想继续搞清楚的是,像
@echo off&setlocal enabledelayedexpansion
for /l %%i in (1,1,800) do (set /a n=1000+%%i
这样的句式究竟能不能锁定“来源文件夹 I:\ 是个虚拟光盘路径”并读取?
搜索过本坛,只有谈论光驱而没有涉及虚拟光盘的话题。
尝试添加pushd I:\ 没有成功。
如下:
@echo off&setlocal enabledelayedexpansion
pushd I:\  
for /l %%i in (1,1,800) do (set /a n=1000+%%i
作者: c_mang    时间: 2016-1-28 01:10

回复 44# hlzj88
鸣谢!详楼上。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2