通过FastApi到Web浏览器将多个视频播放导致HTTP请求到失速

问题描述 投票:0回答:1
我正在附上一个最小可再现的示例,但是我无法将链接附加到视频流本身。我会注意到,原始流没有任何问题,它们直接以任何数量工作。

import uvicorn import httpx from fastapi import FastAPI from fastapi.responses import StreamingResponse app = FastAPI() async def proxy_mjpeg_stream(url: str): async with httpx.AsyncClient() as client: try: async with client.stream("GET", url) as stream: async for chunk in stream.aiter_bytes(): if chunk: yield chunk except httpx.ReadTimeout as ER: print(f'ERROR ReadTimeout - {url=} - {ER}') @app.get("/get_stream") async def get_stream(url: str): if url: headers = { "Content-Type": 'multipart/x-mixed-replace; boundary=frame', } return StreamingResponse(proxy_mjpeg_stream(url), headers=headers) if __name__ == "__main__": uvicorn.run(app)

您指出,您正在通过Web浏览器测试应用程序,您应该知道,每个浏览器都具有与给定主机名的并行连接的特定限制(以及一般而言)。该限制是硬编码的 - 例如,在Chrome和Firefox中,即6岁 - 看起来很敬畏。

因此,如果一个通过Chrome/Firefox打开了与同一域名的6个并行连接,则所有后续请求将被停滞并排队,直到有连接可用(即,当请求完成/接收到响应时)。

您可以使用python客户端,如this Answers中所示,以测试您的应用程序。另外,正如链接的答案中指出的那样,在与同一端点打开新连接时,您应该从与浏览器的主session

隔离的tab中做到这一点;否则,成功的请求可能会被浏览器(即在客户端端)阻止,因为浏览器可能会在发送下一个请求之前等待对服务器上一个请求的响应(例如,用于缓存目的)。
最终,请查看this Answer
如何在应用程序启动时创建可重复使用的HTTP客户端,而不是每次称为端点时创建一个新实例。
python browser video-streaming fastapi http-live-streaming
1个回答
3
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.