mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
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.
282d94d7bb/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 <winlinvip@gmail.com>
This commit is contained in:
parent
d50fb1563a
commit
eb788a62ad
6 changed files with 35 additions and 1 deletions
|
@ -7,6 +7,7 @@ The changelog for SRS.
|
||||||
<a name="v6-changes"></a>
|
<a name="v6-changes"></a>
|
||||||
|
|
||||||
## SRS 6.0 Changelog
|
## 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 [#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-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)
|
* 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)
|
||||||
|
|
|
@ -257,11 +257,17 @@ void SrsTsStreamEncoder::set_has_audio(bool v)
|
||||||
{
|
{
|
||||||
enc->set_has_audio(v);
|
enc->set_has_audio(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SrsTsStreamEncoder::set_has_video(bool v)
|
void SrsTsStreamEncoder::set_has_video(bool v)
|
||||||
{
|
{
|
||||||
enc->set_has_video(v);
|
enc->set_has_video(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SrsTsStreamEncoder::set_guess_has_av(bool v)
|
||||||
|
{
|
||||||
|
enc->set_guess_has_av(v);
|
||||||
|
}
|
||||||
|
|
||||||
SrsFlvStreamEncoder::SrsFlvStreamEncoder()
|
SrsFlvStreamEncoder::SrsFlvStreamEncoder()
|
||||||
{
|
{
|
||||||
header_written = false;
|
header_written = false;
|
||||||
|
@ -677,6 +683,7 @@ srs_error_t SrsLiveStream::do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMess
|
||||||
enc_raw = new SrsTsStreamEncoder();
|
enc_raw = new SrsTsStreamEncoder();
|
||||||
((SrsTsStreamEncoder*)enc_raw)->set_has_audio(has_audio);
|
((SrsTsStreamEncoder*)enc_raw)->set_has_audio(has_audio);
|
||||||
((SrsTsStreamEncoder*)enc_raw)->set_has_video(has_video);
|
((SrsTsStreamEncoder*)enc_raw)->set_has_video(has_video);
|
||||||
|
((SrsTsStreamEncoder*)enc_raw)->set_guess_has_av(guess_has_av);
|
||||||
} else {
|
} else {
|
||||||
return srs_error_new(ERROR_HTTP_LIVE_STREAM_EXT, "invalid pattern=%s", entry->pattern.c_str());
|
return srs_error_new(ERROR_HTTP_LIVE_STREAM_EXT, "invalid pattern=%s", entry->pattern.c_str());
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,6 +114,7 @@ public:
|
||||||
public:
|
public:
|
||||||
void set_has_audio(bool v);
|
void set_has_audio(bool v);
|
||||||
void set_has_video(bool v);
|
void set_has_video(bool v);
|
||||||
|
void set_guess_has_av(bool v);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Transmux RTMP with AAC stream to HTTP AAC Streaming.
|
// Transmux RTMP with AAC stream to HTTP AAC Streaming.
|
||||||
|
|
|
@ -9,6 +9,6 @@
|
||||||
|
|
||||||
#define VERSION_MAJOR 6
|
#define VERSION_MAJOR 6
|
||||||
#define VERSION_MINOR 0
|
#define VERSION_MINOR 0
|
||||||
#define VERSION_REVISION 140
|
#define VERSION_REVISION 141
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -3176,6 +3176,7 @@ SrsTsTransmuxer::SrsTsTransmuxer()
|
||||||
context = new SrsTsContext();
|
context = new SrsTsContext();
|
||||||
tscw = NULL;
|
tscw = NULL;
|
||||||
has_audio_ = has_video_ = true;
|
has_audio_ = has_video_ = true;
|
||||||
|
guess_has_av_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsTsTransmuxer::~SrsTsTransmuxer()
|
SrsTsTransmuxer::~SrsTsTransmuxer()
|
||||||
|
@ -3189,11 +3190,28 @@ SrsTsTransmuxer::~SrsTsTransmuxer()
|
||||||
void SrsTsTransmuxer::set_has_audio(bool v)
|
void SrsTsTransmuxer::set_has_audio(bool v)
|
||||||
{
|
{
|
||||||
has_audio_ = v;
|
has_audio_ = v;
|
||||||
|
|
||||||
|
if (tscw != NULL && !v) {
|
||||||
|
tscw->set_acodec(SrsAudioCodecIdForbidden);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SrsTsTransmuxer::set_has_video(bool v)
|
void SrsTsTransmuxer::set_has_video(bool v)
|
||||||
{
|
{
|
||||||
has_video_ = 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)
|
srs_error_t SrsTsTransmuxer::initialize(ISrsStreamWriter* fw)
|
||||||
|
@ -3211,6 +3229,11 @@ srs_error_t SrsTsTransmuxer::initialize(ISrsStreamWriter* fw)
|
||||||
SrsAudioCodecId acodec = has_audio_ ? SrsAudioCodecIdAAC : SrsAudioCodecIdForbidden;
|
SrsAudioCodecId acodec = has_audio_ ? SrsAudioCodecIdAAC : SrsAudioCodecIdForbidden;
|
||||||
SrsVideoCodecId vcodec = has_video_ ? SrsVideoCodecIdAVC : SrsVideoCodecIdForbidden;
|
SrsVideoCodecId vcodec = has_video_ ? SrsVideoCodecIdAVC : SrsVideoCodecIdForbidden;
|
||||||
|
|
||||||
|
if (guess_has_av_) {
|
||||||
|
acodec = SrsAudioCodecIdForbidden;
|
||||||
|
vcodec = SrsVideoCodecIdForbidden;
|
||||||
|
}
|
||||||
|
|
||||||
srs_freep(tscw);
|
srs_freep(tscw);
|
||||||
tscw = new SrsTsContextWriter(fw, context, acodec, vcodec);
|
tscw = new SrsTsContextWriter(fw, context, acodec, vcodec);
|
||||||
|
|
||||||
|
|
|
@ -1333,6 +1333,7 @@ private:
|
||||||
ISrsStreamWriter* writer;
|
ISrsStreamWriter* writer;
|
||||||
bool has_audio_;
|
bool has_audio_;
|
||||||
bool has_video_;
|
bool has_video_;
|
||||||
|
bool guess_has_av_;
|
||||||
private:
|
private:
|
||||||
SrsFormat* format;
|
SrsFormat* format;
|
||||||
SrsTsMessageCache* tsmc;
|
SrsTsMessageCache* tsmc;
|
||||||
|
@ -1344,6 +1345,7 @@ public:
|
||||||
public:
|
public:
|
||||||
void set_has_audio(bool v);
|
void set_has_audio(bool v);
|
||||||
void set_has_video(bool v);
|
void set_has_video(bool v);
|
||||||
|
void set_guess_has_av(bool v);
|
||||||
public:
|
public:
|
||||||
// Initialize the underlayer file stream.
|
// Initialize the underlayer file stream.
|
||||||
// @param fw the writer to use for ts encoder, user must free it.
|
// @param fw the writer to use for ts encoder, user must free it.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue