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

FastAPI调用ffmpeg进行音视频合成时进程被挂起的问题求助

FastAPI调用ffmpeg进行音视频合成时进程被挂起的问题求助

我现在在做一个基于FastAPI的Web应用,功能是帮用户把音频叠加到视频上,用的是ffmpeg工具。但遇到个头疼的问题:每次用subprocess.run(cmd)执行ffmpeg命令时,我的FastAPI进程就会自动挂起。我找不到错误日志来排查原因,网上也没搜到相关的解决办法,实在没办法了来求助大家!

先贴一下我的代码:

@app.get("/overlay-audio/")
async def get_video(audio_file: str, forged_name: Annotated[str, Query()] = "default"):
    video_path = os.path.join(output_path, "sample.mp4")
    audio_path = os.path.join(output_path, audio_file)
    forged_path = os.path.join(output_path, forged_name + ".mp4")
    print("Video path: " + video_path)
    print("Audio path: " + audio_path)
    print("Output path: " + forged_path)

    # 对应的ffmpeg命令原型
    # ffmpeg -i input.mp4 -i input.wav -c:v copy -map 0:v:0 -map 1:a:0 -c:a aac -b:a 192k output.mp4

    cmd = ["/opt/homebrew/bin/ffmpeg", 
           "-i", video_path,
           "-i", audio_path,
           "-c:v", "copy",
           "-map", "0:v:0",
           "-map", "1:a:0",
           "-c:a", "aac",
           "-b:a", "192k",
           forged_path]
    
    subprocess.run(cmd)
           
    return {"forged_vid": f"forged_{forged_name}"}


if __name__ == "__main__":
    uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)

我已经尝试过两种方法来解决:

  • 第一种是不让输出打印到终端,用result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)来捕获输出,结果还是挂起;
  • 第二种是用异步方式执行,避免阻塞事件循环,代码是这样的:
    result = await asyncio.create_subprocess_exec(
            *cmd,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )
    
    但依旧没有效果。

终端里关于挂起的输出是:[1] + 12526 suspended (tty output) "/Users//Tech Projects/project/tts/videnv/bin/python"

有没有大佬能给点思路,或者有没有其他实现音视频合成的方式可以推荐?感激不尽!

备注:内容来源于stack exchange,提问作者blermen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:23:09