终端正常运行的FFmpeg命令在Python subprocess中报libx264编码器错误
解决方法
核心问题是subprocess默认调用conda环境里的FFmpeg(未编译libx264),而终端用的是系统自带的FFmpeg(带libx264),直接指定系统FFmpeg的绝对路径即可解决。
步骤1:获取系统FFmpeg的绝对路径
- Linux/macOS:在终端执行
which ffmpeg,得到类似/usr/bin/ffmpeg的路径 - Windows:在命令提示符执行
where ffmpeg,得到类似C:\Program Files\ffmpeg\bin\ffmpeg.exe的路径
步骤2:在subprocess中使用绝对路径调用FFmpeg
方式1:shell=True 模式
import subprocess # 替换成你拿到的系统FFmpeg绝对路径 system_ffmpeg_path = '/usr/bin/ffmpeg' cmd = f'{system_ffmpeg_path} -framerate 1 -pattern_type glob -i "*.png" -c:v libx264 -pix_fmt yuv420p -vf "crop=trunc(iw/2)*2:trunc(ih/2)*2" out.mp4' subprocess.run(cmd, shell=True, check=True)
方式2:shell=False 模式(更安全)
import subprocess system_ffmpeg_path = '/usr/bin/ffmpeg' cmd = [ system_ffmpeg_path, '-framerate', '1', '-pattern_type', 'glob', '-i', '*.png', '-c:v', 'libx264', '-pix_fmt', 'yuv420p', '-vf', 'crop=trunc(iw/2)*2:trunc(ih/2)*2', 'out.mp4' ] subprocess.run(cmd, check=True)
备选方案:修改环境变量优先找系统FFmpeg
如果不想每次都写绝对路径,可以临时调整PATH环境变量,让系统FFmpeg所在目录排在conda环境前面:
import subprocess import os # 替换成系统FFmpeg所在的目录(比如Linux的/usr/bin,Windows的C:\Program Files\ffmpeg\bin) system_ffmpeg_dir = '/usr/bin' os.environ['PATH'] = f'{system_ffmpeg_dir}:{os.environ["PATH"]}' # 之后直接调用ffmpeg即可 cmd = 'ffmpeg -framerate 1 -pattern_type glob -i "*.png" -c:v libx264 -pix_fmt yuv420p -vf "crop=trunc(iw/2)*2:trunc(ih/2)*2" out.mp4' subprocess.run(cmd, shell=True, check=True)
内容的提问来源于stack exchange,提问作者Basilique
相关产品推荐
相关产品推荐

