为什么我的 FastAPI 进程被暂停,如何避免这种情况?

问题描述 投票:0回答:1

我正在开发一个使用 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"
python ffmpeg terminal subprocess fastapi
1个回答
0
投票

subprocess.run
阻止当前进程。 换句话说,您的脚本将停止在该行,直到运行命令完成并且新进程终止。 这是有记录的行为。

使用 asyncio 无法解决问题,因为您尝试使用 asyncio 运行的任何函数也将在当前进程中运行。 在这种情况下,将会发生相同的阻塞行为。

您需要做的是将

subprocess.run(cmd)
替换为如下内容:

process2 = subprocess.Popen(cmd)

这两个进程现在将同时运行。 对象“process2”将是 subprocess.Popen 的实例,并将包含可用于与新进程交互的方法。

我无法运行你的程序,所以我不能更具体。 但是 subprocess 模块的文档包含很多有用的信息。

© www.soinside.com 2019 - 2024. All rights reserved.