From eb788a62ad6fa81bca15f73f8feb873fb1b139cb Mon Sep 17 00:00:00 2001 From: Jacob Su Date: Wed, 24 Jul 2024 11:00:18 +0800 Subject: [PATCH] HTTP-TS: Support guess_has_av for audio only stream. v6.0.141 (#4063) ## Describe ## http_remux feature support config `has_audio`, `has_video` & `guess_has_av` prop. https://github.com/ossrs/srs/blob/282d94d7bbfa127868caab401bb7616e26d4c54d/trunk/src/app/srs_app_http_stream.cpp#L630-L632 Take `http_flv` as example, `srs` can accept both RTMP streams with only audio, only video or both audio and video streams. It is controlled by above three properties. But `guess_has_av` is not implemented by `http_ts`. The problem is that if I want publish a RTMP stream with audio or video track, the `has_audio` and `has_video`, which are default true/on, must to be config to match the RTMP stream, otherwise the `mpegts.js` player can't play the `http-ts` stream. ## How to reproduce ## 1. `export SRS_VHOST_HTTP_REMUX_HAS_AUDIO=on; export SRS_VHOST_HTTP_REMUX_HAS_VIDEO=on; export SRS_VHOST_HTTP_REMUX_GUESS_HAS_AV=on; ./objs/srs -c conf/http.ts.live.conf` 2. publish rtmp stream without video: `ffmpeg -re -stream_loop -1 -i srs/trunk/doc/source.200kbps.768x320.flv -vn -acodec copy -f flv rtmp://localhost/live/livestream` 3. open chrome browser, open `http://localhost:8080/players/srs_player.html?schema=http`, go to `LivePlayer`, input URL: `http://localhost:8080/live/livestream.ts`, click play. 4. the `http://localhost:8080/live/livestream.ts` can not play. ## Solution ## Let `http-ts` support `guess_has_av`, `http-flv` already supported. The `guess_has_av` default value is ture/on, so the `http-ts|flv` can play any streams with audio, video or both. --------- Co-authored-by: Winlin --- trunk/doc/CHANGELOG.md | 1 + trunk/src/app/srs_app_http_stream.cpp | 7 +++++++ trunk/src/app/srs_app_http_stream.hpp | 1 + trunk/src/core/srs_core_version6.hpp | 2 +- trunk/src/kernel/srs_kernel_ts.cpp | 23 +++++++++++++++++++++++ trunk/src/kernel/srs_kernel_ts.hpp | 2 ++ 6 files changed, 35 insertions(+), 1 deletion(-) diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index 4af10b113..653c053a3 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -7,6 +7,7 @@ The changelog for SRS. ## SRS 6.0 Changelog +* v6.0, 2024-07-24, Merge [#4063](https://github.com/ossrs/srs/pull/4063): let http-remux ts stream support guess_has_av feature;. v6.0.141 (#4063) * v6.0, 2024-07-24, Merge [#4116](https://github.com/ossrs/srs/pull/4116): Dockerfile: Consistently use proper ENV syntax using "=". v6.0.140 (#4116) * v6.0, 2024-07-24, Merge [#4126](https://github.com/ossrs/srs/pull/4126): Edge: Improve stability for state and fd closing. v6.0.139 (#4126) * v6.0, 2024-07-13, Merge [#4111](https://github.com/ossrs/srs/pull/4111): DASH: Fix time unit error for disposing. v6.0.138 (#4111) diff --git a/trunk/src/app/srs_app_http_stream.cpp b/trunk/src/app/srs_app_http_stream.cpp index d7da269e2..2a97f9616 100755 --- a/trunk/src/app/srs_app_http_stream.cpp +++ b/trunk/src/app/srs_app_http_stream.cpp @@ -257,11 +257,17 @@ void SrsTsStreamEncoder::set_has_audio(bool v) { enc->set_has_audio(v); } + void SrsTsStreamEncoder::set_has_video(bool v) { enc->set_has_video(v); } +void SrsTsStreamEncoder::set_guess_has_av(bool v) +{ + enc->set_guess_has_av(v); +} + SrsFlvStreamEncoder::SrsFlvStreamEncoder() { header_written = false; @@ -677,6 +683,7 @@ srs_error_t SrsLiveStream::do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMess enc_raw = new SrsTsStreamEncoder(); ((SrsTsStreamEncoder*)enc_raw)->set_has_audio(has_audio); ((SrsTsStreamEncoder*)enc_raw)->set_has_video(has_video); + ((SrsTsStreamEncoder*)enc_raw)->set_guess_has_av(guess_has_av); } else { return srs_error_new(ERROR_HTTP_LIVE_STREAM_EXT, "invalid pattern=%s", entry->pattern.c_str()); } diff --git a/trunk/src/app/srs_app_http_stream.hpp b/trunk/src/app/srs_app_http_stream.hpp index 272c3b1bd..64e826c01 100755 --- a/trunk/src/app/srs_app_http_stream.hpp +++ b/trunk/src/app/srs_app_http_stream.hpp @@ -114,6 +114,7 @@ public: public: void set_has_audio(bool v); void set_has_video(bool v); + void set_guess_has_av(bool v); }; // Transmux RTMP with AAC stream to HTTP AAC Streaming. diff --git a/trunk/src/core/srs_core_version6.hpp b/trunk/src/core/srs_core_version6.hpp index 9b6cb83ce..d6c8534e9 100644 --- a/trunk/src/core/srs_core_version6.hpp +++ b/trunk/src/core/srs_core_version6.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 -#define VERSION_REVISION 140 +#define VERSION_REVISION 141 #endif diff --git a/trunk/src/kernel/srs_kernel_ts.cpp b/trunk/src/kernel/srs_kernel_ts.cpp index 5ae6e3e7d..eef2983bb 100644 --- a/trunk/src/kernel/srs_kernel_ts.cpp +++ b/trunk/src/kernel/srs_kernel_ts.cpp @@ -3176,6 +3176,7 @@ SrsTsTransmuxer::SrsTsTransmuxer() context = new SrsTsContext(); tscw = NULL; has_audio_ = has_video_ = true; + guess_has_av_ = true; } SrsTsTransmuxer::~SrsTsTransmuxer() @@ -3189,11 +3190,28 @@ SrsTsTransmuxer::~SrsTsTransmuxer() void SrsTsTransmuxer::set_has_audio(bool v) { has_audio_ = v; + + if (tscw != NULL && !v) { + tscw->set_acodec(SrsAudioCodecIdForbidden); + } } void SrsTsTransmuxer::set_has_video(bool v) { has_video_ = v; + + if (tscw != NULL && !v) { + tscw->set_vcodec(SrsVideoCodecIdForbidden); + } +} + +void SrsTsTransmuxer::set_guess_has_av(bool v) +{ + guess_has_av_ = v; + if (tscw != NULL && v) { + tscw->set_acodec(SrsAudioCodecIdForbidden); + tscw->set_vcodec(SrsVideoCodecIdForbidden); + } } srs_error_t SrsTsTransmuxer::initialize(ISrsStreamWriter* fw) @@ -3211,6 +3229,11 @@ srs_error_t SrsTsTransmuxer::initialize(ISrsStreamWriter* fw) SrsAudioCodecId acodec = has_audio_ ? SrsAudioCodecIdAAC : SrsAudioCodecIdForbidden; SrsVideoCodecId vcodec = has_video_ ? SrsVideoCodecIdAVC : SrsVideoCodecIdForbidden; + if (guess_has_av_) { + acodec = SrsAudioCodecIdForbidden; + vcodec = SrsVideoCodecIdForbidden; + } + srs_freep(tscw); tscw = new SrsTsContextWriter(fw, context, acodec, vcodec); diff --git a/trunk/src/kernel/srs_kernel_ts.hpp b/trunk/src/kernel/srs_kernel_ts.hpp index e79f07f9e..d80f11236 100644 --- a/trunk/src/kernel/srs_kernel_ts.hpp +++ b/trunk/src/kernel/srs_kernel_ts.hpp @@ -1333,6 +1333,7 @@ private: ISrsStreamWriter* writer; bool has_audio_; bool has_video_; + bool guess_has_av_; private: SrsFormat* format; SrsTsMessageCache* tsmc; @@ -1344,6 +1345,7 @@ public: public: void set_has_audio(bool v); void set_has_video(bool v); + void set_guess_has_av(bool v); public: // Initialize the underlayer file stream. // @param fw the writer to use for ts encoder, user must free it.