我对Python相当陌生,这是我第一次使用ffmpeg(基于同事的代码(。
我有一些代码每 X 秒拍摄一次屏幕快照,然后从这些文件中创建视频,但是我在创建视频时遇到了问题。这是我生成视频的代码:
def create_video(screen_resolution, image_location, subfolder, count, preset, qaulity, duplicated_frame, video_path, video_filename):
video_path = path + video_path
{1}\%d.jpg -vcodec libx264 -preset {2} -crf {3} -r {4} -pix_fmt yuv420p {5}\{6}.mp4"
proc = subprocess.Popen("C:\ffmpeg\ffmpeg.exe -r 1 -f image2 -s %s
-pattern_type sequence
-start_number 1
-i %s%s\%s%d.png
-vcodec libx264
-preset %s
-crf %s
-r %s
-pix_fmt yuv420p
%s\%s.mp4" %
(screen_resolution, image_location, subfolder, count, preset[2], qaulity, duplicated_frame, video_path, video_filename), shell = True)
我得到的错误是:
类型错误: %d 格式: 数字是必需的,而不是 str
我尝试寻找解决方案,但没有快速到达任何地方。我知道 %d 正在从末尾的列表中查找输入,但从我所看到的情况来看,这也是告诉 FFMPEG 使用图像位置中所有文件的方法。
希望有人可以帮助解决这个问题,如果这是一个重复的问题,请道歉,但如前所述,我已经尝试了很多搜索。
不要尝试手动构造外壳字符串。subprocess
为您做这件事。
你可以传递一个命令行参数数组,Popen 将负责正确转义所有内容:
proc = subprocess.Popen(
[
"C:/ffmpeg/ffmpeg.exe",
"-r", "1",
"-f", "image2",
"-s", screen_resolution,
"-i", os.path.join(path, image_location, subfolder, "%d" + extension),
"-preset", preset[1],
"-crf", str(qaulity),
"-r", str(duplicated_frame),
"-pix_fmt", "yuv420p",
os.path.join(video_path, video_filename)
]
)