You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 13:42:41