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
resolution 과 out-width, out-height 가 동시에 있는 경우, resolution이 우선합니다.
- 스트리밍 목적지 경로 는 스트리밍할 대상을 지정합니다. 라이브 카메라 경로와 파일 경로를 지정할 수 있습니다. 파일 경로의 경우, RTSP 서버 생성시 지정한
root-dir내에 위치해야 합니다. 라이브 카메라 경로는Live/<카메라 장치 ID>와 같습니다.<카메라 장치 ID>는oasis::configCamerasAPI에서 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;
}