Skip to content

Commit f74c8ad

Browse files
ossrs-aiwinlinvip
authored andcommitted
AI: WebRTC: Support private protocol for cascading.
1 parent 44db13c commit f74c8ad

20 files changed

+1322
-19
lines changed

trunk/conf/rtc_cascade.conf

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# RTC Cascade configuration for testing WebRTC Private TCP Protocol
2+
listen 1935;
3+
max_connections 1000;
4+
daemon off;
5+
srs_log_tank console;
6+
7+
http_server {
8+
enabled on;
9+
listen 8080;
10+
}
11+
12+
http_api {
13+
enabled on;
14+
listen 1985;
15+
}
16+
17+
rtc_server {
18+
enabled on;
19+
listen 8000;
20+
21+
# WebRTC Private TCP for cascade connections
22+
private_tcp {
23+
enabled on;
24+
listen 9999;
25+
}
26+
}
27+
28+
vhost __defaultVhost__ {
29+
rtc {
30+
enabled on;
31+
}
32+
}
33+

trunk/configure

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ MODULE_FILES=("srs_app_server" "srs_app_rtmp_conn" "srs_app_rtmp_source"
303303
# Always include SRT app modules
304304
MODULE_FILES+=("srs_app_srt_server" "srs_app_srt_listener" "srs_app_srt_conn" "srs_app_srt_source")
305305
MODULE_FILES+=("srs_app_rtc_conn" "srs_app_rtc_dtls" "srs_app_rtc_network"
306-
"srs_app_rtc_server" "srs_app_rtc_source" "srs_app_rtc_api")
306+
"srs_app_rtc_server" "srs_app_rtc_source" "srs_app_rtc_api" "srs_app_rtc_cascade")
307307
if [[ $SRS_RTSP == YES ]]; then
308308
MODULE_FILES+=("srs_app_rtsp_source" "srs_app_rtsp_conn")
309309
fi

trunk/doc/WebRtcPrivateTcp.md

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,7 @@ All JSON messages are framed with RFC 4571 length prefix:
112112
{
113113
"type": "publish",
114114
"stream": "/live/livestream",
115-
"sdp": "v=0\r\no=- 1234567890 2 IN IP4 192.168.1.100\r\ns=SRSPublishSession\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=ice-lite\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:4ZcD\r\na=ice-pwd:bILRCdg4YchH1OqRIvvscZAP\r\na=fingerprint:sha-256 ...\r\na=setup:actpass\r\na=mid:0\r\na=sendonly\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\nm=video 9 UDP/TLS/RTP/SAVPF 106\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:4ZcD\r\na=ice-pwd:bILRCdg4YchH1OqRIvvscZAP\r\na=fingerprint:sha-256 ...\r\na=setup:actpass\r\na=mid:1\r\na=sendonly\r\na=rtcp-mux\r\na=rtpmap:106 H264/90000\r\na=fmtp:106 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\n",
116-
"server_id": "srs-server-a"
115+
"sdp": "v=0\r\no=- 1234567890 2 IN IP4 192.168.1.100\r\ns=SRSPublishSession\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=ice-lite\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:4ZcD\r\na=ice-pwd:bILRCdg4YchH1OqRIvvscZAP\r\na=fingerprint:sha-256 ...\r\na=setup:actpass\r\na=mid:0\r\na=sendonly\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\nm=video 9 UDP/TLS/RTP/SAVPF 106\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:4ZcD\r\na=ice-pwd:bILRCdg4YchH1OqRIvvscZAP\r\na=fingerprint:sha-256 ...\r\na=setup:actpass\r\na=mid:1\r\na=sendonly\r\na=rtcp-mux\r\na=rtpmap:106 H264/90000\r\na=fmtp:106 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\n"
117116
}
118117
```
119118

@@ -122,7 +121,6 @@ All JSON messages are framed with RFC 4571 length prefix:
122121
- `type`: Must be `"publish"`
123122
- `stream`: Stream path (e.g., `/live/livestream`, `/app/stream`)
124123
- `sdp`: SDP offer in standard WebRTC format
125-
- `server_id`: Identifier of the publishing server (optional)
126124

127125
## JSON Publish Response
128126

@@ -134,8 +132,7 @@ All JSON messages are framed with RFC 4571 length prefix:
134132
{
135133
"code": 0,
136134
"session": "4ZcD:bILRCdg4YchH1OqRIvvscZAP",
137-
"sdp": "v=0\r\no=- 9876543210 2 IN IP4 192.168.1.200\r\ns=SRSReceiveSession\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=ice-lite\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111\r\nc=IN IP4 192.168.1.200\r\na=ice-ufrag:bILR\r\na=ice-pwd:4ZcDYchH1OqRIvvscZAP\r\na=fingerprint:sha-256 ...\r\na=setup:passive\r\na=mid:0\r\na=recvonly\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\nm=video 9 UDP/TLS/RTP/SAVPF 106\r\nc=IN IP4 192.168.1.200\r\na=ice-ufrag:bILR\r\na=ice-pwd:4ZcDYchH1OqRIvvscZAP\r\na=fingerprint:sha-256 ...\r\na=setup:passive\r\na=mid:1\r\na=recvonly\r\na=rtcp-mux\r\na=rtpmap:106 H264/90000\r\na=fmtp:106 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\n",
138-
"server_id": "srs-server-b"
135+
"sdp": "v=0\r\no=- 9876543210 2 IN IP4 192.168.1.200\r\ns=SRSReceiveSession\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=ice-lite\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111\r\nc=IN IP4 192.168.1.200\r\na=ice-ufrag:bILR\r\na=ice-pwd:4ZcDYchH1OqRIvvscZAP\r\na=fingerprint:sha-256 ...\r\na=setup:passive\r\na=mid:0\r\na=recvonly\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\nm=video 9 UDP/TLS/RTP/SAVPF 106\r\nc=IN IP4 192.168.1.200\r\na=ice-ufrag:bILR\r\na=ice-pwd:4ZcDYchH1OqRIvvscZAP\r\na=fingerprint:sha-256 ...\r\na=setup:passive\r\na=mid:1\r\na=recvonly\r\na=rtcp-mux\r\na=rtpmap:106 H264/90000\r\na=fmtp:106 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\n"
139136
}
140137
```
141138

