RTSP API

Oasis는 RTSP 서버를 지원합니다.

지원하는 영상 코덱은 H264, H265이며, 음성 코덱은 OPUS, AAC, MP3, PCM 입니다. 라이브 스트리밍 경우, OPUS가 디폴트 코덱으로 동작합니다.

헤더 파일

OasisRtsp.h

URL 양식

VLC 등 클라이언트 미디어 플레이어에서 Oasis RTSP 서버에 접속 시 사용하는 URL 양식은 아래와 같습니다.

rtsp://<서버주소>[:포트번호][/RTSP 스트리밍 세션 환경설정 key-value 목록]/<스트리밍 목적지 경로>
  • 서버주소 RTSP 서버주소입니다.

  • 포트번호를 사용하지 않을 경우, 554번이 기본값입니다.

  • RTSP 스트리밍 세션 환경설정 key-value 목록 은 옵션 사항으로 아래와 같은 key-value 를 지원합니다. 각 key-value 쌓은 "&"로 구분됩니다.

설명
resolution 영상 해상도입니다. 2160p, 1440p, 1080p, 720p, 480p 중 하나 값으로 지정할 수 있습니다. 카메라 영상 크기보다 작은 경우 스케일링 됩니다. 라이브 스트리밍에만 적용됩니다.
out-width 영상 가로 너비 입니다. 픽셀 단위입니다. 라이브 스트리밍에만 적용됩니다.
out-height 영상 세로 너비 입니다. 픽셀 단위입니다. 라이브 스트리밍에만 적용됩니다.
bitrate 영상 전송 bitrate 입니다. 라이브 스트리밍에만 적용됩니다.
fps 영상 fps 입니다. 라이브 스트리밍에만 적용됩니다.
audio-only 오디오만 스트리밍합니다. 따로 값이 필요하지 않습니다.
video-only 비디오만 스트리밍합니다. 따로 값이 필요하지 않습니다.

Note

resolutionout-width, out-height 가 동시에 있는 경우, resolution이 우선합니다.

  • 스트리밍 목적지 경로 는 스트리밍할 대상을 지정합니다. 라이브 카메라 경로와 파일 경로를 지정할 수 있습니다. 파일 경로의 경우, RTSP 서버 생성시 지정한 root-dir 내에 위치해야 합니다. 라이브 카메라 경로는 Live/<카메라 장치 ID>와 같습니다. <카메라 장치 ID>oasis::configCameras API에서 key-value map으로 지정한 값입니다. 파일 경로의 경우, root-dir을 기준으로 상대 경로를 지정합니다. 만일 영상 파일에 복수 개의 영상 트랙이 있을 경우, /<파일 경로>/TrackID=<트랙번호> 형식으로 특정 트랙을 지정할 수 있습니다.

아래는 URL 예입니다.

URL
설명
rtsp://192.168.10.2:554/example.mp4 192.168.10.2 서버의 554 포트에 접속하여 example.mp4 파일을 스트리밍 합니다.
rtsp://192.168.10.2:554/example.mp4/TrackID=1 192.168.10.2 서버의 554 포트에 접속하여 example.mp4 파일의 1번 트랙을 스트리밍 합니다.
rtsp://192.168.10.2:554/Live/0 192.168.10.2 서버의 554 포트에 접속하여 카메라 ID 0의 영상을 스트리밍합니다.
rtsp://192.168.10.2:554/resolution=720p&fps=10&bitrate=128000/Live/0 192.168.10.2 서버의 554 포트에 접속하여 카메라 ID 0의 영상을 720p, 10fps, 128Kbps로 스트리밍합니다.

Note

미디어 플레이어 RTSP 스트리밍 옵션에서 TCP interleave 방식을 선택할 경우, RTP/RTCP를 사용하지 않고, TCP를 통하여 보내집니다. 방화벽 등 이유로 이러한 옵션을 사용할 수 있습니다.

RtspEventDelegate 인터페이스

사용자는 RTSP 서버와 연결된 클라이언트간 스트리밍시 발생하는 이벤트를 RtspEventDelegate 인터페이스에서 유도된 객체를 생성하여 확인할 수 있습니다.

RTSP 서버 동작에 반드시 필요한 인터페이스는 아닙니다.

