diff --git a/README.md b/README.md index 3b27b2f101..57a7535395 100755 --- a/README.md +++ b/README.md @@ -765,7 +765,9 @@ About the HLS overhead of SRS, we compare the overhead to FLV by remux the HLS t | 5147kbps | 370s | 195040 | 200280 | 2.68% | | 5158kbps | 1327s | 835664 | 858092 | 2.68% | -The HLS overhead is calc by: (HLS - FLV) / FLV * 100% +The HLS overhead is calc by: (HLS - FLV) / FLV * 100%. + +The overhead is larger than this benchmark(48kbps audio is best overhead), for we fix the [#512][bug#512]. ## Architecture @@ -1193,6 +1195,8 @@ Winlin [bug #59]: https://github.com/simple-rtmp-server/srs/issues/59 [bug #50]: https://github.com/simple-rtmp-server/srs/issues/50 [bug #34]: https://github.com/simple-rtmp-server/srs/issues/34 +[bug #512]: https://github.com/simple-rtmp-server/srs/issues/512 +[bug #xxxxxxxxxx]: https://github.com/simple-rtmp-server/srs/issues/xxxxxxxxxx [r2.0a2]: https://github.com/simple-rtmp-server/srs/releases/tag/v2.0-a2 [r2.0a1]: https://github.com/simple-rtmp-server/srs/releases/tag/2.0a1 diff --git a/trunk/src/app/srs_app_hls.cpp b/trunk/src/app/srs_app_hls.cpp index 8b36ab7f94..64a8396c0d 100644 --- a/trunk/src/app/srs_app_hls.cpp +++ b/trunk/src/app/srs_app_hls.cpp @@ -646,6 +646,11 @@ int SrsHlsMuxer::update_acodec(SrsCodecAudio ac) return current->muxer->update_acodec(ac); } +bool SrsHlsMuxer::pure_audio() +{ + return current && current->muxer && current->muxer->video_codec() == SrsCodecVideoDisabled; +} + int SrsHlsMuxer::flush_audio(SrsTsCache* cache) { int ret = ERROR_SUCCESS; @@ -1049,25 +1054,6 @@ int SrsHlsCache::write_audio(SrsAvcAacCodec* codec, SrsHlsMuxer* muxer, int64_t return ret; } - // flush if buffer exceed max size. - if (cache->audio->payload->length() > SRS_AUTO_HLS_AUDIO_CACHE_SIZE) { - if ((ret = muxer->flush_audio(cache)) != ERROR_SUCCESS) { - return ret; - } - } - - // TODO: config it. - // in ms, audio delay to flush the audios. - int64_t audio_delay = SRS_CONF_DEFAULT_AAC_DELAY; - // flush if audio delay exceed - // cache->audio will be free in flush_audio - // so we must check whether it's null ptr. - if (cache->audio && pts - cache->audio->start_pts > audio_delay * 90) { - if ((ret = muxer->flush_audio(cache)) != ERROR_SUCCESS) { - return ret; - } - } - // reap when current source is pure audio. // it maybe changed when stream info changed, // for example, pure audio when start, audio/video when publishing, @@ -1083,6 +1069,14 @@ int SrsHlsCache::write_audio(SrsAvcAacCodec* codec, SrsHlsMuxer* muxer, int64_t } } + // directly write the audio frame by frame to ts, + // it's ok for the hls overload, or maybe cause the audio corrupt, + // which introduced by aggregate the audios to a big one. + // @see https://github.com/simple-rtmp-server/srs/issues/512 + if ((ret = muxer->flush_audio(cache)) != ERROR_SUCCESS) { + return ret; + } + return ret; } @@ -1100,7 +1094,7 @@ int SrsHlsCache::write_video(SrsAvcAacCodec* codec, SrsHlsMuxer* muxer, int64_t // do reap ts if any of: // a. wait keyframe and got keyframe. // b. always reap when not wait keyframe. - if (!muxer->wait_keyframe()|| sample->frame_type == SrsCodecVideoAVCFrameKeyFrame) { + if (!muxer->wait_keyframe() || sample->frame_type == SrsCodecVideoAVCFrameKeyFrame) { // when wait keyframe, there must exists idr frame in sample. if (!sample->has_idr && muxer->wait_keyframe()) { srs_warn("hls: ts starts without IDR, first nalu=%d, idr=%d", sample->first_nalu_type, sample->has_idr); @@ -1110,9 +1104,6 @@ int SrsHlsCache::write_video(SrsAvcAacCodec* codec, SrsHlsMuxer* muxer, int64_t if ((ret = reap_segment("video", muxer, cache->video->dts)) != ERROR_SUCCESS) { return ret; } - - // the video must be flushed, just return. - return ret; } } diff --git a/trunk/src/app/srs_app_hls.hpp b/trunk/src/app/srs_app_hls.hpp index 62abd660f9..a9269d69ea 100644 --- a/trunk/src/app/srs_app_hls.hpp +++ b/trunk/src/app/srs_app_hls.hpp @@ -309,6 +309,10 @@ class SrsHlsMuxer virtual bool is_segment_absolutely_overflow(); public: virtual int update_acodec(SrsCodecAudio ac); + /** + * whether current hls muxer is pure audio mode. + */ + virtual bool pure_audio(); virtual int flush_audio(SrsTsCache* cache); virtual int flush_video(SrsTsCache* cache); /** diff --git a/trunk/src/kernel/srs_kernel_codec.hpp b/trunk/src/kernel/srs_kernel_codec.hpp index c47628276c..cc995dd046 100644 --- a/trunk/src/kernel/srs_kernel_codec.hpp +++ b/trunk/src/kernel/srs_kernel_codec.hpp @@ -246,12 +246,6 @@ extern int aac_sample_rates[]; #define SRS_SRS_MAX_CODEC_SAMPLE 128 #define SRS_AAC_SAMPLE_RATE_UNSET 15 -// in ms, for HLS aac flush the audio -#define SRS_CONF_DEFAULT_AAC_DELAY 60 - -// max PES packets size to flush the video. -#define SRS_AUTO_HLS_AUDIO_CACHE_SIZE 128 * 1024 - /** * the FLV/RTMP supported audio sample size. * Size of each audio sample. This parameter only pertains to diff --git a/trunk/src/kernel/srs_kernel_ts.cpp b/trunk/src/kernel/srs_kernel_ts.cpp index 0ae7d58a52..864e05aa8d 100644 --- a/trunk/src/kernel/srs_kernel_ts.cpp +++ b/trunk/src/kernel/srs_kernel_ts.cpp @@ -2760,6 +2760,11 @@ void SrsTSMuxer::close() writer->close(); } +SrsCodecVideo SrsTSMuxer::video_codec() +{ + return vcodec; +} + SrsTsCache::SrsTsCache() { audio = NULL; @@ -3134,20 +3139,9 @@ int SrsTsEncoder::write_audio(int64_t timestamp, char* data, int size) return ret; } - // flush if buffer exceed max size. - if (cache->audio->payload->length() > SRS_AUTO_HLS_AUDIO_CACHE_SIZE) { - return flush_video(); - } - - // TODO: config it. - // in ms, audio delay to flush the audios. - int64_t audio_delay = SRS_CONF_DEFAULT_AAC_DELAY; - // flush if audio delay exceed - if (dts - cache->audio->start_pts > audio_delay * 90) { - return flush_audio(); - } - - return ret; + // always flush audio frame by frame. + // @see https://github.com/simple-rtmp-server/srs/issues/512 + return flush_audio(); } int SrsTsEncoder::write_video(int64_t timestamp, char* data, int size) diff --git a/trunk/src/kernel/srs_kernel_ts.hpp b/trunk/src/kernel/srs_kernel_ts.hpp index e20778afc6..3003f6cf32 100644 --- a/trunk/src/kernel/srs_kernel_ts.hpp +++ b/trunk/src/kernel/srs_kernel_ts.hpp @@ -1586,6 +1586,11 @@ class SrsTSMuxer * close the writer. */ virtual void close(); +public: + /** + * get the video codec of ts muxer. + */ + virtual SrsCodecVideo video_codec(); }; /**