@@ -154,7 +151,6 @@ All JSON messages are framed with RFC 4571 length prefix:
154151
- `code`: 0 for success, non-zero for error
155152
- `session`: ICE username (ufrag pair) for session identification
156153
- `sdp`: SDP answer in standard WebRTC format
157-
- `server_id`: Identifier of the receiving server (optional)
158154
- `message`: Error message (only for errors)
159155
- `details`: Detailed error information (optional)
160156

@@ -166,8 +162,7 @@ All JSON messages are framed with RFC 4571 length prefix:
166162
{
167163
"type": "play",
168164
"stream": "/live/livestream",
169-
"sdp": "v=0\r\no=- 1111111111 2 IN IP4 192.168.1.150\r\ns=SRSPlaySession\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=ice-lite\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:xYz9\r\na=ice-pwd:pQrS1234567890AbCdEf\r\na=fingerprint:sha-256 ...\r\na=setup:actpass\r\na=mid:0\r\na=recvonly\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\nm=video 9 UDP/TLS/RTP/SAVPF 106\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:xYz9\r\na=ice-pwd:pQrS1234567890AbCdEf\r\na=fingerprint:sha-256 ...\r\na=setup:actpass\r\na=mid:1\r\na=recvonly\r\na=rtcp-mux\r\na=rtpmap:106 H264/90000\r\n",
170-
"server_id": "srs-server-c"
165+
"sdp": "v=0\r\no=- 1111111111 2 IN IP4 192.168.1.150\r\ns=SRSPlaySession\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=ice-lite\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:xYz9\r\na=ice-pwd:pQrS1234567890AbCdEf\r\na=fingerprint:sha-256 ...\r\na=setup:actpass\r\na=mid:0\r\na=recvonly\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\nm=video 9 UDP/TLS/RTP/SAVPF 106\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:xYz9\r\na=ice-pwd:pQrS1234567890AbCdEf\r\na=fingerprint:sha-256 ...\r\na=setup:actpass\r\na=mid:1\r\na=recvonly\r\na=rtcp-mux\r\na=rtpmap:106 H264/90000\r\n"
171166
}
172167
```
173168

trunk/src/app/srs_app_config.cpp

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1962,7 +1962,7 @@ srs_error_t SrsConfig::check_normal_config()
19621962
SrsConfDirective *conf = root_->get("rtc_server");
19631963
for (int i = 0; conf && i < (int)conf->directives_.size(); i++) {
19641964
string n = conf->at(i)->name_;
1965-
if (n != "enabled" && n != "listen" && n != "dir" && n != "candidate" && n != "ecdsa" && n != "tcp" && n != "encrypt" && n != "reuseport" && n != "merge_nalus" && n != "black_hole" && n != "protocol" && n != "ip_family" && n != "api_as_candidates" && n != "resolve_api_domain" && n != "keep_api_domain" && n != "use_auto_detect_network_ip") {
1965+
if (n != "enabled" && n != "listen" && n != "dir" && n != "candidate" && n != "ecdsa" && n != "tcp" && n != "encrypt" && n != "reuseport" && n != "merge_nalus" && n != "black_hole" && n != "protocol" && n != "ip_family" && n != "api_as_candidates" && n != "resolve_api_domain" && n != "keep_api_domain" && n != "use_auto_detect_network_ip" && n != "private_tcp") {
19661966
return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "illegal rtc_server.%s", n.c_str());
19671967
}
19681968
}
@@ -2147,6 +2147,16 @@ srs_error_t SrsConfig::check_normal_config()
21472147
}
21482148
}
21492149
}
2150+
2151+
// Validate RTC server Private TCP listen addresses
2152+
if (get_rtc_server_private_tcp_enabled()) {
2153+
vector<string> rtc_private_tcp_listens = get_rtc_server_private_tcp_listens();
2154+
for (int i = 0; i < (int)rtc_private_tcp_listens.size(); i++) {
2155+
if (!srs_net_is_valid_endpoint(rtc_private_tcp_listens[i])) {
2156+
return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "rtc_server.private_tcp.listen=%s is invalid", rtc_private_tcp_listens[i].c_str());
2157+
}
2158+
}
2159+
}
21502160
}
21512161

21522162
////////////////////////////////////////////////////////////////////////
@@ -3531,6 +3541,70 @@ vector<string> SrsConfig::get_rtc_server_tcp_listens()
35313541
return listens;
35323542
}
35333543

3544+
bool SrsConfig::get_rtc_server_private_tcp_enabled()
3545+
{
3546+
SRS_OVERWRITE_BY_ENV_BOOL("srs.rtc_server.private_tcp.enabled"); // SRS_RTC_SERVER_PRIVATE_TCP_ENABLED
3547+
3548+
static bool DEFAULT = false;
3549+
3550+
SrsConfDirective *conf = root_->get("rtc_server");
3551+
if (!conf) {
3552+
return DEFAULT;
3553+
}
3554+
3555+
conf = conf->get("private_tcp");
3556+
if (!conf) {
3557+
return DEFAULT;
3558+
}
3559+
3560+
conf = conf->get("enabled");
3561+
if (!conf || conf->arg0().empty()) {
3562+
return DEFAULT;
3563+
}
3564+
3565+
return SRS_CONF_PREFER_FALSE(conf->arg0());
3566+
}
3567+
3568+
vector<string> SrsConfig::get_rtc_server_private_tcp_listens()
3569+
{
3570+
std::vector<string> listens;
3571+
3572+
if (!srs_getenv("srs.rtc_server.private_tcp.listen").empty()) { // SRS_RTC_SERVER_PRIVATE_TCP_LISTEN
3573+
return srs_strings_split(srs_getenv("srs.rtc_server.private_tcp.listen"), " ");
3574+
}
3575+
3576+
static string DEFAULT = "9999";
3577+
3578+
SrsConfDirective *conf = root_->get("rtc_server");
3579+
if (!conf) {
3580+
listens.push_back(DEFAULT);
3581+
return listens;
3582+
}
3583+
3584+
conf = conf->get("private_tcp");
3585+
if (!conf) {
3586+
listens.push_back(DEFAULT);
3587+
return listens;
3588+
}
3589+
3590+
conf = conf->get("listen");
3591+
if (!conf) {
3592+
listens.push_back(DEFAULT);
3593+
return listens;
3594+
}
3595+
3596+
for (int i = 0; i < (int)conf->args_.size(); i++) {
3597+
listens.push_back(conf->args_.at(i));
3598+
}
3599+
3600+
// If no arguments, use default
3601+
if (listens.empty()) {
3602+
listens.push_back(DEFAULT);
3603+
}
3604+
3605+
return listens;
3606+
}
3607+
35343608
std::string SrsConfig::get_rtc_server_protocol()
35353609
{
35363610
SRS_OVERWRITE_BY_ENV_STRING("srs.rtc_server.protocol"); // SRS_RTC_SERVER_PROTOCOL

trunk/src/app/srs_app_config.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,8 @@ class ISrsAppConfig : public ISrsConfig
352352
virtual bool get_rtc_server_enabled() = 0;
353353
virtual bool get_rtc_server_tcp_enabled() = 0;
354354
virtual std::vector<std::string> get_rtc_server_tcp_listens() = 0;
355+
virtual bool get_rtc_server_private_tcp_enabled() = 0;
356+
virtual std::vector<std::string> get_rtc_server_private_tcp_listens() = 0;
355357
virtual std::string get_rtc_server_protocol() = 0;
356358
virtual std::vector<std::string> get_rtc_server_listens() = 0;
357359
virtual int get_rtc_server_reuseport() = 0;
@@ -878,6 +880,9 @@ class SrsConfig : public ISrsAppConfig
878880
virtual bool get_rtc_server_tcp_enabled();
879881
// Get the rtc server tcp listen addresses, support IPv4 and IPv6.
880882
virtual std::vector<std::string> get_rtc_server_tcp_listens();
883+
virtual bool get_rtc_server_private_tcp_enabled();
884+
// Get the rtc server private tcp listen addresses, support IPv4 and IPv6.
885+
virtual std::vector<std::string> get_rtc_server_private_tcp_listens();
881886
virtual std::string get_rtc_server_protocol();
882887
virtual std::string get_rtc_server_ip_family();
883888
virtual bool get_rtc_server_ecdsa();

0 commit comments

Comments
 (0)