스택큐힙리스트

온라인 비디오 URL에서 파일/스트리밍 응답 반환하기 (FastAPI에서) 본문

카테고리 없음

온라인 비디오 URL에서 파일/스트리밍 응답 반환하기 (FastAPI에서)

스택큐힙리스트 2024. 1. 26. 15:44
반응형

저는 FastAPI를 사용하여 googlevideo.com에서 비디오 응답을 반환하고 있습니다. 다음은 사용하고 있는 코드입니다:


@app.get(params.api_video_route)
async def get_api_video(url=None):
def iter():
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as resp:
yield from io.BytesIO(resp.read())
return StreamingResponse(iter(), media_type=video/mp4)

하지만 이것은 작동하지 않습니다


이것을 Python FastAPI로 변환하고 싶습니다:


app.get(/download-video, function(req, res) { 
http.get(decodeURIComponent(req.query.url), function(response) {
res.setHeader(Content-Length, response.headers[content-length]);
if (response.statusCode >= 400)
res.status(500).send(Error);
response.on(data, function(chunk) { res.write(chunk); });
response.on(end, function() { res.end(); }); }); });

답변 1

저는 비슷한 문제를 겪었지만 모두 해결했습니다. 주요 아이디어는 requests.Session()을 사용하여 세션을 생성하고, 모든 콘텐츠를 가져오고 한 번에 반환하는 대신 하나씩 청크를 생성하여 반환하는 것입니다. 이렇게하면 메모리 문제 없이 매우 좋은 결과가 나옵니다.


@ app.get (params.api_video_route)
async def get_api_video (url = None):

def iter ():
session = requests.Session()
r = session.get(url, stream=True)
r.raise_for_status()

for chunk in r.iter_content(1024 * 1024):
yield chunk

return StreamingResponse(iter (), media_type = video/mp4)

답변 2

FastAPI는 Python으로 작성된 웹 프레임워크로, 웹 애플리케이션을 빠르고 높은 성능으로 개발할 수 있도록 지원합니다. 이 프레임워크를 사용하면 웹 서버의 자원을 효율적으로 활용하고, 일정한 요청과 응답 처리 시간을 보장할 수 있습니다.
빠른 응답 시간과 높은 처리량 덕분에 FastAPI는 온라인 비디오 URL로부터 파일 또는 스트리밍 응답을 반환하는 데에도 사용될 수 있습니다. 이러한 기능을 활용하면 온라인 비디오 URL을 사용자에게 효율적으로 전송할 수 있으며, 이에 따라 애플리케이션의 성능을 향상시킬 수 있습니다.
비디오 파일이나 스트리밍을 FastAPI를 통해 반환하는 방법은 비교적 간단합니다. 첫 번째 단계는 온라인 비디오 URL을 가져오고 해당 URL을 FastAPI `/video` 엔드포인트에 전달하는 것입니다. 이 URL은 클라이언트가 요청한 비디오 파일에 대한 위치를 가리킵니다. FastAPI는 이 URL을 기반으로 원격 서버로부터 비디오 파일을 가져옵니다.
두 번째 단계는 가져온 비디오 파일을 FastAPI 응답 형식으로 변환하는 것입니다. 이 작업은 비디오 파일의 형식에 따라 달라질 수 있으며, 일반적으로는 파일을 바이트 스트림으로 변환하여 반환합니다. 이는 `response` 객체를 사용하여 처리할 수 있습니다.
```python
from fastapi import FastAPI, Response
import requests
app = FastAPI()
@app.get(/video)
def get_video(response: Response):
video_url = https://example.com/video.mp4 # Replace with the actual video URL
video_bytes = requests.get(video_url).content
response.headers[Content-Disposition] = attachment; filename=video.mp4
response.headers[Content-Type] = video/mp4
return video_bytes
```
위의 예시 코드에서 `get_video` 함수는 비디오 파일을 가져오고 FastAPI의 `Response` 객체를 사용하여 해당 비디오를 스트림으로 반환합니다. 추가로 `Content-Disposition` 헤더를 사용하여 파일을 다운로드 받을 수 있도록 지정하고, `Content-Type` 헤더를 `video/mp4`로 설정하여 클라이언트에게 올바른 파일 형식을 알려줍니다.
이제, 클라이언트는 `/video` 엔드포인트에 GET 요청을 보내면 서버가 해당 URL의 비디오 파일을 반환할 것입니다. 이를 통해 클라이언트는 FastAPI를 통해 웹 애플리케이션의 성능을 향상시키고, 비디오 파일을 효율적으로 처리할 수 있습니다.
FastAPI를 사용하여 온라인 비디오 URL로부터 파일 또는 스트리밍 응답을 반환하는 방법에 대해 알아보았습니다. 이를 통해 클라이언트에게 올바른 파일 형식과 내용을 제공하고, 웹 애플리케이션의 성능을 최적화할 수 있습니다. FastAPI의 간결하고 빠른 개발 방식은 개발자가 효과적인 웹 서비스를 제작할 수 있도록 도와줍니다.

반응형
Comments