diff --git a/README.md b/README.md index 9d71e4071..ecdc0fad3 100755 --- a/README.md +++ b/README.md @@ -146,6 +146,7 @@ For previous versions, please read: ## V3 changes +* v3.0, 2020-02-04, Fix [#939][bug #939], response right A/V flag in FLV header. 3.0.113 * v3.0, 2020-02-04, For [#939][bug #939], always enable fast FLV streaming. * v3.0, 2020-02-02, [3.0 beta0(3.0.112)][r3.0b0] released. 121709 lines. * v3.0, 2020-01-29, Support isolate version file. 3.0.112 diff --git a/trunk/src/app/srs_app_http_stream.cpp b/trunk/src/app/srs_app_http_stream.cpp index e8253a94f..c7720be19 100755 --- a/trunk/src/app/srs_app_http_stream.cpp +++ b/trunk/src/app/srs_app_http_stream.cpp @@ -249,6 +249,7 @@ srs_error_t SrsTsStreamEncoder::dump_cache(SrsConsumer* /*consumer*/, SrsRtmpJit SrsFlvStreamEncoder::SrsFlvStreamEncoder() { + header_written = false; enc = new SrsFlvTransmuxer(); } @@ -265,26 +266,39 @@ srs_error_t SrsFlvStreamEncoder::initialize(SrsFileWriter* w, SrsBufferCache* /* return srs_error_wrap(err, "init encoder"); } - // write flv header. - if ((err = enc->write_header()) != srs_success) { - return srs_error_wrap(err, "write header"); - } - return err; } srs_error_t SrsFlvStreamEncoder::write_audio(int64_t timestamp, char* data, int size) { + srs_error_t err = srs_success; + + if ((err = write_header()) != srs_success) { + return srs_error_wrap(err, "write header"); + } + return enc->write_audio(timestamp, data, size); } srs_error_t SrsFlvStreamEncoder::write_video(int64_t timestamp, char* data, int size) { + srs_error_t err = srs_success; + + if ((err = write_header()) != srs_success) { + return srs_error_wrap(err, "write header"); + } + return enc->write_video(timestamp, data, size); } srs_error_t SrsFlvStreamEncoder::write_metadata(int64_t timestamp, char* data, int size) { + srs_error_t err = srs_success; + + if ((err = write_header()) != srs_success) { + return srs_error_wrap(err, "write header"); + } + return enc->write_metadata(SrsFrameTypeScript, data, size); } @@ -302,9 +316,52 @@ srs_error_t SrsFlvStreamEncoder::dump_cache(SrsConsumer* /*consumer*/, SrsRtmpJi srs_error_t SrsFlvStreamEncoder::write_tags(SrsSharedPtrMessage** msgs, int count) { + srs_error_t err = srs_success; + + // For https://github.com/ossrs/srs/issues/939 + if (!header_written) { + bool has_video = false; + bool has_audio = false; + + for (int i = 0; i < count && (!has_video || !has_audio); i++) { + SrsSharedPtrMessage* msg = msgs[i]; + if (msg->is_video()) { + has_video = true; + } else if (msg->is_audio()) { + has_audio = true; + } + } + + // Drop data if no A+V. + if (!has_video && !has_audio) { + return err; + } + + if ((err = write_header(has_video, has_audio)) != srs_success) { + return srs_error_wrap(err, "write header"); + } + } + return enc->write_tags(msgs, count); } +srs_error_t SrsFlvStreamEncoder::write_header(bool has_video, bool has_audio) +{ + srs_error_t err = srs_success; + + if (!header_written) { + header_written = true; + + if ((err = enc->write_header(has_video, has_audio)) != srs_success) { + return srs_error_wrap(err, "write header"); + } + + srs_trace("FLV: write header audio=%d, video=%d", has_audio, has_video); + } + + return err; +} + SrsAacStreamEncoder::SrsAacStreamEncoder() { enc = new SrsAacTransmuxer(); diff --git a/trunk/src/app/srs_app_http_stream.hpp b/trunk/src/app/srs_app_http_stream.hpp index c9a6f7904..720e53e3a 100755 --- a/trunk/src/app/srs_app_http_stream.hpp +++ b/trunk/src/app/srs_app_http_stream.hpp @@ -82,8 +82,9 @@ public: // Transmux RTMP to HTTP Live Streaming. class SrsFlvStreamEncoder : public ISrsBufferEncoder { -protected: +private: SrsFlvTransmuxer* enc; + bool header_written; public: SrsFlvStreamEncoder(); virtual ~SrsFlvStreamEncoder(); @@ -98,6 +99,8 @@ public: public: // Write the tags in a time. virtual srs_error_t write_tags(SrsSharedPtrMessage** msgs, int count); +private: + virtual srs_error_t write_header(bool has_video = true, bool has_audio = true); }; // Transmux RTMP to HTTP TS Streaming. diff --git a/trunk/src/core/srs_core_version3.hpp b/trunk/src/core/srs_core_version3.hpp index 05251a733..0977c5458 100644 --- a/trunk/src/core/srs_core_version3.hpp +++ b/trunk/src/core/srs_core_version3.hpp @@ -24,6 +24,6 @@ #ifndef SRS_CORE_VERSION3_HPP #define SRS_CORE_VERSION3_HPP -#define SRS_VERSION3_REVISION 112 +#define SRS_VERSION3_REVISION 113 #endif