现在大多数Matroska视频文件(.mkv)都启用了头压缩。这就破坏了与硬件播放器的兼容性,因此我在很久以前就创建了一批“修复”程序,使用mkvtoolnix重新组装文件,而不使用头压缩。 但奇怪的是,尽管源代码是正确的,但批处理在某些.mkv上不起作用。只是打嗝没有规律。。。在
因此,我今天开始编写一个小的python3.2脚本,其唯一目的是遍历CWD中的.mkv文件,并将它们作为参数使用参数调用mkvtoolnix-.exe。我试着两者都用过os.popen公司()和操作系统()在我准备好的命令上,虽然system()似乎误解了命令,删除了不该使用的双引号,但popen似乎至少可以工作一点。在
这就是我的问题。现在执行脚本,它会为文件夹中的每个.mkv文件创建一个.mkv_修复文件,这很好,但是它的大小只是原始文件的一小部分,并且无法运行。在我看来,popen调用.exe很好,但后来几乎立即终止它,只留下一个未完成的文件。在
我将mkvtoolnix windows可执行文件作为来自here的7zip存档文件,并将它们放在脚本的CWD子目录中。在
我还应该注意到,当从批处理中调用时,可执行文件会生成控制台输出,.py脚本不是这样。在
准则的重要部分:
for file in glob.iglob('*.mkv'):
if file.count('_fix') == 0:
print(file)
convertCMD = '"{0}\mkvtoolnix\mkvmerge.exe" -o "{1}_fix" --engage keep_bitstream_ar_info -A -S --compression -1:none "{1}" -D -S --compression -1:none "{1}" -A -D "{1}"'.format(os.getcwd(),file)
os.popen(convertCMD)
print('Converted '+file)
感谢任何帮助。在
附加信息:
通常的mkvtoolnix输出:
^{pr2}$
在os.popen公司是弃用的,而且我没有用过,至少最近几年没有用过,所以我不记得细节了。但文件显示你需要打电话操作系统。等等()等待子进程完成。在
为子流程.Popen您需要对该对象调用wait()以查看它是否已完成。如果在开始下一个之前这样做,输出将不会混合。另一方面,如果您一次启动,您可以使用任意数量的处理器内核,这将是很好的。要避免混合输出,则需要为每个子进程创建一个输出,方法是调用Popen(),并使用指向为此目的打开的文件的stdout参数。这样每次转换都会得到一个日志文件,这很有意义。在
我写了一个脚本,我每天都用它来将一些.srt字幕转换成mkv文件。
以下是相关代码:
(在我的Ubuntu服务器上运行得很好,它也可以在Windows上运行)
相关问题 更多 >
编程相关推荐