diff --git a/.run/include.run.xml b/.run/include.run.xml deleted file mode 100644 index b11c4e82f..000000000 --- a/.run/include.run.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.run/log-file.run.xml b/.run/log-file.run.xml deleted file mode 100644 index 3047b46c4..000000000 --- a/.run/log-file.run.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.run/srt.run.xml b/.run/srt.run.xml index 10040056c..e947cdb9c 100644 --- a/.run/srt.run.xml +++ b/.run/srt.run.xml @@ -1,5 +1,5 @@ - + diff --git a/trunk/conf/clion-ingest.conf b/trunk/conf/clion-ingest.conf index f4261544e..681822d12 100644 --- a/trunk/conf/clion-ingest.conf +++ b/trunk/conf/clion-ingest.conf @@ -12,7 +12,7 @@ http_server { http_api { enabled on; - listen 1985; + listen 8080; } stats { network 0; diff --git a/trunk/conf/clion-srt.conf b/trunk/conf/clion-srt.conf new file mode 100644 index 000000000..4dd356b1e --- /dev/null +++ b/trunk/conf/clion-srt.conf @@ -0,0 +1,53 @@ +# SRT config. + +listen 1935; +max_connections 1000; +daemon off; +srs_log_tank console; + +http_api { + enabled on; + listen 8080; +} + +http_server { + enabled on; + listen 8080; + dir ./objs/nginx/html; +} + +srt_server { + enabled on; + listen 10080; + maxbw 1000000000; + connect_timeout 4000; + peerlatency 0; + recvlatency 0; + latency 0; + tsbpdmode off; + tlpktdrop off; + sendbuf 2000000; + recvbuf 2000000; +} + +# @doc https://github.com/ossrs/srs/issues/1147#issuecomment-577607026 +vhost __defaultVhost__ { + srt { + enabled on; + srt_to_rtmp on; + } + + http_remux { + enabled on; + mount [vhost]/[app]/[stream].flv; + } +} + +# For SRT to use vhost. +vhost srs.srt.com.cn { +} + +stats { + network 0; + disk sda sdb xvda xvdb; +} diff --git a/trunk/conf/clion.conf b/trunk/conf/clion.conf index 838625988..290289744 100644 --- a/trunk/conf/clion.conf +++ b/trunk/conf/clion.conf @@ -29,6 +29,20 @@ rtc_server { candidate $CANDIDATE; } +srt_server { + enabled on; + listen 10080; + maxbw 1000000000; + connect_timeout 4000; + peerlatency 0; + recvlatency 0; + latency 0; + tsbpdmode off; + tlpktdrop off; + sendbuf 2000000; + recvbuf 2000000; +} + vhost __defaultVhost__ { rtc { enabled on; @@ -44,5 +58,9 @@ vhost __defaultVhost__ { hls { enabled on; } + srt { + enabled on; + srt_to_rtmp on; + } } diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index 2809f0d24..b76f54c11 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -7,6 +7,7 @@ The changelog for SRS. ## SRS 5.0 Changelog +* v5.0, 2022-08-30, STAT: Refine tcUrl for SRT/RTC. v5.0.54 * v5.0, 2022-08-30, Refactor: Extract SrsNetworkKbps from SrsKbps. v5.0.53 * v5.0, 2022-08-30, Remove bandwidth check because falsh is disabled. v5.0.52 * v5.0, 2022-08-30, Refactor: Use compositor for ISrsKbpsDelta. v5.0.51 diff --git a/trunk/research/console/js/srs.console.js b/trunk/research/console/js/srs.console.js index 031786e7a..46c833598 100644 --- a/trunk/research/console/js/srs.console.js +++ b/trunk/research/console/js/srs.console.js @@ -584,6 +584,8 @@ scApp.filter('sc_filter_streamURL', function(){ const pos = v.url.lastIndexOf('/'); const stream = pos < 0 ? '' : v.url.substr(pos); + // Use name or extract from url. + const streamName = v.name ? v.name : stream; const pos2 = v.tcUrl.indexOf('?'); const tcUrl = pos2 < 0 ? v.tcUrl : v.tcUrl.substr(0, pos2); @@ -591,7 +593,7 @@ scApp.filter('sc_filter_streamURL', function(){ let params = pos2 < 0 ? '' : v.tcUrl.substr(pos2); if (params === '?vhost=__defaultVhost__' || params === '?domain=__defaultVhost__') params = ''; - return `${tcUrl}${stream}${params}`; + return `${tcUrl}${streamName}${params}`; }; }); diff --git a/trunk/research/console/views/streams.html b/trunk/research/console/views/streams.html index 4fa9b88c1..2336ac939 100644 --- a/trunk/research/console/views/streams.html +++ b/trunk/research/console/views/streams.html @@ -12,6 +12,7 @@ ID 流名称 + URL Vhost 状态 在线人数 @@ -24,6 +25,7 @@ {{stream.id}} {{stream.name| sc_filter_less}} + {{stream |sc_filter_streamURL}} {{stream.owner.name}} {{stream.publish.active| sc_filter_has_stream}} {{stream.clients}}人 diff --git a/trunk/research/console/views/streams_en.html b/trunk/research/console/views/streams_en.html index b523e1a2c..1c30af218 100644 --- a/trunk/research/console/views/streams_en.html +++ b/trunk/research/console/views/streams_en.html @@ -12,6 +12,7 @@ ID Name + URL Vhost Status Clients @@ -24,6 +25,7 @@ {{stream.id}} {{stream.name| sc_filter_less}} + {{stream |sc_filter_streamURL}} {{stream.owner.name}} {{stream.publish.active| sc_filter_has_stream}} {{stream.clients}}人 diff --git a/trunk/src/app/srs_app_http_static.cpp b/trunk/src/app/srs_app_http_static.cpp index a8a137551..b9e3d5a2f 100644 --- a/trunk/src/app/srs_app_http_static.cpp +++ b/trunk/src/app/srs_app_http_static.cpp @@ -72,6 +72,10 @@ srs_error_t SrsHlsStream::serve_m3u8_ctx(ISrsHttpResponseWriter* w, ISrsHttpMess { string ctx = r->query_get(SRS_CONTEXT_IN_HLS); + // Correct the app and stream by path, which is created from template. + // @remark Be careful that the stream has extension now, might cause identify fail. + req->stream = srs_path_basename(r->path()); + // Always make the ctx alive now. alive(ctx, req); diff --git a/trunk/src/app/srs_app_http_stream.cpp b/trunk/src/app/srs_app_http_stream.cpp index 1a20d9e31..246f54b1e 100755 --- a/trunk/src/app/srs_app_http_stream.cpp +++ b/trunk/src/app/srs_app_http_stream.cpp @@ -523,6 +523,10 @@ srs_error_t SrsLiveStream::update_auth(SrsLiveSource* s, SrsRequest* r) srs_error_t SrsLiveStream::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) { srs_error_t err = srs_success; + + // Correct the app and stream by path, which is created from template. + // @remark Be careful that the stream has extension now, might cause identify fail. + req->stream = srs_path_basename(r->path()); if ((err = http_hooks_on_play(r)) != srs_success) { return srs_error_wrap(err, "http hook"); @@ -588,7 +592,7 @@ srs_error_t SrsLiveStream::do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMess SrsHttpConn* hc = dynamic_cast(hr->connection()); // update client ip - req->ip = hc->remote_ip(); + req->ip = hc->remote_ip(); // update the statistic when source disconveried. SrsStatistic* stat = SrsStatistic::instance(); diff --git a/trunk/src/app/srs_app_srt_conn.cpp b/trunk/src/app/srs_app_srt_conn.cpp index be484c8d5..a6bedb312 100644 --- a/trunk/src/app/srs_app_srt_conn.cpp +++ b/trunk/src/app/srs_app_srt_conn.cpp @@ -263,7 +263,7 @@ srs_error_t SrsMpegtsSrtConn::do_cycle() // Detect streamid of srt to request. SrtMode mode = SrtModePull; - if (! srs_srt_streamid_to_request(streamid, mode, req_)) { + if (!srs_srt_streamid_to_request(streamid, mode, req_)) { return srs_error_new(ERROR_SRT_CONN, "invalid srt streamid=%s", streamid.c_str()); } @@ -288,9 +288,6 @@ srs_error_t SrsMpegtsSrtConn::do_cycle() return srs_error_wrap(err, "on connect"); } - // Build the tcUrl which is vhost/app. - req_->tcUrl = srs_generate_tc_url(req_->host, req_->vhost, req_->app, req_->port); - if (mode == SrtModePush) { err = publishing(); } else if (mode == SrtModePull) { diff --git a/trunk/src/app/srs_app_srt_utility.cpp b/trunk/src/app/srs_app_srt_utility.cpp index 9db695a2c..cd7fd8cb0 100644 --- a/trunk/src/app/srs_app_srt_utility.cpp +++ b/trunk/src/app/srs_app_srt_utility.cpp @@ -139,5 +139,9 @@ bool srs_srt_streamid_to_request(const std::string& streamid, SrtMode& mode, Srs request->param = stream_with_params.substr(pos + 1); } + request->host = srs_get_public_internet_address(); + if (request->vhost.empty()) request->vhost = request->host; + request->tcUrl = srs_generate_tc_url("srt", request->host, request->vhost, request->app, request->port); + return ret; } diff --git a/trunk/src/core/srs_core_version5.hpp b/trunk/src/core/srs_core_version5.hpp index 1a5e273a8..874565004 100644 --- a/trunk/src/core/srs_core_version5.hpp +++ b/trunk/src/core/srs_core_version5.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 0 -#define VERSION_REVISION 53 +#define VERSION_REVISION 54 #endif diff --git a/trunk/src/protocol/srs_protocol_rtmp_conn.cpp b/trunk/src/protocol/srs_protocol_rtmp_conn.cpp index bcffe5e58..cf9c87aec 100644 --- a/trunk/src/protocol/srs_protocol_rtmp_conn.cpp +++ b/trunk/src/protocol/srs_protocol_rtmp_conn.cpp @@ -111,7 +111,7 @@ srs_error_t SrsBasicRtmpClient::do_connect_app(string local_ip, bool debug) // generate the tcUrl std::string param = ""; std::string target_vhost = req->vhost; - std::string tc_url = srs_generate_tc_url(req->host, req->vhost, req->app, req->port); + std::string tc_url = srs_generate_tc_url("rtmp", req->host, req->vhost, req->app, req->port); // replace the tcUrl in request, // which will replace the tc_url in client.connect_app(). diff --git a/trunk/src/protocol/srs_protocol_rtmp_stack.cpp b/trunk/src/protocol/srs_protocol_rtmp_stack.cpp index 23a997574..8a7587e52 100644 --- a/trunk/src/protocol/srs_protocol_rtmp_stack.cpp +++ b/trunk/src/protocol/srs_protocol_rtmp_stack.cpp @@ -1544,6 +1544,7 @@ void SrsRequest::strip() SrsRequest* SrsRequest::as_http() { schema = "http"; + tcUrl = srs_generate_tc_url(schema, host, vhost, app, port); return this; } diff --git a/trunk/src/protocol/srs_protocol_utility.cpp b/trunk/src/protocol/srs_protocol_utility.cpp index 31a282ab1..c99f06e9d 100644 --- a/trunk/src/protocol/srs_protocol_utility.cpp +++ b/trunk/src/protocol/srs_protocol_utility.cpp @@ -175,9 +175,9 @@ long srs_random() return random(); } -string srs_generate_tc_url(string host, string vhost, string app, int port) +string srs_generate_tc_url(string schema, string host, string vhost, string app, int port) { - string tcUrl = "rtmp://"; + string tcUrl = schema + "://"; if (vhost == SRS_CONSTS_RTMP_DEFAULT_VHOST) { tcUrl += host.empty() ? SRS_CONSTS_RTMP_DEFAULT_VHOST : host; @@ -324,10 +324,9 @@ string srs_generate_stream_url(string vhost, string app, string stream) if (SRS_CONSTS_RTMP_DEFAULT_VHOST != vhost){ url += vhost; } - url += "/"; - url += app; - url += "/"; - url += stream; + url += "/" + app; + // Note that we ignore any extension. + url += "/" + srs_path_filename(stream); return url; } diff --git a/trunk/src/protocol/srs_protocol_utility.hpp b/trunk/src/protocol/srs_protocol_utility.hpp index 8b834b864..6324789c7 100644 --- a/trunk/src/protocol/srs_protocol_utility.hpp +++ b/trunk/src/protocol/srs_protocol_utility.hpp @@ -76,7 +76,7 @@ extern long srs_random(); * generate the tcUrl without param. * @remark Use host as tcUrl.vhost if vhost is default vhost. */ -extern std::string srs_generate_tc_url(std::string host, std::string vhost, std::string app, int port); +extern std::string srs_generate_tc_url(std::string schema, std::string host, std::string vhost, std::string app, int port); /** * Generate the stream with param. diff --git a/trunk/src/utest/srs_utest_protocol.cpp b/trunk/src/utest/srs_utest_protocol.cpp index 7b3cacee5..cddc971fd 100644 --- a/trunk/src/utest/srs_utest_protocol.cpp +++ b/trunk/src/utest/srs_utest_protocol.cpp @@ -581,15 +581,15 @@ VOID TEST(ProtocolUtilityTest, GenerateTcUrl) string ip; string vhost; string app; int port; string tcUrl; string param; ip = "127.0.0.1"; vhost = "__defaultVhost__"; app = "live"; port = 1935; - tcUrl = srs_generate_tc_url(ip, vhost, app, port); + tcUrl = srs_generate_tc_url("rtmp", ip, vhost, app, port); EXPECT_STREQ("rtmp://127.0.0.1/live", tcUrl.c_str()); ip = "127.0.0.1"; vhost = "demo"; app = "live"; port = 1935; - tcUrl = srs_generate_tc_url(ip, vhost, app, port); + tcUrl = srs_generate_tc_url("rtmp", ip, vhost, app, port); EXPECT_STREQ("rtmp://demo/live", tcUrl.c_str()); ip = "127.0.0.1"; vhost = "demo"; app = "live"; port = 19351; - tcUrl = srs_generate_tc_url(ip, vhost, app, port); + tcUrl = srs_generate_tc_url("rtmp", ip, vhost, app, port); EXPECT_STREQ("rtmp://demo:19351/live", tcUrl.c_str()); } @@ -7023,3 +7023,15 @@ VOID TEST(ProtocolKbpsTest, RAWStatisticSugar) } } +VOID TEST(ProtocolKbpsTest, StreamIdentify) +{ + EXPECT_STREQ("/live/livestream", srs_generate_stream_url("", "live", "livestream").c_str()); + EXPECT_STREQ("/live/livestream", srs_generate_stream_url("", "live", "livestream.flv").c_str()); + EXPECT_STREQ("/live/livestream", srs_generate_stream_url("", "live", "livestream.m3u8").c_str()); + EXPECT_STREQ("/live/livestream", srs_generate_stream_url("__defaultVhost__", "live", "livestream").c_str()); + + EXPECT_STREQ("ossrs.io/live/livestream", srs_generate_stream_url("ossrs.io", "live", "livestream").c_str()); + EXPECT_STREQ("ossrs.io/live/livestream", srs_generate_stream_url("ossrs.io", "live", "livestream.flv").c_str()); + EXPECT_STREQ("ossrs.io/live/livestream", srs_generate_stream_url("ossrs.io", "live", "livestream.m3u8").c_str()); +} + diff --git a/trunk/src/utest/srs_utest_srt.cpp b/trunk/src/utest/srs_utest_srt.cpp index ecdcaf163..beb11f3fc 100644 --- a/trunk/src/utest/srs_utest_srt.cpp +++ b/trunk/src/utest/srs_utest_srt.cpp @@ -423,7 +423,7 @@ VOID TEST(ProtocolSrtTest, SrtStreamIdToRequest) SrsRequest req; EXPECT_TRUE(srs_srt_streamid_to_request("#!::r=live/livestream?key1=val1,key2=val2", mode, &req)); EXPECT_EQ(mode, SrtModePull); - EXPECT_STREQ(req.vhost.c_str(), ""); + EXPECT_STREQ(req.vhost.c_str(), srs_get_public_internet_address().c_str()); EXPECT_STREQ(req.app.c_str(), "live"); EXPECT_STREQ(req.stream.c_str(), "livestream"); EXPECT_STREQ(req.param.c_str(), "key1=val1&key2=val2"); @@ -445,7 +445,7 @@ VOID TEST(ProtocolSrtTest, SrtStreamIdToRequest) SrsRequest req; EXPECT_TRUE(srs_srt_streamid_to_request("#!::h=live/livestream?key1=val1,key2=val2", mode, &req)); EXPECT_EQ(mode, SrtModePull); - EXPECT_STREQ(req.vhost.c_str(), ""); + EXPECT_STREQ(req.vhost.c_str(), srs_get_public_internet_address().c_str()); EXPECT_STREQ(req.app.c_str(), "live"); EXPECT_STREQ(req.stream.c_str(), "livestream"); EXPECT_STREQ(req.param.c_str(), "key1=val1&key2=val2");