为何FFmpeg命令在终端正常运行但subprocess.call调用失败?
FFmpeg在终端正常执行但subprocess.call报错的原因及解决方法
问题背景
环境:Mac Sequoia 15.5、Python 3、FFmpeg 4.2.1,需求是编写脚本将FLAC文件转换为320k码率的MP3。
终端执行以下命令可正常工作:
/usr/local/bin/ffmpeg -i "/Volumes/MainData/Media/Media Server/_Stage/03 - People Like Us - Aaron Tippin.flac" -b:a 320k -map_metadata 0 -id3v2_version 3 "/Volumes/MainData/Media/Media Server/_Stage/03 - People Like Us - Aaron Tippin.mp3"
但使用subprocess.call执行以下代码时:
command = ['/usr/local/bin/ffmpeg', '-i', '/Volumes/MainData/Media/Media Server/_Stage/03 - People Like Us - Aaron Tippin.flac', '-b:a 320k', '-map_metadata 0', '-id3v2_version 3', '/Volumes/MainData/Media/Media Server/_Stage/03 - People Like Us - Aaron Tippin.mp3'] p = subprocess.call(command)
出现错误:
Unrecognized option 'id3v2_version 3'. Error splitting the argument list: Option not found
移除'-id3v2_version 3'后,仍报错:
[mp3 @ 0x7fae2c008200] Invalid stream specifier: a 320k.
已确认使用同一版本FFmpeg,为何终端可执行但subprocess.call不行?
原因及解决方法
核心问题是subprocess的参数列表格式错误:
- 终端里空格是参数分隔符,会自动把
-b:a 320k拆成两个独立参数传递给FFmpeg; - 但subprocess的列表参数中,每个元素会被当作完整参数传递,如果你把选项和值写在同一个字符串里(比如
'-b:a 320k'),FFmpeg会把整个字符串当成一个选项名,自然识别不了。
正确的参数列表需要把每个选项和对应的值拆分成独立元素:
command = [ '/usr/local/bin/ffmpeg', '-i', '/Volumes/MainData/Media/Media Server/_Stage/03 - People Like Us - Aaron Tippin.flac', '-b:a', '320k', '-map_metadata', '0', '-id3v2_version', '3', '/Volumes/MainData/Media/Media Server/_Stage/03 - People Like Us - Aaron Tippin.mp3' ] p = subprocess.call(command)
修改后,subprocess会把每个选项和值正确传递给FFmpeg,执行效果就和终端命令一致了。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

