RTSP (Real Time Streaming Protocol)
- 실제로 비디오, 오디오 등 데이터를 전송하지 않는다. (RTP가 실제 전송)
- 서버와 클라이언트 간 RTP 데이터 흐름을 제어하기 위한 프로토콜.
- 클라이언트가 재생하고 싶은 스트림 선택
- 스트림의 코덱정보, UDP 또는 TCP 기반 전송 방식 쿼리
- 스트림 세션 start, stop
RTSP 동작 과정
≫ OPTIONS
- 서버에서 제공하는 메서드를 얻는다.
≫ DESCRIBE
- 서버에게 요청할 미디어 개체의 설명을 얻는다.
≫ SETUP
- 미디어 스트림 전송을 위한 전송방식을 설정한다.
≫ PLAY
- 스트림 재생.
≫ RTP를 통해 스트림을 받아 재생.
≫ PAUSE
- 스트림 전송중단.
≫ TEARDOWN
- 세션을 완전히 없앤다.
RTP (Real-time Transport Protocol)
- 비디오, 오디오 등 데이터를 전송하기 위한 프로토콜.
- 미디어 데이터를 RTP Packet들로 Packetization 과정을 거친 후 전송한다.
- 시간 정보, 동기화 기능 제공.
RTP over UDP
- UDP를 통한 RTP는 UDP를 저수준 전송 프로토콜로 사용한다.
- UDP는 전송된 패킷이 올바르게 도착한다고 보장하지 않는다.
- UDP의 가장 큰 단점은 방화벽과 라우터 제한으로 인해 인터넷과 같은 이기종 네트워크를 통해 전송하는 것이 종종 불가능하다는 사실이다.
- RTP over UDP로 패킷 전달 시 UDP는 항상 최소 2개의 채널을 설정.
RTP over TCP
- RTP는 TCP를 통해서도 전송될 수 있다.
- RTSP SETUP 요청에서 클라이언트에 의해 TCP 방식으로 선택되면 스트리머는 RTSP 통신을 위해 이미 설정된 TCP 연결을 통해 RTP 패킷을 보낸다.
- TCP 전송은 UDP와 비교하여 프로토콜에 약간의 오버헤드가 있다.
- TCP는 신뢰할 수 있는 전송 프로토콜이며, 데이터가 클라이언트에 도착하도록 보장한다.
- TCP는 RTSP(제어)와 RTP(미디어) 모두 하나의 채널만 사용한다.
Payload type
RTP Packet에 넣을 수 있는 오디오 또는 비디오 형식을 페이로드라고 한다.
일반적으로 스트림에서 오디오 및 비디오 데이터는 압축된 형식으로 전송되기에
Payload type은 압축 형식인 Codec을 나타내게 된다.
Payload는 Payload Header로 시작한다.
Payload는 전달하려는 데이터의 codec type에 따라 Payload type을 부여한다
RTP는 각 codec에 대해 packetization하는 방법을 표준으로 정해놓았다.
각각의 format에 따라 데이터를 RTP packets에 넣는 규칙이 다르게 정의된다.
RTP packetization
전송해야 할 이미지 데이터가 RTP packet보다 사이즈가 클 경우 여러 조각으로 쪼개져서 packet에 담겨야 한다.
각각의 데이터는 RTP packet으로 wrapping되어 있는데 이는 RTP header와 이미지 데이터 조각으로 이루어져 있다.
RTP Packet의 RTP Header는 12바이트 길이를 갖는다.
RTP Header에 포함되는 정보
- RTP 프로토콜 버전
- 패킷 손실을 감지하기 위한 패킷(시퀀스) 카운터
- 재생시간 제어를 위한 타임스탬프
- RTP 스트림의 고유 식별자
RTP header 다음에는 이미지 데이터 조각이, 예를들어 JPEG 데이터였다면 8바이트 JPEG 전용 헤더가 나온다.
JPEG 전용 헤더에는 너비와 높이, 품질, 색상 형식 등 메타 데이터 정보가 담겨있고,
이미지가 RTP Packet으로 분할되어 전송될 정도로 데이터가 클 경우 이미지 조각 위치를 의미하는
fragment offset 정보도 포함한다.
UDP/TCP transport
RTP over TCP 방식의 전송은 RTP packet에 부가적인 조작이 필요하다.
왜냐하면 RTSP communication에 사용되는 TCP 연결을 동일하게 사용하여
클라이언트가 RTSP와 RTP packet을 서로 구별할 수 있어야 하기 때문이다.
부가적인 RTP over RTSP header라는 "demultiplexing" header를 삽입해준다.
// Prepare the first 4 byte of the packet. This is the Rtp over Rtsp header in case of TCP based transport RtpBuf[0] = '$'; // magic number
RtpBuf[1] = 0; // number of multiplexed subchannel on RTPS connection - here the RTP channel
RtpBuf[2] = (RtpPacketSize & 0x0000FF00) >> 8;
RtpBuf[3] = (RtpPacketSize & 0x000000FF);
...
RTP 패킷을 처리해야 할 입장인 클라이언트에서
같은 TCP 연결이라 RTSP나 RTP 패킷을 동시에 받을 수 있는 상황에서
매직 넘버인 $를 수신하면 패킷이 RTSP 데이터를 갖고 있지 않다는 것을 알 수 있게 된다.
참고 문서
https://www.medialan.de/usecase0001.html
'Technical Document > RTSP, RTP' 카테고리의 다른 글
RTSPTestServer 예제 분석 (0) | 2022.04.29 |
---|