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
相关产品推荐
相关产品推荐