class RtspEventDelegate : public std::enable_shared_from_this<RtspEventDelegate>
{
public:
    RtspEventDelegate();
    virtual ~RtspEventDelegate();

public:
    virtual void onDescription(const char *uri, const char *remote, const char *sdp);
    virtual void onSetup(const char *uri, const char *remote, const char *transport_line);
    virtual void onPlay(const char *uri, const char *remote, const char *rtp_info);
    virtual void onTeardown(const char *uri, const char *remote);
    virtual void onPause(const char *uri, const char *remote);
    virtual void onError(int error_code, const char *error_msg, const char *error_desc);
    virtual void onClosed(const char *uri, const char *remote);
};
void onDescription ( const char * uri , const char * remote , const char * sdp )
OasisRtsp.h
RTSP 서버가 Describe 요청 메세지를 처리하여 응답을 보낼 때 발생하는 이벤트 호출 콜백 함수입니다.
매개변수
uri  클라이언트가 연결 요청시 사용한 URI입니다.
remote  클라이언트 주소입니다. <IPv4 주소>/<포트번호> 양식의 문자열입니다.
sdp  클라이언트가 전달한 SDP 컨텐츠입니다.
void onSetup ( const char * uri , const char * remote , const char * transport_line )
OasisRtsp.h
RTSP 서버가 Setup 요청 메세지를 처리하여 응답을 보낼 때 발생하는 이벤트 호출 콜백 함수입니다.
매개변수
uri  클라이언트가 연결 요청시 사용한 URI입니다.
remote  클라이언트 주소입니다. <IPv4 주소>/<포트번호> 양식의 문자열입니다.
transport_line  Transport 헤더 필드 내용입니다. "Transport: RTP/AVP;unicast;client_port=8000-8001" 나 "Transport: RTP/AVP/TCP;interleaved=0-1" 와 같은 형식입니다.
void onPlay ( const char * uri , const char * remote , const char * rtp_info )
OasisRtsp.h
RTSP 서버가 Play 요청 메세지를 처리하여 응답을 보낼 때 발생하는 이벤트 호출 콜백 함수입니다.
매개변수
uri  클라이언트가 연결 요청시 사용한 URI입니다.
remote  클라이언트 주소입니다. <IPv4 주소>/<포트번호> 양식의 문자열입니다.
rtp_info  Rtp-Info 헤더 필드 내용입니다. "RTP-Info: url=rtsp://example.com/media.mp4/streamid=0;seq=9810092;rtptime=3450012" 와 같은 형식입니다.
void onTeardown ( const char * uri , const char * remote )
OasisRtsp.h
RTSP 서버가 Teardown 요청 메세지를 처리하여 응답을 보낼 때 발생하는 이벤트 호출 콜백 함수입니다.
매개변수
uri  클라이언트가 연결 요청시 사용한 URI입니다.
remote  클라이언트 주소입니다. <IPv4 주소>/<포트번호> 양식의 문자열입니다.
void onPause ( const char * uri , const char * remote )
OasisRtsp.h
RTSP 서버가 Pause 요청 메세지를 처리하여 응답을 보낼 때 발생하는 이벤트 호출 콜백 함수입니다.
매개변수
uri  클라이언트가 연결 요청시 사용한 URI입니다.
remote  클라이언트 주소입니다. <IPv4 주소>/<포트번호> 양식의 문자열입니다.
void onError ( int error_code , const char * error_msg , const char * error_desc )
OasisRtsp.h
RTSP 서버가 에러 응답 시 발생하는 이벤트 호출 콜백 함수입니다.
매개변수
error_code  에러 코드입니다.
error_msg  에러 코드 메세지입니다.
error_desc  에러 코드 상세 설명입니다.

RTSP 서버가 보내는 에러 응답 코드는 아래와 같습니다.

