1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-02-12 11:21:52 +00:00

Fix #547, support HLS audio in TS. 3.0.22

This commit is contained in:
winlin 2017-04-16 21:33:39 +08:00
parent 6ee85aea83
commit a98c9e04e3
5 changed files with 30 additions and 4 deletions

View file

@ -174,7 +174,7 @@ Please select your language:
- [x] [experiment] Support push POST FLV over HTTP, please read [wiki]([CN][v2_CN_Streamer2], [EN][v2_EN_Streamer2]).
- [x] [experiment] Support multiple processes by [dolphin][srs-dolphin] or [oryx][oryx].
- [x] [experiment] Support [mgmt console][console], please read [srs-ngb][srs-ngb].
- [ ] Enhanced HLS audio-only use aac instead of ts.
- [x] Enhanced HLS audio-only use ts, see [#547][bug #547].
- [ ] Enhanced forward with vhost and url variables.
- [ ] Support source or idle stream cleanup.
- [ ] Support origin cluster, please read [#464][bug #464], [RTMP 302][bug #92].
@ -186,6 +186,7 @@ Please select your language:
### V3 changes
* v3.0, 2017-04-16, Fix [#547][bug #547], support HLS audio in TS. 3.0.22
* v3.0, 2017-03-26, Fix [#820][bug #820], extract service for modules. 3.0.21
* v3.0, 2017-03-02, Fix [#786][bug #786], simply don't reuse object. 3.0.20
* v3.0, 2017-03-01, For [#110][bug #110], refine thread object. 3.0.19
@ -1400,6 +1401,7 @@ Winlin
[bug #738]: https://github.com/ossrs/srs/issues/738
[bug #786]: https://github.com/ossrs/srs/issues/786
[bug #820]: https://github.com/ossrs/srs/issues/820
[bug #547]: https://github.com/ossrs/srs/issues/547
[bug #xxxxxxxxxxxxx]: https://github.com/ossrs/srs/issues/xxxxxxxxxxxxx
[exo #828]: https://github.com/google/ExoPlayer/pull/828

View file

@ -969,6 +969,9 @@ SrsHls::SrsHls()
disposable = false;
last_update_time = 0;
previous_audio_dts = 0;
aac_samples = 0;
jitter = new SrsRtmpJitter();
controller = new SrsHlsController();
@ -1115,8 +1118,22 @@ int SrsHls::on_audio(SrsSharedPtrMessage* shared_audio, SrsFormat* format)
return ret;
}
// the dts calc from rtmp/flv header.
int64_t dts = audio->timestamp * 90;
// Reset the aac samples counter when DTS jitter.
if (previous_audio_dts > audio->timestamp) {
previous_audio_dts = audio->timestamp;
aac_samples = 0;
}
// Use the diff to guess whether the samples is 1024 or 960.
int nb_samples_per_frame = 1024;
int diff = ::abs((int)(audio->timestamp - previous_audio_dts)) * srs_flv_srates[format->acodec->sound_rate];
if (diff > 100 && diff < 950) {
nb_samples_per_frame = 960;
}
// Recalc the DTS by the samples of AAC.
int64_t dts = 90000 * aac_samples / srs_flv_srates[format->acodec->sound_rate];
aac_samples += nb_samples_per_frame;
if ((ret = controller->write_audio(format->audio, dts)) != ERROR_SUCCESS) {
srs_error("hls cache write audio failed. ret=%d", ret);

View file

@ -298,6 +298,12 @@ private:
bool enabled;
bool disposable;
int64_t last_update_time;
private:
// If the diff=dts-previous_audio_dts is about 23,
// that's the AAC samples is 1024, and we use the samples to calc the dts.
int64_t previous_audio_dts;
// The total aac samples.
uint64_t aac_samples;
private:
SrsOriginHub* hub;
SrsRtmpJitter* jitter;

View file

@ -27,7 +27,7 @@
// current release version
#define VERSION_MAJOR 3
#define VERSION_MINOR 0
#define VERSION_REVISION 21
#define VERSION_REVISION 22
// generated by configure, only macros.
#include <srs_auto_headers.hpp>

View file

@ -183,6 +183,7 @@ enum SrsAudioAacFrameTrait
* 2 = 22 kHz = 22050 Hz
* 3 = 44 kHz = 44100 Hz
* However, we can extends this table.
* @remark Use srs_flv_srates to convert it.
*/
enum SrsAudioSampleRate
{