我已经转换了大约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)