에러코드 메세지 상세 설명
400 Bad Request DESCRIBE invalid uri
400 Bad Request SETUP bad uri
400 Bad Request OPTIONS bad uri
400 Bad Request PLAY bad uri
400 Bad Request PLAY transport not found
400 Bad Request PAUSE bad uri
400 Bad Request PAUSE transport not found
400 Bad Request TEARDOWN bad uri
454 Session Not Found SETUP session not found
454 Session Not Found PLAY session not found
454 Session Not Found PAUSE session not found
454 Session Not Found TEARDOWN session not found
459 Aggregate operation not allowed SETUP aggregate operation not supported
500 Internal Server Error DESCRIBE no SDP available
500 Internal Server Error PAUSE failed to pause the transport
501 Not Implemented RECORD not supported
501 Not Implemented REDIRECT not supported
501 Not Implemented SET PARAMETER not supported
503 Service Unavailable DESCRIBE session limited
503 Service Unavailable OPTIONS session limited
503 Service Unavailable SETUP session limited
503 Service Unavailable SETUP new session not available
503 Service Unavailable Session Play failed
503 Service Unavailable PAUSE failed to pause the session
503 Service Unavailable TEARDOWN failed to teardown the session
void onClosed ( const char * uri , const char * remote )
OasisRtsp.h
연결이 닫혔을 때 발생하는 이벤트 호출 콜백 함수입니다.
매개변수
uri  클라이언트가 연결 요청시 사용한 URI입니다.
remote  클라이언트 주소입니다. <IPv4 주소>/<포트번호> 양식의 문자열입니다.

함수

RtspServerRef createRtspServer ( key_value_map_t & parameters )
OasisRtsp.h
RTSP 서버 객체를 생성합니다.
매개변수
parameters  RTSP 서버 객체 생성에 필요한 key-value map입니다.
리턴값
성공하면 RTSP 서버 객체를 리턴합니다. 실패하면 nullptr을 리턴합니다.
기본값
필수
설명
port
554
 
RTSP 서버 포트번호입니다.
root-dir
 
파일 재생의 경우 파일의 루트 디렉토리 경로입니다.
remote-pool-size
10
 
최대 접속 허용 수 입니다. "0"이면 무제한입니다.
scheduler-size
10
 
서버 스케쥴러 태스크 개수입니다.
upstreamer-size
10
 
Delegate에 전달할 업스트림 태스크 개수입니다.
transmitter-size
10
 
전송 태스크 개수입니다.
timer-size
3
 
타이머 태스크 개수입니다.
disable-rtcp
0
 
RTCP를 사용하지 않습니다.
enable-stun
0
 
STUN을 활성화합니다. 사용하지 않습니다
stun-server-addr
 
STUN 서버 주소입니다. 사용하지 않습니다
stun-server-port
 
STUN 서버 포트입니다. 사용하지 않습니다
file-session-max
3
 
동시 파일 재생 스트리밍 세션 최대 개수입니다. "0"이면 무제한입니다.
live-session-max
3
 
동시 라이브러 세션(카메라 영상 모니터링) 세션 최대 개수입니다. "0"이면 무제한입니다.
linger-time-max
1000
 
연결 종료후 최대 유지 시간입니다. 밀리초 단위입니다.
rtp-data-size-max
1324
 
RTP 데이터 최대 크기입니다. 바이트 단위입니다. 최소 크기는 512 바이트입니다. 네트워크 특성에 따라 조절합니다.
rtp-packet-pool-count-max
3
 
RTP 패킷 풀 최대 개수입니다.
rtp-packet-pool-size
512
 
RTP 패킷 풀당 보유 크기입니다.
default-video-bitrate
 
기본 영상 bitrate 입니다. 라이브 영상에 적용됩니다.
fps
30
 
영상 FPS 입니다. 라이브 영상에 적용되며, 이미 카메라 장치에 설정이 되어 있는 경우, 이 값이 적용되지 않을 수 있습니다.
snd-path
default
 
오디오 장치 경로입니다.
aec-disabled
1
 
AEC 비활성화 여부를 지정합니다. "1"이면 AEC를 사용하지 않습니다.
audio-only
0
 
"1"이면 오디오만 스트리밍합니다.
video-only
0
 
"1"이면 비디오만 스트리밍합니다.
RtspServerRef createRtspServer ( key_value_map_t & parameters , const std::shared_ptr<RtspEventDelegate> & delegate )
OasisRtsp.h
RtspEventDelegate에서 유도된 사용자 정의 객체를 적용한 RTSP 서버 객체를 생성합니다.
매개변수
parameters  RTSP 서버 객체 생성에 필요한 key-value map입니다.
delegate  RtspEventDelegate에서 유도된 사용자 정의 객체입니다.
리턴값
성공하면 RTSP 서버 객체를 리턴합니다. 실패하면 nullptr을 리턴합니다.
int32_t destroyRtspServer ( RtspServerRef & server )
OasisRtsp.h
RTSP 서버를 해제합니다.
매개변수
server  RTSP 서버 객체입니다.
리턴값
  • 0: 성공
  • -1: 실패
