使用Python subprocess调用ffmpeg拼接音频片段时报错如何解决
问题根源
你出现报错的核心原因是subprocess.run的传参规则用错了:
当你给subprocess.run传入列表形式的参数时,每个列表元素对应终端执行时的一个独立参数,不需要手动加引号(终端里的引号是用来标记带空格的内容是单个参数的,列表形式传参已经天然实现了这个效果,你额外加的引号会被当成参数内容的一部分传给ffmpeg,导致识别失败)。同时你把-af对应的完整过滤器参数拆成了多个列表元素,相当于给ffmpeg传入了多个无法识别的无效参数。
修正后的代码
import subprocess input_url = 'input.mp3' output_file = 'out.wav' clips = [[4, 6], [70,80]] # 片段起止时间,单位秒 clip_parts = [] for start, end in clips: temp_part = f"between(t, {start}, {end})" clip_parts.append(temp_part) # 构造完整的音频过滤器参数,作为单个字符串 audio_filter = f"aselect='{'+'.join(clip_parts)}', asetpts=N/SR/TB" subprocess.run([ "ffmpeg", "-i", input_url, "-af", audio_filter, output_file ])
修改说明
- 把
-af对应的完整过滤器表达式作为单个字符串传入参数列表,不需要额外添加外层引号,subprocess会自动处理转义 - 去掉了无效的
clip_parts is None判断(你初始化时已经给clip_parts赋值为空列表,这个判断永远不会触发) - 用f-string简化了时间片段的字符串拼接逻辑,可读性更高
内容的提问来源于stack exchange,提问作者Suraj
相关产品推荐
相关产品推荐

