Nex*_*n21 2 python subprocess ffmpeg video-processing
我想使用 ffmpeg 和 python 在图像上叠加透明视频
我可以通过终端成功完成此操作,但无法让 ffmpeg 命令在 python 中工作。当我位于包含文件的目录中时,以下命令会在终端中生成我想要的结果。
ffmpeg -i head1.png -i hdmiSpitting.mov -filter_complex "[0:v][1:v] overlay=0:0" -pix_fmt yuv420p -:a copy output3.mov
Run Code Online (Sandbox Code Playgroud)
在 python 中,我的代码很简单:
import os
import subprocess
command = "ffmpeg -i head1.png -i hdmiSpitting.mov -filter_complex \"[0:v][1:v] overlay=0:0\" -pix_fmt yuv420p -c:a copy output3.mov"
subprocess.call(command,shell=True)
Run Code Online (Sandbox Code Playgroud)
代码运行,没有任何错误指示,但没有产生任何输出。
我在这里缺少什么?
在 Windows 中,一行带有空格应该可以工作,但在 Linux 中,我们必须将参数作为列表传递。
我们可以将命令构建为列表:
command = ['ffmpeg', '-i', 'head1.png', '-i', 'hdmiSpitting.mov', '-filter_complex', '[0:v][1:v]overlay=0:0', '-pix_fmt', 'yuv420p', '-c:a', 'copy', 'output3.mov']
Run Code Online (Sandbox Code Playgroud)
我们还可以使用shlex.split:
import shlex
command = shlex.split('ffmpeg -i head1.png -i hdmiSpitting.mov -filter_complex "[0:v][1:v] overlay=0:0" -pix_fmt yuv420p -c:a copy output3.mov')
Run Code Online (Sandbox Code Playgroud)
添加-y参数:
如果输出文件output3.mov已存在,FFmpeg 会打印一条消息:
File 'output3.mov' already exists. Overwrite? [y/N]
并等待用户按y。
在某些开发环境中我们看不到该消息。
添加-y以覆盖输出(如果已存在)(无需询问):
command = shlex.split('ffmpeg -y -i head1.png -i hdmiSpitting.mov -filter_complex "[0:v][1:v] overlay=0:0" -pix_fmt yuv420p -c:a copy output3.mov')
Run Code Online (Sandbox Code Playgroud)
路径问题:
有时ffmpeg可执行文件不在执行路径中。
可能需要使用完整路径。
Windows 示例(假设 ffmpeg.exe 位于 中c:\FFmpeg\bin):
command = shlex.split('c:\\FFmpeg\\bin\\ffmpeg.exe -y -i head1.png -i hdmiSpitting.mov -filter_complex "[0:v][1:v] overlay=0:0" -pix_fmt yuv420p -c:a copy output3.mov')
Run Code Online (Sandbox Code Playgroud)
在 Linux 中,默认路径是/usr/bin/ffmpeg.
shell=True不建议使用并被认为“不安全”。
有关详细信息,请参阅安全注意事项。
默认的是False,所以我们可以使用subprocess.call(command)。
注意:subprocess.run假设替换subprocess.call.
请参阅这篇文章了解详细信息。
通过添加参数创建日志文件-report:
在某些开发环境中,我们看不到 FFmpeg 消息,这些消息被打印到控制台(写入stderr)。
添加-report参数会创建一个名称类似于ffmpeg-20220624-114156.log.
当我们看不到控制台时,日志文件可能会告诉我们出了什么问题。
例子:
import subprocess
import shlex
subprocess.run(shlex.split('ffmpeg -y -i head1.png -i hdmiSpitting.mov -filter_complex "[0:v][1:v] overlay=0:0" -pix_fmt yuv420p -c:a copy output3.mov -report'))
Run Code Online (Sandbox Code Playgroud)