int32_t startRtspServer ( const RtspServerRef & server )
OasisRtsp.h
RTSP 서버를 시작합니다.
매개변수
server  RTSP 서버 객체입니다.
리턴값
  • 0: 성공
  • -1: 실패
int32_t stopRtspServer ( const RtspServerRef & server )
OasisRtsp.h
RTSP 서버를 중지합니다.
매개변수
server  RTSP 서버 객체입니다.
리턴값
  • 0: 성공
  • -1: 실패
int32_t enableRtspIseBypassMode ( const RtspServerRef & server , bool enable )
OasisRtsp.h
Warping 등 ISE 기능을 적용한 영상을 송출할 지 여부를 지정합니다. AllWinner 칩셋에 적용됩니다.
매개변수
server  RTSP 서버 객체입니다.
enable  true이면 ISE 기능 적용없이 영상을 그대로 송출합니다. false이면 ISE 기능을 적용한 영상을 송출합니다.
리턴값
  • 0: 성공
  • -1: 실패

예제

아래는 RTSP 서버 예입니다.


#include "OasisAPI.h"
#include "OasisLog.h"
#include "OasisRtsp.h"

#include <thread>
#include <mutex>
#include <memory>
#include <condition_variable>

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#include <signal.h>

#define DLOG_TRACE  0x00080000

#undef DLOG_FLAGS
#define  DLOG_FLAGS (DLOG_FLAGS_DEFAULT|DLOG_TRACE/**/)

#undef DLOG_TAG
#define DLOG_TAG "RTSP"

#define RTSP_PORT  554

using namespace oasis;

namespace oasis {
    uint64_t getFreeMemorySize();
}

static bool continuing = true;

void cancel_handler(int signum)
{
    continuing = false;
}



int main(int argc, char* argv[])
{
    int32_t err;
    int32_t c;
    std::thread t2, t3;

    uint16_t rtsp_port = RTSP_PORT;
    RtspServerRef rtsp_server;

    oasis::key_value_map_t parameters;

    parameters["offs-disable"] = "1";
    if(oasis::initialize(parameters) < 0) {
        DLOG(DLOG_ERROR, "Oasis init failed\n");
        return -1;
    }

    //Oasis set SIGINT
    signal(SIGINT, cancel_handler);


    // config cameras
    // ...

    // RTSP 서버 생성

    parameters.clear();
    parameters["port"] = std::to_string(rtsp_port);
    parameters["root-dir"] = "/mnt/extsd";
    parameters["remote-pool-size"] = std::to_string(20); //max con-current network connections
    parameters["scheduler-size"] = std::to_string(10); //max working threads
    parameters["upstreamer-size"] = std::to_string(10); //max working threads
    parameters["transmitter-size"] = std::to_string(15);
    parameters["timer-size"] = std::to_string(3);
    parameters["file-session-max"] = std::to_string(1);  //0: unlimited
    parameters["live-session-max"] = std::to_string(6);  //0: unlimited 
    parameters["linger-time-max"] = std::to_string(1000);   
    parameters["rtp-data-size-max"] = std::to_string(1024); 
    parameters["rtp-packet-pool-count-max"] = std::to_string(6);    
    parameters["rtp-packet-pool-size"] = std::to_string(256);   

    rtsp_server = createRtspServer(parameters);
    if(rtsp_server) {
        // RTSP 서버 시작
        err = oasis::startRtspServer(rtsp_server);
        ASSERT(err == 0);
        if(err < 0) {
            DLOG(DLOG_ERROR, "RTSP server failed\n");
            goto done;
        }
        DLOG(DLOG_TRACE, "RTSP running at %d...\n", rtsp_port);
    }

    do {
        usleep(10000);
    } while(continuing);

if(rtsp_server) {
        oasis::destroyRtspServer(rtsp_server);
    }

    oasis::finalize();

    return 0;
}