diff --git a/README.md b/README.md index 57a753539..e6e18c489 100755 --- a/README.md +++ b/README.md @@ -336,6 +336,7 @@ Remark: ## History +* v2.0, 2015-10-27, for [#512][bug #512] partical hotfix the hls pure audio. 2.0.196 * v2.0, 2015-10-08, [2.0 alpha2(2.0.195)][r2.0a2] released. 89358 lines. * v2.0, 2015-10-04, for [#448][bug #448] fix the bug of response of http hooks. 2.0.195 * v2.0, 2015-10-01, for [#497][bug #497] response error when client not found to kickoff. 2.0.194 diff --git a/trunk/src/app/srs_app_hls.cpp b/trunk/src/app/srs_app_hls.cpp index 64a8396c0..71360f6ef 100644 --- a/trunk/src/app/srs_app_hls.cpp +++ b/trunk/src/app/srs_app_hls.cpp @@ -578,6 +578,7 @@ int SrsHlsMuxer::segment_open(int64_t segment_start_dts) current->full_path.c_str(), tmp_file.c_str()); // set the segment muxer audio codec. + // TODO: FIXME: refine code, use event instead. if (acodec != SrsCodecAudioReserved1) { current->muxer->update_acodec(acodec); } @@ -1044,7 +1045,7 @@ int SrsHlsCache::on_sequence_header(SrsHlsMuxer* muxer) // when the sequence header changed, the stream is not republish. return muxer->on_sequence_header(); } - + int SrsHlsCache::write_audio(SrsAvcAacCodec* codec, SrsHlsMuxer* muxer, int64_t pts, SrsCodecSample* sample) { int ret = ERROR_SUCCESS; @@ -1069,6 +1070,13 @@ int SrsHlsCache::write_audio(SrsAvcAacCodec* codec, SrsHlsMuxer* muxer, int64_t } } + // for pure audio, aggregate some frame to one. + if (muxer->pure_audio() && cache->audio) { + if (pts - cache->audio->start_pts < SRS_CONSTS_HLS_PURE_AUDIO_AGGREGATE) { + return ret; + } + } + // 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. diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index d4d96eb3e..d059c1afa 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR 2 #define VERSION_MINOR 0 -#define VERSION_REVISION 195 +#define VERSION_REVISION 196 // server info. #define RTMP_SIG_SRS_KEY "SRS" diff --git a/trunk/src/kernel/srs_kernel_ts.cpp b/trunk/src/kernel/srs_kernel_ts.cpp index 864e05aa8..e0a9961a6 100644 --- a/trunk/src/kernel/srs_kernel_ts.cpp +++ b/trunk/src/kernel/srs_kernel_ts.cpp @@ -459,8 +459,11 @@ int SrsTsContext::encode_pes(SrsFileWriter* writer, SrsTsMessage* msg, int16_t p while (p < end) { SrsTsPacket* pkt = NULL; if (p == start) { - // for pure audio stream, always write pcr. + // write pcr according to message. bool write_pcr = msg->write_pcr; + + // for pure audio, always write pcr. + // TODO: FIXME: maybe only need to write at begin and end of ts. if (pure_audio && msg->is_audio()) { write_pcr = true; } @@ -2785,11 +2788,12 @@ int SrsTsCache::cache_audio(SrsAvcAacCodec* codec, int64_t dts, SrsCodecSample* if (!audio) { audio = new SrsTsMessage(); audio->write_pcr = false; - audio->start_pts = dts; + audio->dts = audio->pts = audio->start_pts = dts; } - audio->dts = dts; - audio->pts = audio->dts; + // TODO: FIXME: refine code. + //audio->dts = dts; + //audio->pts = audio->dts; audio->sid = SrsTsPESStreamIdAudioCommon; // must be aac or mp3 @@ -3139,6 +3143,8 @@ int SrsTsEncoder::write_audio(int64_t timestamp, char* data, int size) return ret; } + // TODO: FIXME: for pure audio, aggregate some frame to one. + // always flush audio frame by frame. // @see https://github.com/simple-rtmp-server/srs/issues/512 return flush_audio(); diff --git a/trunk/src/kernel/srs_kernel_ts.hpp b/trunk/src/kernel/srs_kernel_ts.hpp index 3003f6cf3..42d40a8af 100644 --- a/trunk/src/kernel/srs_kernel_ts.hpp +++ b/trunk/src/kernel/srs_kernel_ts.hpp @@ -54,6 +54,9 @@ class SrsTsContext; // Transport Stream packets are 188 bytes in length. #define SRS_TS_PACKET_SIZE 188 +// the aggregate pure audio for hls, in ts tbn(ms * 90). +#define SRS_CONSTS_HLS_PURE_AUDIO_AGGREGATE 720 * 90 + /** * the pid of ts packet, * Table 2-3 - PID table, hls-mpeg-ts-iso13818-1.pdf, page 37 @@ -359,6 +362,7 @@ public: /** * whether the hls stream is pure audio stream. */ + // TODO: FIXME: merge with muxer codec detect. virtual bool is_pure_audio(); /** * when PMT table parsed, we know some info about stream.