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

Python调用subprocess/os.popen执行FFmpeg命令的问题求助

Python调用FFmpeg的问题解决

问题分析

  1. os.popen停滞:os.popen会因FFmpeg输出缓冲区占满导致父进程阻塞,且该接口已被官方废弃,不建议使用。
  2. subprocess.Popen找不到文件:直接传入完整命令字符串时,subprocess.Popen默认以shell=False模式运行,会把整个字符串当作单个可执行文件路径,自然找不到对应程序。

正确解决方案

方法1:使用参数列表(推荐,无安全风险)

将FFmpeg命令拆分为参数列表,避免shell解析,同时重定向输出避免阻塞,并等待任务完成后再执行后续代码:

import subprocess

# 拆分命令为参数列表,每个参数单独作为列表元素
command = [
    '/usr/bin/ffmpeg',
    '-i', inputf,
    '-b:a', '128K',
    '-vn',
    f'{output_directory}{youtube_id}.mp3'
]

try:
    # 启动子进程,重定向输出避免阻塞
    process = subprocess.Popen(
        command,
        stdout=subprocess.DEVNULL,
        stderr=subprocess.DEVNULL
    )
    process.wait()  # 等待FFmpeg处理完成
    # 后续执行你的业务代码
    print("FFmpeg处理完成,继续执行后续步骤")
except Exception as e:
    print(f"FFmpeg执行出错:{e}")

方法2:使用shell=True(不推荐,存在注入风险)

若必须使用完整命令字符串,需设置shell=True,但注意当输入路径含特殊字符时会有安全隐患:

import subprocess

fcommand = f'/usr/bin/ffmpeg -i {inputf} -b:a 128K -vn {output_directory}{youtube_id}.mp3'

try:
    process = subprocess.Popen(
        fcommand,
        shell=True,
        stdout=subprocess.DEVNULL,
        stderr=subprocess.DEVNULL
    )
    process.wait()
    print("FFmpeg处理完成,继续执行后续步骤")
except Exception as e:
    print(f"执行出错:{e}")

关键注意事项

  • 参数拆分:subprocess.Popen在shell=False模式下必须传入参数列表,这是最安全且官方推荐的方式。
  • 输出重定向:将stdout和stderr重定向到subprocess.DEVNULL,可避免因输出缓冲区满导致的进程阻塞。
  • 等待任务完成:通过process.wait()确保FFmpeg处理结束后再执行后续代码,符合你的需求。

内容的提问来源于stack exchange,提问作者Nowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 07:32:32