From f00d1c189a725d08c548e7a274240b5c9840dc71 Mon Sep 17 00:00:00 2001 From: Andrey Semochkin Date: Tue, 12 Jan 2021 03:58:07 +0300 Subject: [PATCH] BigBuckBunny multiple aac fix --- format/rtspv2/client.go | 65 ++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/format/rtspv2/client.go b/format/rtspv2/client.go index 59a549c..a7056f6 100644 --- a/format/rtspv2/client.go +++ b/format/rtspv2/client.go @@ -590,32 +590,63 @@ func (client *RTSPClient) RTPDemuxer(payloadRAW *[]byte) ([]*av.Packet, bool) { case av.PCM_MULAW: duration = time.Duration(len(nal)) * time.Second / time.Duration(client.AudioTimeScale) client.AudioTimeLine += duration + retmap = append(retmap, &av.Packet{ + Data: append(binSize(len(nal)), nal...), + CompositionTime: time.Duration(1) * time.Millisecond, + Duration: duration, + Idx: client.audioIDX, + IsKeyFrame: false, + Time: client.AudioTimeLine, + }) case av.PCM_ALAW: duration = time.Duration(len(nal)) * time.Second / time.Duration(client.AudioTimeScale) client.AudioTimeLine += duration + retmap = append(retmap, &av.Packet{ + Data: append(binSize(len(nal)), nal...), + CompositionTime: time.Duration(1) * time.Millisecond, + Duration: duration, + Idx: client.audioIDX, + IsKeyFrame: false, + Time: client.AudioTimeLine, + }) case av.OPUS: duration = time.Duration(20) * time.Millisecond client.AudioTimeLine += duration + retmap = append(retmap, &av.Packet{ + Data: append(binSize(len(nal)), nal...), + CompositionTime: time.Duration(1) * time.Millisecond, + Duration: duration, + Idx: client.audioIDX, + IsKeyFrame: false, + Time: client.AudioTimeLine, + }) case av.AAC: - if nal[1] == 32 { - return nil, false + auHeadersLength := uint16(0) | (uint16(nal[0]) << 8) | uint16(nal[1]) + auHeadersCount := auHeadersLength >> 4 + framesPayloadOffset := 2 + int(auHeadersCount)<<1 + auHeaders := nal[2:framesPayloadOffset] + framesPayload := nal[framesPayloadOffset:] + for i := 0; i < int(auHeadersCount); i++ { + auHeader := uint16(0) | (uint16(auHeaders[0]) << 8) | uint16(auHeaders[1]) + frameSize := auHeader >> 3 + frame := framesPayload[:frameSize] + auHeaders = auHeaders[2:] + framesPayload = framesPayload[frameSize:] + if _, _, _, _, err := aacparser.ParseADTSHeader(frame); err == nil { + frame = frame[7:] + } + duration = time.Duration((float32(1024)/float32(client.AudioTimeScale))*1000) * time.Millisecond + client.AudioTimeLine += duration + retmap = append(retmap, &av.Packet{ + Data: append(binSize(len(frame)), frame...), + CompositionTime: time.Duration(1) * time.Millisecond, + Duration: duration, + Idx: client.audioIDX, + IsKeyFrame: false, + Time: client.AudioTimeLine, + }) } - nal = nal[4:] - if _, _, _, _, err := aacparser.ParseADTSHeader(nal); err == nil { - nal = nal[7:] - } - duration = time.Duration((float32(1024)/float32(client.AudioTimeScale))*1000) * time.Millisecond - client.AudioTimeLine += duration } - - retmap = append(retmap, &av.Packet{ - Data: append(binSize(len(nal)), nal...), - CompositionTime: time.Duration(1) * time.Millisecond, - Duration: duration, - Idx: client.audioIDX, - IsKeyFrame: false, - Time: client.AudioTimeLine, - }) } if len(retmap) > 0 { client.PreAudioTS = timestamp