我正在开发一个使用 FastAPI 的 Web 应用程序,该应用程序使用 ffmpeg 将音频叠加到用户的视频上。我遇到一个问题,当我使用 subprocess.run(cmd) 时,它会自动暂停运行我的 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)
# command to recreate
# 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
)
```,
but nothing works. Any help or possible other ways to go about this would be greatly appreciated. Terminal output about the suspension: [1] + 12526 suspended (tty output) "/Users/<user>/Tech Projects/project/tts/videnv/bin/python"
subprocess.run
阻止当前进程。 换句话说,您的脚本将停止在该行,直到运行命令完成并且新进程终止。 这是有记录的行为。
使用 asyncio 无法解决问题,因为您尝试使用 asyncio 运行的任何函数也将在当前进程中运行。 在这种情况下,将会发生相同的阻塞行为。
您需要做的是将
subprocess.run(cmd)
替换为如下内容:
process2 = subprocess.Popen(cmd)
这两个进程现在将同时运行。 对象“process2”将是 subprocess.Popen 的实例,并将包含可用于与新进程交互的方法。
我无法运行你的程序,所以我不能更具体。 但是 subprocess 模块的文档包含很多有用的信息。