mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
For #1506, refine the AAC samples guess algorithm.
This commit is contained in:
parent
52c6c7c45d
commit
31f341e205
1 changed files with 21 additions and 7 deletions
|
@ -1230,17 +1230,31 @@ srs_error_t SrsHls::on_audio(SrsSharedPtrMessage* shared_audio, SrsFormat* forma
|
||||||
aac_samples = 0;
|
aac_samples = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use the diff to guess whether the samples is 1024 or 960.
|
// The diff duration in ms between two FLV audio packets.
|
||||||
int nb_samples_per_frame = 1024;
|
int diff = ::abs((int)(audio->timestamp - previous_audio_dts));
|
||||||
int diff = ::abs((int)(audio->timestamp - previous_audio_dts)) * srs_flv_srates[format->acodec->sound_rate];
|
|
||||||
previous_audio_dts = audio->timestamp;
|
previous_audio_dts = audio->timestamp;
|
||||||
if (diff > 100 && diff < 950) {
|
|
||||||
nb_samples_per_frame = 960;
|
// Guess the number of samples for each AAC frame.
|
||||||
|
// If samples is 1024, the sample-rate is 8000HZ, the diff should be 1024/8000s=128ms.
|
||||||
|
// If samples is 1024, the sample-rate is 44100HZ, the diff should be 1024/44100s=23ms.
|
||||||
|
// If samples is 2048, the sample-rate is 44100HZ, the diff should be 2048/44100s=46ms.
|
||||||
|
int nb_samples_per_frame = 0;
|
||||||
|
int guessNumberOfSamples = diff * srs_flv_srates[format->acodec->sound_rate] / 1000;
|
||||||
|
if (guessNumberOfSamples > 0) {
|
||||||
|
if (guessNumberOfSamples < 960) {
|
||||||
|
nb_samples_per_frame = 960;
|
||||||
|
} else if (guessNumberOfSamples < 1536) {
|
||||||
|
nb_samples_per_frame = 1024;
|
||||||
|
} else if (guessNumberOfSamples < 3072) {
|
||||||
|
nb_samples_per_frame = 2048;
|
||||||
|
} else {
|
||||||
|
nb_samples_per_frame = 4096;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recalc the DTS by the samples of AAC.
|
// 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;
|
aac_samples += nb_samples_per_frame;
|
||||||
|
int64_t dts = 90000 * aac_samples / srs_flv_srates[format->acodec->sound_rate];
|
||||||
|
|
||||||
if ((err = controller->write_audio(format->audio, dts)) != srs_success) {
|
if ((err = controller->write_audio(format->audio, dts)) != srs_success) {
|
||||||
return srs_error_wrap(err, "hls: write audio");
|
return srs_error_wrap(err, "hls: write audio");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue