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카메라는 네트워크를 통해 영상을 전송
- 이 외: 프르토콜 호환성을 확인해야한다. 해당 카메라가 전송하는 영상의 형식이나 프로토콜이 서버에서 지원
'IT > Python' 카테고리의 다른 글
Django Rest Framework(DRF)를 이용한 API 뷰 구현 (0) | 2024.04.08 |
---|---|
Django, 테스트코드 작성법 (1) | 2024.04.07 |
Django, MVT 패턴외에 다른 패턴이 사용 가능할까? (0) | 2024.04.07 |
Django, gunicorn + nginx를 사용하여 안정적으로 배포(Ubuntu) (1) | 2024.04.07 |
Django 배포의 시작, 웹 서버 선택하기:Ngnix vs Apache(Ubuntu, Apache 에러날 경우 아래 링크 확인) (1) | 2024.04.07 |