검색하기귀찮아서만든블로그

[python] fastAPI 카메라 MJEPG 스트리밍 본문

개발

[python] fastAPI 카메라 MJEPG 스트리밍

hellworld 2021. 10. 9. 10:15

fastAPI 로 웹서버를 구성한 후에 

간단하게 카메라 영상을 웹 브라우저에서 스트리밍할 수 있는 API를 작성해 보았다.

영상 스트리밍은 MJPEG 방식으로 송신하였다. (JPEG 이미지 frame 을 연속적으로 보내는 방식)

 

[환경]

 - windows 11 x64

 - VisualStudioCode 

 - python 3.9.7

 - venv

 - fastAPI, uvicorn, opencv-python package

 

1. 카메라 디바이스에서 이미지를 수신하기 위하여 opencv 패키지를 설치한다.

 > pip install opencv-python

 

2. 카메라를 오픈하고 영상을 JPEG frame 형태로 변환하는 함수를 작성하였다.

  1) opencv 를 사용하여 카메라를 오픈한다.

  2) mat 포맷의 이미지를 받는다.

  3) 이미지는 JPEG 포맷으로 변환한다.

  4) MJPEG 프로토콜에 맞게 boundary (PNPframe) 를 앞에 붙여주고 JPEG 이미지 데이터를 뒤에 붙여준다.

  5) 이미지 frame 을 한 장씩 실시간으로 송출하기 위해서 yield 를 사용하여 데이터를 반환한다. (비동기 처리)

3. 영상 스트리밍을 위해 video 라는 API를 추가한다.

  - MJEPG 규격에 맞는 헤더 정보를 입력해주고 프레임 구분 용도로 사용할 boundary (PNPframe)값을 지정한다.

  - fastAPI 는 StreamingResponse 함수를 제공해서 비동기 데이터 송출에 유용하게 사용할 수 있다.

  - 2에서 작성한 getCameraStream 함수를 통해서 이미지를 실시간(비동기)으로 받아서 송출한다.

4. 시연

 - Edge 브라우저 

 

코드 참고 : FastAPI 실시간 영상 스트리밍 OpenCV (elomaot.blogspot.com)