通过子进程

时间:2018-07-04 14:52:11

标签: python ffmpeg subprocess

我已经转换了大约100盘录像带,现在有100个充满.dv文件的文件夹(每个文件夹的名称是一个日期)。在每个文件夹中,我想将所有.dv文件合并为一个x265 mp4。我已经弄清楚了ffmpeg命令可以做到这一点,并且我编写了一个简单的Python脚本来遍历文件夹层次结构并打印出ffmpeg命令来完成每个文件夹的转换。我想将其设置为仅按顺序运行每个文件夹-整个转换大约需要一周的时间,因此我只能使用/发布约5GB的视频,而1.5TB的原始.dv文件。

shell命令如下:

ffmpeg -f concat -i <(for f in FULL_PATH_TO_FILES/*.dv; do echo "file '$f'"; done) \
  -c:v libx265 -crf 28 -c:a aac -b:a 128k \ 
  -strict -2 FULL_PATH_TO_FILES/FOLDERNAME.mp4

我可以将其作为shell命令运行,并且工作正常。我可以使用python脚本生成100个命令,然后一次将它们复制并粘贴到我的shell中。但是我宁愿让它们连续运行。

我尝试了os.system和subprocess.call或subprocess.Popen的各种形式,但它们都出错了。

我建立了命令并发出subprocess.call(command),它给出了此错误:

  

“ / System / Library / Frameworks / Python.framework / Versions / 2.7 / lib / python2.7 / subprocess.py”,行522,在调用中       返回Popen(* popenargs,** kwargs).wait()      init 中的文件“ /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py”,第710行       errread,errwrite)     _execute_child中的文件“ /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py”,行1335       提高child_exception   OSError:[Errno 2]没有这样的文件或目录

我也尝试过构建命令,如我所阅读的许多其他线程中所述,但它不起作用,我认为这是由于shell命令中存在for循环所致。 / p>

那么,最好的方法是什么?显然,shell骑师可以告诉我如何通过shell进行操作,但是我更喜欢使用Python遍历目录并建立ffmpeg命令。

对于它的价值,这是整个脚本:

import os
import subprocess
t1 = "ffmpeg -f concat -i <(for f in "
t2 = "/*.dv; do echo \"file '$f'\"; done) -c:v libx265 -crf 28 -c:a aac -b:a 128k -strict -2 "
t3 = ".mp4"
rootDir = ROOTDIR
for dirName, subdirList, fileList in os.walk(rootDir):
    S = dirName.split('/')    
    if S[-1] == "Media":
        moviename = S[-2].split(".")[0] # e.g. "19991128_Thanksgiving"
        command = t1 + dirName + t2 + dirName + "/" + moviename + t3
        if sum([".mp4" in fname for fname in fileList]) == 0: # don't bother if there is already a mp4 file in the folder
            cmd_list = [t1,dirName,t2,dirName,"/",moviename,t3]
            print command
            print
            print
            subprocess.call(command)

0 个答案:

没有答案