RTSP and RTP – The Backbone of Video Streaming
RTSP와 RTP — 실시간 영상 스트리밍의 뼈대
RTSP는 영상 재생/중지를 제어하는 리모컨이고, RTP는 실제 영상 데이터를 UDP로 빠르게 쏟아붓는 배달부입니다.
Overview
챕터 3에서 WebSocket(TCP)과 RTSP(UDP)의 차이를 간략히 살펴봤습니다. 이 챕터에서는 RTSP와 그 짝꿍인 RTP를 깊이 이해합니다.
RTSP(Real-Time Streaming Protocol)는 영상 스트리밍을 제어하는 프로토콜입니다. 재생, 일시정지, 탐색(seek) 같은 명령을 서버에 전달합니다. 하지만 RTSP는 실제 영상 데이터를 전송하지 않습니다. 그 역할은 RTP(Real-time Transport Protocol)가 맡습니다.
RTP는 영상/음성 데이터를 UDP로 빠르게 전송합니다. 타임스탬프와 시퀀스 번호로 패킷 순서와 동기화를 관리합니다. IP 카메라, CCTV, 라이브 방송, 화상회의 시스템에서 RTSP+RTP 조합이 표준으로 쓰입니다.
- RTSP와 RTP의 역할 차이를 정확하게 설명할 수 있다
- WebSocket(TCP)과 RTSP/RTP(UDP)를 선택하는 기준을 설명할 수 있다
- OpenCV로 RTSP 스트림을 읽어오는 코드를 작성할 수 있다
- CCTV/IP 카메라 시스템에서 RTSP가 어떻게 쓰이는지 이해한다
Sections
RTSP: TV 리모컨 역할을 하는 제어 프로토콜
RTSP는 HTTP와 구조가 비슷합니다. DESCRIBE, OPTIONS, SETUP, PLAY, PAUSE, TEARDOWN 같은 메서드로 서버에 명령합니다. DESCRIBE로 스트림 정보(해상도, 코덱, 비트레이트)를 요청하고, SETUP으로 RTP 전송 채널을 설정하고, PLAY로 스트리밍을 시작합니다.
RTSP URL 형식은 rtsp://username:password@192.168.1.10:554/stream1 입니다. IP 카메라 대부분이 이 형식의 주소를 제공합니다. 포트 554가 RTSP 기본 포트입니다.
RTSP 자체는 TCP로 전송됩니다(신뢰성 있는 제어 명령 필요). 하지만 PLAY 명령 이후 실제 영상 데이터는 RTP가 UDP로 전송합니다. 제어(RTSP/TCP)와 데이터(RTP/UDP)를 분리한 설계입니다.
RTP: UDP로 영상을 빠르게 쏟아붓는 전송 프로토콜
RTP는 UDP 위에서 동작합니다. 각 RTP 패킷에는 시퀀스 번호(패킷 순서)와 타임스탬프(재생 시각)가 포함됩니다. 수신 측은 이 정보로 패킷 순서를 재조립하고 동영상을 올바른 속도로 재생합니다.
RTCP(RTP Control Protocol)는 RTP의 짝꿍입니다. 패킷 손실률, 지연 시간, 네트워크 상태를 주기적으로 보고합니다. 이 정보를 보고 서버는 비트레이트를 조절합니다(Adaptive Bitrate). 네트워크가 느리면 화질을 낮추고, 빠르면 화질을 높입니다.
비디오 코덱(H.264, H.265/HEVC, VP9)은 영상을 압축하는 방식입니다. RTP는 이 압축된 데이터를 그냥 전달하는 배달부입니다. 코덱이 압축율과 화질을, RTP가 전송 속도를, RTSP가 제어를 각각 담당합니다.
WebSocket vs RTSP: 언제 어느 것을 선택하는가
WebSocket(TCP): AI 분석 결과 텍스트, 채팅 메시지, 알림, 주식 호가. 데이터 무결성이 최우선. 한 글자라도 빠지면 의미가 달라지는 데이터.
RTSP/RTP(UDP): CCTV 실시간 모니터링, 라이브 스포츠 중계, IP 카메라. 최신 '현재 상황'이 최우선. 1초 전 프레임이 손실돼도 현재 프레임을 계속 보여주는 것이 중요.
챕터 1 다이어그램의 시스템에서 카메라 → 서버로 영상 원본을 전송할 때는 RTSP(UDP)를 쓰고, 서버의 AI가 분석한 텍스트 결과를 브라우저로 전달할 때는 WebSocket(TCP)을 씁니다. 데이터의 특성에 맞게 각각 최적의 프로토콜을 선택한 것입니다.
RTSP는 방송국 PD의 지시입니다. '카메라 1번 켜라(PLAY)', '잠깐 멈춰(PAUSE)', '3분 전 장면으로 돌아가라(SEEK)'. 실제 영상은 PD가 전달하지 않습니다.
RTP는 실제 영상 신호를 송출하는 장비입니다. 수천 개의 패킷으로 쪼개진 영상을 전파(UDP)에 실어 빠르게 쏘아 보냅니다. 일부 전파가 건물에 막혀 수신자에게 닿지 않아도(패킷 손실) 방송은 멈추지 않습니다. 그 순간 화면이 살짝 깨질 뿐입니다.
WebSocket을 방송국 자막 시스템으로 비유해봅니다. 자막 한 글자라도 빠지면 시청자가 내용을 오해할 수 있습니다. 그래서 자막은 TCP(WebSocket)로 완벽하게 전달해야 합니다. 반면 영상 자체는 1~2프레임 손실이 있어도 시청자는 눈치채지 못합니다.
OpenCV로 RTSP 스트림에서 프레임을 읽어오는 코드입니다. 실제 RTSP 카메라가 없어도 테스트할 수 있도록 YouTube 스트림(yt-dlp)을 대체 소스로 사용하는 패턴도 포함합니다. (pip install opencv-python)
import cv2
import time
def read_rtsp_stream(rtsp_url: str, max_frames: int = 30):
"""RTSP 스트림에서 프레임을 읽어 저장합니다."""
# VideoCapture가 RTSP URL을 받아 스트림 연결
# 내부적으로 OpenCV가 RTSP/RTP 핸드셰이크를 처리함
cap = cv2.VideoCapture(rtsp_url)
if not cap.isOpened():
print(f"스트림 연결 실패: {rtsp_url}")
return
print(f"스트림 연결 성공!")
print(f" 해상도: {int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))}x"
f"{int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))}")
print(f" FPS: {cap.get(cv2.CAP_PROP_FPS)}")
frames_read = 0
start_time = time.time()
while frames_read < max_frames:
ret, frame = cap.read() # ret=False면 스트림 끊김
if not ret:
print("스트림 끊김 — 재연결 시도...")
cap.release()
cap = cv2.VideoCapture(rtsp_url) # 재연결
continue
frames_read += 1
# 실제 AI 파이프라인에서는 여기서 프레임을 처리
# e.g., model.infer(frame)
if frames_read % 10 == 0:
elapsed = time.time() - start_time
fps_actual = frames_read / elapsed
print(f" 프레임 {frames_read}: 실제 처리 FPS={fps_actual:.1f}")
cap.release()
print(f"완료: 총 {frames_read}프레임 처리, {time.time()-start_time:.1f}초")
# 실제 IP 카메라 RTSP URL 예시:
# rtsp_url = "rtsp://admin:password@192.168.1.100:554/stream1"
# 테스트용: 로컬 웹캠을 RTSP처럼 사용
rtsp_url = 0 # 0 = 기본 웹캠
read_rtsp_stream(rtsp_url, max_frames=30) cv2.VideoCapture()는 RTSP URL을 받아 내부에서 RTSP DESCRIBE→SETUP→PLAY 과정과 RTP 수신을 모두 자동 처리합니다. ret, frame = cap.read()에서 ret이 False면 패킷 손실이나 연결 끊김이 발생한 것입니다. 실시간 영상 처리 파이프라인에서는 이 루프 안에서 각 프레임을 AI 모델에 넘깁니다.
✅ 시니어가 보는 것
- RTSP(제어)와 RTP(데이터 전송)의 역할 분리 이해
- H.264/H.265 코덱과 전송 프로토콜의 관계
- 패킷 손실 시 영상 처리 방식(손실 허용 vs TCP 재전송) 트레이드오프
⚠️ 레드 플래그
- RTSP와 RTP를 같은 것으로 혼동
- UDP 기반이라 '신뢰성이 없어 CCTV에 부적합하다'는 잘못된 이해
🎤 예상 인터뷰 질문
- RTSP와 RTP의 역할을 각각 설명해주세요. 왜 분리된 프로토콜로 설계됐을까요?
- 실시간 CCTV 모니터링에 WebSocket 대신 RTSP/RTP를 쓰는 이유는 무엇인가요?
Key Takeaways
RTSP = 리모컨
재생/중지/탐색 제어 명령 전달. TCP로 신뢰성 있게 전송. 포트 554.
RTP = 배달부
실제 영상/음성 데이터를 UDP로 빠르게 전송. 타임스탬프+시퀀스번호
RTCP = 품질 리포터
패킷 손실률, 지연 시간 보고 → Adaptive Bitrate 조절에 활용
UDP 선택 이유
1초 전 프레임 완벽 복구보다 지금 이 순간의 영상이 중요하기 때문
WebSocket과 구분
결과 텍스트는 WebSocket(TCP), 영상 원본은 RTSP/RTP(UDP)
OpenCV 지원
cv2.VideoCapture(rtsp_url)로 RTSP 스트림 자동 처리
RTSP URL 형식
rtsp://user:pass@IP:554/stream — IP 카메라의 표준 접속 방식