🌐 한국어

    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  클라이언트 주소입니다. &lt;IPv4 주소>/&lt;포트번호> 양식의 문자열입니다.
    sdp  클라이언트가 전달한 SDP 컨텐츠입니다.
    void onSetup ( const char * uri , const char * remote , const char * transport_line )
    OasisRtsp.h
    RTSP 서버가 Setup 요청 메세지를 처리하여 응답을 보낼 때 발생하는 이벤트 호출 콜백 함수입니다.
    매개변수
    uri  클라이언트가 연결 요청시 사용한 URI입니다.
    remote  클라이언트 주소입니다. &lt;IPv4 주소>/&lt;포트번호> 양식의 문자열입니다.
    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  클라이언트 주소입니다. &lt;IPv4 주소>/&lt;포트번호> 양식의 문자열입니다.
    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  클라이언트 주소입니다. &lt;IPv4 주소>/&lt;포트번호> 양식의 문자열입니다.
    void onPause ( const char * uri , const char * remote )
    OasisRtsp.h
    RTSP 서버가 Pause 요청 메세지를 처리하여 응답을 보낼 때 발생하는 이벤트 호출 콜백 함수입니다.
    매개변수
    uri  클라이언트가 연결 요청시 사용한 URI입니다.
    remote  클라이언트 주소입니다. &lt;IPv4 주소>/&lt;포트번호> 양식의 문자열입니다.
    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  클라이언트 주소입니다. &lt;IPv4 주소>/&lt;포트번호> 양식의 문자열입니다.

    함수#

    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;
    }