🌐
한국어
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 서버 객체를 생성합니다.
리턴값
성공하면 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;
}