Real Time Streaming Protocol
실시간 스트리밍 프로토콜(Real Time Streaming Protocol, RTSP)은 IETF가 1998년에 개발한 통신 규약이다. RFC 2326에 정의되어 있다. RTSP는 스트리밍 시스템에 사용되며, 미디어 서버를 원격으로 제어할 때 쓰인다. 명령어는 "PLAY", "PAUSE" 같이 VCR 동작하고 비슷하며 시간 정보를 바탕으로 서버에 접근을 한다.
실제 미디어 스트리밍 데이터를 전송하지는 않는다. 대부분의 RTSP 서버는 RTP 규약을 사용해서 전송 계층으로 실제 오디오/비디오 데이터를 전송한다.
Categories
RTSP 명령어
RTSP 규약은 HTTP 규약하고 비교해 볼 때, 문법이나 동작이 비슷하다. 하지만, HTTP 가 무상태형(stateless)인 반면에 RTSP는 상태형(stateful) 규약이다. 임의의 세션 ID는 세션 추적할 때마다 사용되는데, 이 방법은 영구 TCP 연결을 필요로 한다. RTSP 메시지는 클라이언트에서 서버로 간다. 만약, 서버에서 오류가 발생한다면 서버는 오류에 대한 응답 코드를 클라이언트로 보내준다. 기본적인 RTSP 요청 메시지는 아래와 같고, 기본 포트는 554번이다.
- DESCRIBE
- DESCRIBE 요청에는 URL (rtsp://...)이 포함된다. 기본 포트 554번은 UDP, TCP 둘 다에 사용된다. DESCRIBE에 대한 응답 메시지에는 요청한 것에 대한 설명도 포함되는데, 대개 SDP 형태를 갖추고 있다.
- SETUP
- SETUP 요청은 단일 미디어 스트림이 전송되어야 하는지 규정한다. 이 요청은 PLAY 요청 하기 전에 마쳐야한다. 그리고 요청할 때 미디어 스트림 URL과 전송점을 포함해야 한다. 전송점에는 RTP 데이터(오디오/비디오), RTCP 데이터(메타 정보)를 전송받기 위한 포트 번호도 포함된다.
- PLAY
- PLAY 요청은 하나 또는 모든 미디어 스트림을 재생시킨다. PLAY 명령은 다중 요청이 가능하다. 모든 미디어 스트림 재생을 위해서는 URL 집합체가 요청에 포함되어야 한다. 재생 범위를 구체적으로 지정할 수도 있다. 만약에 재생 범위를 지정하지 않으면, 미디어 처음부터 끝까지 재생한다. 또, 일시 정지 상태라면 일시 정지된 위치부터 재생 된다.
- PAUSE
- PAUSE 요청은 하나 또는 모든 미디어 스트림에 대해서 일시 중지를 명령한다. PLAY 요청으로 다시 재시작 할 수 있다. 이 요청 메시지에는 미디어 스트림 URL이 포함되어야 한다. 일시 정지를 할 때 범위를 구체적으로 지정할 수도 있다.
- RECORD
- RECORD 요청은 녹화를 위한 명령어이다.
- TEARDOWN
- TEARDOWN 요청은 세션을 종료하기 위한 명령어이고, 모든 미디어 스트림의 재생을 중단하고 서버에 있는 관련 데이터에 걸린 모든 세션도 해제한다.
Packet flow
단일 포트로 RTSP와 RTP를 함께 보낼 수 있는듯 하여, Wireshark를 사용하여 패킷을 조사했다.
No. Time Source Destination Protocol Length Info
5 0.000388 127.0.0.1 127.0.0.1 RTSP 141 OPTIONS rtsp://0.0.0.0:8554/live.sdp RTSP/1.0
7 0.003347 127.0.0.1 127.0.0.1 RTSP 257 Reply: RTSP/1.0 200 OK
9 0.004811 127.0.0.1 127.0.0.1 RTSP 167 DESCRIBE rtsp://0.0.0.0:8554/live.sdp RTSP/1.0
11 0.087192 127.0.0.1 127.0.0.1 RTSP/SDP 698 Reply: RTSP/1.0 200 OK
13 0.095190 127.0.0.1 127.0.0.1 RTSP 204 SETUP rtsp://0.0.0.0:8554/live.sdp/stream=0 RTSP/1.0
15 0.096064 127.0.0.1 127.0.0.1 RTSP 281 Reply: RTSP/1.0 200 OK
17 0.097255 127.0.0.1 127.0.0.1 RTSP 185 PLAY rtsp://0.0.0.0:8554/live.sdp/ RTSP/1.0
19 0.098056 127.0.0.1 127.0.0.1 RTSP 275 Reply: RTSP/1.0 200 OK
39 10.419850 127.0.0.1 127.0.0.1 RTSP 167 PAUSE rtsp://0.0.0.0:8554/live.sdp/ RTSP/1.0
41 10.421940 127.0.0.1 127.0.0.1 RTSP 179 Reply: RTSP/1.0 200 OK
43 10.422700 127.0.0.1 127.0.0.1 RTSP 196 SETUP rtsp://0.0.0.0:8554/live.sdp/stream=0 RTSP/1.0
45 10.490884 127.0.0.1 127.0.0.1 RTSP 253 Reply: RTSP/1.0 200 OK
47 10.492739 127.0.0.1 127.0.0.1 RTSP 185 PLAY rtsp://0.0.0.0:8554/live.sdp/ RTSP/1.0
49 10.494810 127.0.0.1 127.0.0.1 RTSP 275 Reply: RTSP/1.0 200 OK
51 10.496769 127.0.0.1 127.0.0.1 RTP 2251 PT=DynamicRTP-Type-96, SSRC=0x19292F8, Seq=3488, Time=1765483086, PT=DynamicRTP-Type-96, SSRC=0x19292F8, Seq=3489, Time=1765483086, PT=DynamicRTP-Type-96, SSRC=0x19292F8, Seq=3490, Time=1765483086, PT=DynamicRTP-Type-96, SSRC=0x19292F8, Seq=3491, Time=1765483086, PT=DynamicRTP-Type-96, SSRC=0x19292F8, Seq=3492, Time=1765483086
53 10.496959 127.0.0.1 127.0.0.1 RTP 2864 PT=DynamicRTP-Type-96, SSRC=0x19292F8, Seq=3493, Time=1765483086, PT=DynamicRTP-Type-96, SSRC=0x19292F8, Seq=3494, Time=1765483086
55 10.497185 127.0.0.1 127.0.0.1 RTP 2864 PT=DynamicRTP-Type-96, SSRC=0x19292F8, Seq=3495, Time=1765483086, PT=DynamicRTP-Type-96, SSRC=0x19292F8, Seq=3496, Time=1765483086
55번 RTP패킷을 보면 아래와 같다.
No. Time Source Destination Protocol Length Info
55 10.497185 127.0.0.1 127.0.0.1 RTP 2864 PT=DynamicRTP-Type-96, SSRC=0x19292F8, Seq=3495, Time=1765483086, PT=DynamicRTP-Type-96, SSRC=0x19292F8, Seq=3496, Time=1765483086
Frame 55: 2864 bytes on wire (22912 bits), 2864 bytes captured (22912 bits) on interface 0
Null/Loopback
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
Transmission Control Protocol, Src Port: 8554, Dst Port: 52409, Seq: 6830, Ack: 854, Len: 2808
RTSP Interleaved Frame, Channel: 0x00, 1400 bytes
Real-Time Transport Protocol
RTSP Interleaved Frame, Channel: 0x00, 1400 bytes
Real-Time Transport Protocol
RTSP Interleaved Frame을 통하여 RTP 패킷이 전달되는 것을 확인할 수 있다.
It is not a part of RTSP OPTION response but an option allowing to send RTP by the same TCP channel as controlling RTSP session, see RFC 2326
RTSP OPTION 응답의 일부는 아니지만 RTSP 세션을 제어하는 것과 동일한 TCP 채널로 RTP를 보낼 수있는 옵션입니다. (RFC 2326 참조)
Libraries and examples
가장 추천
- aiortsp - An asyncio-based RTSP library (python)
-
rtsp-simple-server - ready-to-use RTSP / RTMP server and proxy that allows to read, publish and proxy video and audio streams (Go)
- Docker를 사용하여 간단히 스트리밍 가능:
docker run --rm -p 8554:8554 ullaakut/rtspatt
- https://github.com/Ullaakut/RTSPAllTheThings
그 밖 추천
- PyRTP - Python RTP Library (python) - https://gitlab.com/nickvsnetworking/pyrtp
Local Download
- RFC 2326 - Real Time Streaming Protocol (RTSP)
- https://tools.ietf.org/html/rfc2326
-
Rfc2326.txt - Rfc2326-ko.txt.zip (Google translate: en -> ko)
See also
- RTP
- RTCP
- FFmpeg
- gStreamer
- live555
- JRTPLIB
- WebRTC
- Session Description Protocol (SDP)
- Media Streaming
- Media Streaming#Demo video: Streaming 샘플 비디오 URL 모음
- Low Latency Streaming
Favorite site
- Wikipedia RTSP (en) 에 대한 설명
- RFC2326
- TTAE.IF-RFC2326 (한글번역)
- 정보통신기술용어해설 - Real Time Streaming Protocol (실시간 스트리밍 프로토콜)
- bcknightt - RTSP(Real Time Streamming Protocol)
- [추천] 7 ways to stream RTSP on the page 1 - Low Latency Streaming 항목 참조.
Guide
- (네트워크) RTSP(Real Time Streaming Protocol) 이란?
- (RTSP) curl 명령어로 IP Camera 상태 체크 예시
- RTSP 의 이해 (최고급) : 네이버 블로그 - 인터리브 모드에 대해
- RTSP ALG | Junos OS | 주니퍼 네트웍스
- RTSPTestServer 예제 분석 - 워크 플로우를 코드로 분석
- ffmpeg을 이용한 Point to Point 스트리밍 - Awesome Life
Programming
- [추천] Receiving RTSP stream using FFMPEG and OpenCV library
- Issues with OpenCV and RTSP
- OpenCV에서 네트워크 카메라(IP Camera) 읽기
- Stackoverflow: OpenCV and Network Cameras -or- How to spy on the neighbors?
- Jetson TK1: Gstreamer application RTSP stream to OPENCV processing
- FFmpeg H.264 RTSP Server Using Live555 (c++/Code on Git)
- Github: FFmpegRTSPServer (H264 RTSP server using FFmpeg and Live555) 2