@@ -606,13 +606,28 @@ export class MP4Parser {
606606 ret . codec += ( data [ start ] . toString ( 16 ) + '.' ) . padStart ( 3 , '0' )
607607 data = data . subarray ( start + 13 )
608608 } else if ( tag === 5 ) {
609+ // AudioSpecificConfig
609610 const config = ret . config = data . subarray ( start , start + size )
611+
612+ // ObjectType
610613 let objectType = ( config [ 0 ] & 0xF8 ) >> 3
611614 if ( objectType === 31 && config . length >= 2 ) {
612615 objectType = 32 + ( ( config [ 0 ] & 0x7 ) << 3 ) + ( ( config [ 1 ] & 0xE0 ) >> 5 )
613616 }
614617 ret . objectType = objectType
615618 ret . codec += objectType . toString ( 16 )
619+
620+ // SamplingFrequencyIndex
621+ if ( / ^ m p 4 a / ig. test ( ret . codec ) && config . length >= 2 ) {
622+ const samplingFrequencyIndex = ( config [ 0 ] & 0x07 ) << 1 | ( ( config [ 1 ] & 0x80 ) >> 7 )
623+ ret . samplingFrequencyIndex = samplingFrequencyIndex
624+
625+ // Map sampling frequency index to actual frequency
626+ if ( samplingFrequencyIndex < AAC . FREQ . length ) {
627+ ret . sampleRate = AAC . FREQ [ samplingFrequencyIndex ]
628+ }
629+ }
630+
616631 if ( ret . codec [ ret . codec . length - 1 ] === '.' ) {
617632 ret . codec = ret . codec . substring ( 0 , ret . codec . length - 1 )
618633 }
@@ -920,7 +935,7 @@ export class MP4Parser {
920935 a . duration = aTrack . mdia . mdhd . duration || ( a . mvhdDurtion / a . mvhdTimecale * a . timescale )
921936 const e1 = aTrack . mdia . minf . stbl . stsd . entries [ 0 ]
922937 a . sampleSize = e1 . sampleSize
923- a . sampleRate = e1 . sampleRate
938+ a . sampleRate = getAudioSampleRate ( e1 )
924939 a . channelCount = e1 . channelCount
925940 a . present = true
926941
@@ -1087,6 +1102,18 @@ export class MP4Parser {
10871102 }
10881103}
10891104
1105+ export function getAudioSampleRate ( audioSampleEntry ) {
1106+ let sampleRate = 0
1107+ if ( audioSampleEntry . type === 'mp4a' ) {
1108+ if ( audioSampleEntry . sampleRate > 0 ) {
1109+ sampleRate = audioSampleEntry . sampleRate
1110+ } else {
1111+ sampleRate = audioSampleEntry . esds . sampleRate
1112+ }
1113+ }
1114+ return sampleRate || 0
1115+ }
1116+
10901117function getSamples ( stts , stsc , stsz , stco , ctts , stss ) {
10911118 const samples = [ ]
10921119 const cttsEntries = ctts ?. entries
0 commit comments