我目前正在尝试使用ffmpeg和ffmpy将多个视频文件与python脚本合并。 根据{{3}}的建议,文件名被写入文件列表。
在我的示例中,我仅使用两个文件,但是在实践中,将有多个hundert文件,这就是为什么我选择文件列表方法。
我当前的代码如下:
import os
import ffmpy
base_dir = "/path/to/the/files"
# where to seek the files
file_list = open("video_list.txt", "x")
# scan for the video files
for root, dirs, files in os.walk(base_dir):
for video_file in files:
if video_file.endswith(".avi"):
file_list.write("file './%s'\n" % video_file)
# merge the video files
ff = ffmpy.FFmpeg(
global_options={"-f",
"concat ",
"-safe",
"0"},
inputs={file_list: None},
outputs={"-c",
"copy",
"output.avi"},
)
ff.run()
所以我想用ffmpy运行的代码是
ffmpeg -f concat -safe 0 -i video_list.txt -c copy output.avi
但是不幸的是我的脚本无法正常工作,导致的错误是
Traceback (most recent call last):
File "concat.py", line 20, in <module>
"output.avi", }
File "/usr/lib/python3.7/site-packages/ffmpy.py", line 54, in __init__
self._cmd += _merge_args_opts(outputs)
File "/usr/lib/python3.7/site-packages/ffmpy.py", line 187, in _merge_args_opts
for arg, opt in args_opts_dict.items():
AttributeError: 'set' object has no attribute 'items'
有人暗示为什么该命令无法正常运行?我是否缺少有关ffmpy的命令格式的内容?
谢谢。
答案 0 :(得分:0)
作为一种可行的解决方法,我能够使用子流程例程调用ffmpeg,因为ffmpy仍然让我头疼。 如果其他人有这个问题,这是我正在使用的代码
import os
import subprocess
import time
base_dir = "/path/to/the/files"
video_files = "video_list.txt"
output_file = "output.avi"
# where to seek the files
file_list = open(video_files, "w")
# remove prior output
try:
os.remove(output_file)
except OSError:
pass
# scan for the video files
start = time.time()
for root, dirs, files in os.walk(base_dir):
for video in files:
if video.endswith(".avi"):
file_list.write("file './%s'\n" % video)
file_list.close()
# merge the video files
cmd = ["ffmpeg",
"-f",
"concat",
"-safe",
"0",
"-loglevel",
"quiet",
"-i",
"%s" % video_files,
"-c",
"copy",
"%s" % output_file
]
p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
fout = p.stdin
fout.close()
p.wait()
print(p.returncode)
if p.returncode != 0:
raise subprocess.CalledProcessError(p.returncode, cmd)
end = time.time()
print("Merging the files took", end - start, "seconds.")