目的
Module-LLMでmp4を再生してhttp経由でPCのブラウザに送ってみました。
LLM Moduleでmp4を再生してhttp経由でPCのブラウザに送ってみました。
— nnn (@nnn112358) November 23, 2024
UART転送を見慣れた後には普通に早い… pic.twitter.com/WSXlLlgvsw
PCのブラウザに画像を送る
Module-LLMのrootアカウントにログインし、pipでOpenCVとFastAPIをインストールします。
# apt install libopencv-dev
# pip install opencv-python fastapi
# python3 send_http_mp4.py
このプログラムはFastAPIフレームワークを利用してビデオストリーミングサーバーを実装したものです。指定されたビデオファイルを読み込み、フレームごとにリサイズしてブラウザにストリーミング配信します。
処理の流れとしては、まずFastAPIのアプリケーションインスタンスを作成し、ビデオ処理のための補助関数として、入力フレームを320x240ピクセルにリサイズするresize_frame
関数を定義します。続いて、ビデオストリーミングの核となるget_video_stream
関数では、OpenCVを使用してビデオファイルを読み込み、フレームごとに処理を行います。各フレームはリサイズされ、JPEGフォーマットにエンコードされ、マルチパート形式でストリームデータとして生成されます。
ウェブブラウザで http://localhost:8888/video にアクセスすることで、ストリーミングされるビデオを視聴することができます。
from fastapi import FastAPI, Response
from fastapi.responses import StreamingResponse
import cv2
import numpy as np
from typing import Generator
import time
app = FastAPI()
def resize_frame(frame: np.ndarray, width: int = 320, height: int = 240) -> np.ndarray:
return cv2.resize(frame, (width, height), interpolation=cv2.INTER_AREA)
def get_video_stream(video_path: str) -> Generator[bytes, None, None]:
video = cv2.VideoCapture(video_path)
try:
while True:
success, frame = video.read()
if not success:
break
frame = resize_frame(frame)
time.sleep(0.01)
_, buffer = cv2.imencode('.jpg', frame)
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + buffer.tobytes() + b'\r\n')
finally:
video.release()
@app.get("/video")
async def video_endpoint():
video_path = "./video.mp4"
return StreamingResponse(
get_video_stream(video_path),
media_type='multipart/x-mixed-replace; boundary=frame'
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8888)