본문 바로가기
IT/Python

Django와 라즈베리파이 이용한 실시간 영상 스트리밍 서버 구축(MQTT 프로토콜)

by Cyber_ 2024. 4. 7.

0. 개요

본 글에서는 DJango 웹 프레임워크와 라즈베리파이를 사용하여 실시간 영상 스트리밍 서버를 구축하는 방법을 소개하겠습니다.

  • Django는 웹 인터페이스와 서버 관리를 담당
  • 라즈베리파이의 PiCamera는 영상 스트리밍
  • 1. 사용된 툴
  • 라즈베리파이, PiCamera, Django, Python31) view.py
  • class CamView(TemplateView): template_name = "cam.html" def get_context_data(self): context = super().get_context_data() context["mode"] = self.request.GET.get("mode", "#") return context def stream(request): mjpegstream = MJpegStreamCam() return StreamingHttpResponse(mjpegstream, content_type='multipart/x-mixed-replace;boundary=--myboundary')
  • 2. 구현
  • TempateView: 템플릿을 랜더링하는 기능을 가진 클래스 기반 뷰 기본적으로 get 요청을 처리
  • request.GET.get: GET은 URL의 쿼리스트링을 나타내는 딕셔너리와 유사한 객체, get메서도는 딕셔너리에서 키에 해당ㅎ아는 값을 찾는 메서드
  • 예를들어 URL이 http://example.com?mode=streaming일 때, request.GET.get("mode", "#")는 "mode"라는 키에 해당하는 값을 찾아 반환
    mode가 없으면 # 반환
  • StreamingHttpResponse: Django의 HTTP 응답 클래스중 하나, 크거나 스트리밍되는 콘텐츠를 처리할 때 사용, HttpResponse와 달리 StreamingHttpResponse는 응답내용을 여러 조각으로 나누어 전송할 수 있으므로 대용량 데이터나 실시간 스트리밍에 적합

2) picam.py

class MJpegStreamCam:
	def __init__(self, framerate=25, width=640, height=480):
     self.size = (width, height) # 카메라 해상도 튜플형태로 저장
     self.framerate = framerate  # 카메라의 프레임 속도
     self.camera = PiCamera() # Picamera 인스턴스 생성 및 설정
     self.camera.resolution = self.size
     self.camera.framerate = self.framerate

     self.client = mqtt.Client() # mqtt 클라언트 생성
     self.host_id = '' # MQTT 브로커의 호스트주소와 아래는 포트
     self.port = 1883

     try: # MQTT 프로토콜을 통한 카메라 연결
         self.client.on_connect = self.on_connect
         self.client.on_message = self.on_message
         self.client.connect(self.host_id, self.port, 60)
         self.client.loop_start()
     except Exception as err:
         print(f"ERR ! /{err}/")

   def __del__(self):
       self.camera.close()

3) urls.py

urlpatterns = [
    path('', CamView.as_view()), # CamViw 클래스 기반 뷰를 호출
    path('stream/', stream, name='stream'),
]

4) cam.html

  • 스트리밍 모드로 전환하는 링크: ().
    <!DOCTYPE html>
    <html lang="ko">
    <head>
       <meta charset="UTF-8">
       <meta name="viewport" content="width=device-width, initial-scale=1.0">
       <title>Document</title>
    </head>
    <body>
       <div>
           <a href="?mode=stream"></a>
       </div>
       <br>
           <img id="image" src="{% url 'stream' %}"/>
    </body>
    </html>
### 3. 부연 설명

#### 1) MJpeg 이란?
- Motino JPEG 또는 MJPEG 스틸 사진을 위한 JPEG 표준의 비디오 형식
- 실시간 스트리밍에 적합하다. 
> 단순성과 호환성, 낮은 지연시간, 강력한 오류 복구,
다른형식으론
H.264: MJpeg에 비해 더 효울적인 압출력, 대역폭이 낮은 환경에서 더 나은 영상 품질을 제공
WebRTC: 실시간 커뮤니케이션을 위해 설계된 프로토콜, 양방향 통신이 필요한 경우 적합, 구현이 복잡할 수도 있으며 어떤 환경에선 지원되지 않으 수 있음
HLS: HLS(HTTP Live Streaming): 대역폭 조절이 가능하며, 다양한 장치에서 널리 주언, 지연시간이 MJpeg보다 길수 있지만 더 안정적인 스트리밍을 제공

#### 2) MQTT Protocol이란?
- 머신대 머신 통신에 사용되는 표준 기반 메시징 프로토콜
- 주로 IoT분야에서 사용되는 통신규약
- 경량이며 낮은 대역폭 환경에서도 효과적으로 작동

#### 3) 실시간 스트리밍이 가능한 카메라
- 스마트폰: 웹캠으로 사용할 수 있게 해주는 다양한 앱이 존재
- USB 웹캠: 라즈베리파이와 직접 연결 가능, 리눅스 환경과 잘 호환
- IP 카메라: IP카메라는 네트워크를 통해 영상을 전송
- 이 외: 프르토콜 호환성을 확인해야한다. 해당 카메라가 전송하는 영상의 형식이나 프로토콜이 서버에서 지원