Android (안드로이드)

[Android] RTSP - 실시간 스트리밍 프로토콜

Oscar:) 2024. 11. 27. 20:00
728x90

 

 

 

안드로이드 카테고리 포스팅이라기엔 뭐하지만,

안드로이드 환경에서의 RTSP 통신이 최종 목적이기에 이곳에 포스팅한다.

 

RTSP에 대해 알아보자.

 

 

 


 

 

✅ RTSP 란?

 

Real Time Streaming Protocol 의 약자로, 실시간 스트리밍 프로토콜이라 할 수 있다.

 

스트리밍 미디어 서버를 제어할 목적으로 설계된 네트워크 제어 프로토콜이다.

조금 더 자세히 말하면, 종단점들 간에 미디어 세션을 확립하고 제어하기 위해 사용된다.

*종단점 : End To End, 서버와 클라이언트라고 생각해볼 수 있다.

 

즉, 제어가 주 목적이기에 스트리밍 데이터 전송 자체는 RTSP의 역할이 아니다.

스트림 전송은 주로 RTP(실시간 전송 프로토콜)를 사용한다.

 

 

 

 

 

✅ RTSP의 stateful 특성

 

 RTSP와 HTTP는 유사한 점이 많다.

 

기본적으로 클라이언트와 서버간에 통신이 이루어진다는 점,

서버가 응답을 성공했을 때 200 OK 로 응답하는 점 등

 

구조적, 문법적으로도 유사한 점을 확인해볼 수 있다.

하지만 확연히 다른 점도 존재한다.

 

- RTSP의 기본 전송 계층 포트 번호는 554번을 사용한다. (HTTP는 80포트)

- RTSP는 미디어를 제어하는데 보다 유용한 시퀀스를 정의한다.

- HTTP는 무상태성(stateless) / RTSP는 상태성(stateful)

 

 

 

여기서 중요한 점은 RTSP의 stateful 특징이다.

 

stateful 하다면 서버는 클라이언트의 이전 요청을 모두 기억해야 하는데,

세션 정보를 활용하여 작업을 수행하기 때문에 가능하다.

 

클라이언트와 서버간 통신이 이루어지는 모습을 보며 확인해보자.

 

 

 

 

 

✅ RTSP 명령어

 

클라이언트가 서버로 요청할 때는 정해진 명령어를 사용해야 한다.

 

 

● OPTIONS

 

서버가 수락할 요청 타입을 반환해준다.

사실상 첫 번째 순서의 요청 명령어라고 볼 수 있다.

C->S:  OPTIONS rtsp://example.com/media.mp4 RTSP/1.0
       CSeq: 1
       Require: implicit-play
       Proxy-Require: gzipped-messages

S->C:  RTSP/1.0 200 OK
       CSeq: 1
       Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE

 

위 처럼 서버의 응답으로 DESCRIBE ... PAUSE 까지 5개의 타입을 받았다면

해당 명령어만 요청할 수 있다.

 

 

 

 

 

● DESCRIBE

 

서버가 관리 가능한 데이터의 유형을 반환해준다.

이 응답은 보통 세션 기술 프로토콜(SDP) 포맷으로 이루어져 있다.

C->S: DESCRIBE rtsp://example.com/media.mp4 RTSP/1.0
      CSeq: 2

S->C: RTSP/1.0 200 OK
      CSeq: 2
      Content-Base: rtsp://example.com/media.mp4
      Content-Type: application/sdp
      Content-Length: 460

      m=video 0 RTP/AVP 96
      a=control:streamid=0
      a=range:npt=0-7.741000
      a=length:npt=7.741000
      a=rtpmap:96 MP4V-ES/5544
      a=mimetype:string;"video/MP4V-ES"
      a=AvgBitRate:integer;304018
      a=StreamName:string;"hinted video track"
      m=audio 0 RTP/AVP 97
      a=control:streamid=1
      a=range:npt=0-7.712000
      a=length:npt=7.712000
      a=rtpmap:97 mpeg4-generic/32000/2
      a=mimetype:string;"audio/mpeg4-generic"
      a=AvgBitRate:integer;65790
      a=StreamName:string;"hinted audio track"

 

스트리밍에 필요한 미디어 정보를 클라이언트가 인지하기 위해서 보내는 요청이라 볼 수 있다.

 

 

 

 

 

● SETUP

 

미디어 스트림이 어떻게 전송되어야 하는지 규정한다.

PLAY 요청을 전달하기 이전에 수행되어야 한다.

C->S: SETUP rtsp://example.com/media.mp4/streamid=0 RTSP/1.0
      CSeq: 3
      Transport: RTP/AVP;unicast;client_port=8000-8001

S->C: RTSP/1.0 200 OK
      CSeq: 3
      Transport: RTP/AVP;unicast;client_port=8000-8001;server_port=9000-9001;ssrc=1234ABCD
      Session: 12345678

 

이 부분부터 세션을 유지하기 시작하며 스트리밍이 관리된다.

 

 

 

 

 

● PLAY

 

미디어 스트림을 재생한다.

C->S: PLAY rtsp://example.com/media.mp4 RTSP/1.0
      CSeq: 4
      Range: npt=5-20
      Session: 12345678

S->C: RTSP/1.0 200 OK
      CSeq: 4
      Session: 12345678
      RTP-Info: url=rtsp://example.com/media.mp4/streamid=0;seq=9810092;rtptime=3450012

 

 

 

 

 

● PAUSE

 

미디어 스트림을 일시적으로 중지한다.

C->S: PAUSE rtsp://example.com/media.mp4 RTSP/1.0
      CSeq: 5
      Session: 12345678

S->C: RTSP/1.0 200 OK
      CSeq: 5
      Session: 12345678

 

 

 

 

 

● TEARDOWN

 

미디어 스트림을 종료(세션 종료) 하기 위해 사용된다.

C->S: TEARDOWN rtsp://example.com/media.mp4 RTSP/1.0
      CSeq: 6
      Session: 12345678

S->C: RTSP/1.0 200 OK
      CSeq: 6

 

 

 

 

 

 

위 요청·응답들에 포함된 필드 요소를 간단히 짚어본다.

 

- CSeq

클라이언트가 요청의 순서를 파악하기 위해, 메세지의 순서를 보장하기 위해 사용된다.

클라이언트가 직접 관리하며, 매 요청마다 1씩 증가시켜서 요청을 전송해야 한다.

서버에서도 매 응답마다 요청에 포함된 동일한 CSeq를 포함하여 응답한다.

 

 

- Session

위 stateful 특성에서 설명한 세션의 ID 개념이며,

서버가 클라이언트를 기억하기 위한 식별자의 역할이다.

 

SETUP 요청부터 유지되며 CSeq와 함께 

TEARDOWN 이전까지의 요청과 응답에서 포함된다.

 

OPTION, DESCRIBE 요청에서는 세션을 관리하지 않는 것을 확인할 수 있는데,

이는 위 2가지 요청까지의 과정에서는 stateless 라고 볼 수 있다.

 

 

 

 

 

 

 


 

 

 

RTSP에 대해 가볍게 알아보았다.

 

다음 포스팅에서는 안드로이드 환경에서 RTSP 스트리밍을 진행해보자.

 

 

 

 

 

728x90