diff --git a/codec/codec.go b/codec/codec.go index 9e25805..be52bb1 100644 --- a/codec/codec.go +++ b/codec/codec.go @@ -2,8 +2,6 @@ package codec import ( "errors" - - "m7s.live/engine/v4/util" ) type AudioCodecID byte @@ -70,7 +68,7 @@ type GASpecificConfig struct { // ISO/IEC 13838-7 20(25)/page // -// Advanced Audio Coding +// # Advanced Audio Coding // // AudioDataTransportStream type ADTS struct { @@ -109,7 +107,6 @@ type ADTSFixedHeader struct { // 1: Low Complexity profile(LC) // 2: Scalable Sampling Rate profile(SSR) // 3: Reserved -// var SamplingFrequencies = [...]int{96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0, 0} // Sampling Frequencies[]: @@ -220,18 +217,19 @@ func AudioSpecificConfigToADTS(asc *AudioSpecificConfig, rawDataLength int) (adt return } -func ParseRTPAAC(payload []byte) (result [][]byte) { - auHeaderLen := util.ReadBE[int](payload[:2]) >> 3 - var auLenArray []int - for iIndex := 2; iIndex <= auHeaderLen; iIndex += 2 { - auLen := util.ReadBE[int](payload[iIndex:iIndex+2]) >> 3 - auLenArray = append(auLenArray, auLen) - } - startOffset := 2 + auHeaderLen - for _, auLen := range auLenArray { - endOffset := startOffset + auLen - result = append(result, payload[startOffset:endOffset]) - startOffset = startOffset + auLen - } - return -} + +// func ParseRTPAAC(payload []byte) (result [][]byte) { +// auHeaderLen := util.ReadBE[int](payload[:2]) >> 3 +// var auLenArray []int +// for iIndex := 2; iIndex <= auHeaderLen; iIndex += 2 { +// auLen := util.ReadBE[int](payload[iIndex:iIndex+2]) >> 3 +// auLenArray = append(auLenArray, auLen) +// } +// startOffset := 2 + auHeaderLen +// for _, auLen := range auLenArray { +// endOffset := startOffset + auLen +// result = append(result, payload[startOffset:endOffset]) +// startOffset = startOffset + auLen +// } +// return +// } diff --git a/track/aac.go b/track/aac.go index 68d5531..3ee88d0 100644 --- a/track/aac.go +++ b/track/aac.go @@ -91,7 +91,6 @@ func (aac *AAC) WriteAVCC(ts uint32, frame AVCCFrame) { func (aac *AAC) Flush() { // RTP格式补完 - // TODO: MTU 分割 value := aac.Audio.Media.RingBuffer.Value if aac.ComplementRTP() { l := util.SizeOfBuffers(value.Raw) @@ -101,7 +100,8 @@ func (aac *AAC) Flush() { for i, raw := range value.Raw { packet[i+1] = raw } - aac.PacketizeRTP(packet) + packets := util.SplitBuffers(packet, 1200) + aac.PacketizeRTP(packets...) } aac.Audio.Flush() } diff --git a/track/base.go b/track/base.go index 129b019..c2a51c9 100644 --- a/track/base.go +++ b/track/base.go @@ -2,7 +2,6 @@ package track import ( "context" - "net" "time" "unsafe" @@ -135,7 +134,7 @@ func (av *Media[T]) ComplementRTP() bool { // https://www.cnblogs.com/moonwalk/p/15903760.html // Packetize packetizes the payload of an RTP packet and returns one or more RTP packets -func (av *Media[T]) PacketizeRTP(payloads ...net.Buffers) { +func (av *Media[T]) PacketizeRTP(payloads ...[][]byte) { packetCount := len(payloads) if cap(av.Value.RTP) < packetCount { av.Value.RTP = make([]*RTPFrame, packetCount) diff --git a/track/h264.go b/track/h264.go index f3fa03a..65eab73 100644 --- a/track/h264.go +++ b/track/h264.go @@ -161,19 +161,19 @@ func (vt *H264) Flush() { } // RTP格式补完 if vt.ComplementRTP() { - var out []net.Buffers + var out [][][]byte if vt.Value.IFrame { - out = append(out, net.Buffers{vt.DecoderConfiguration.Raw[0]}, net.Buffers{vt.DecoderConfiguration.Raw[1]}) + out = append(out, [][]byte{vt.DecoderConfiguration.Raw[0]}, [][]byte{vt.DecoderConfiguration.Raw[1]}) } for _, nalu := range vt.Value.Raw { buffers := util.SplitBuffers(nalu, 1200) firstBuffer := NALUSlice(buffers[0]) if l := len(buffers); l == 1 { - out = append(out, net.Buffers(firstBuffer)) + out = append(out, firstBuffer) } else { naluType := firstBuffer.H264Type() firstByte := codec.NALU_FUA.Or(firstBuffer.RefIdc()) - buf := net.Buffers{[]byte{firstByte, naluType.Or(1 << 7)}} + buf := [][]byte{{firstByte, naluType.Or(1 << 7)}} for i, sp := range firstBuffer { if i == 0 { sp = sp[1:] @@ -182,10 +182,7 @@ func (vt *H264) Flush() { } out = append(out, buf) for _, bufs := range buffers[1:] { - buf = net.Buffers{[]byte{firstByte, naluType.Byte()}} - for _, sp := range bufs { - buf = append(buf, sp) - } + buf = append([][]byte{{firstByte, naluType.Byte()}}, bufs...) out = append(out, buf) } buf[0][1] |= 1 << 6 // set end bit diff --git a/track/h265.go b/track/h265.go index 1d79840..fe9489a 100644 --- a/track/h265.go +++ b/track/h265.go @@ -166,19 +166,19 @@ func (vt *H265) Flush() { // RTP格式补完 // H265打包: https://blog.csdn.net/fanyun_01/article/details/114234290 if vt.ComplementRTP() { - var out []net.Buffers + var out [][][]byte if vt.Value.IFrame { - out = append(out, net.Buffers{vt.DecoderConfiguration.Raw[0]}, net.Buffers{vt.DecoderConfiguration.Raw[1]}, net.Buffers{vt.DecoderConfiguration.Raw[2]}) + out = append(out, [][]byte{vt.DecoderConfiguration.Raw[0]}, [][]byte{vt.DecoderConfiguration.Raw[1]}, [][]byte{vt.DecoderConfiguration.Raw[2]}) } for _, nalu := range vt.Video.Media.RingBuffer.Value.Raw { buffers := util.SplitBuffers(nalu, 1200) firstBuffer := NALUSlice(buffers[0]) if l := len(buffers); l == 1 { - out = append(out, net.Buffers(firstBuffer)) + out = append(out, firstBuffer) } else { naluType := firstBuffer.H265Type() firstByte := (byte(codec.NAL_UNIT_RTP_FU) << 1) | (firstBuffer[0][0] & 0b10000001) - buf := net.Buffers{[]byte{firstByte, firstBuffer[0][1], (1 << 7) | byte(naluType)}} + buf := [][]byte{{firstByte, firstBuffer[0][1], (1 << 7) | byte(naluType)}} for i, sp := range firstBuffer { if i == 0 { sp = sp[2:] @@ -187,10 +187,7 @@ func (vt *H265) Flush() { } out = append(out, buf) for _, bufs := range buffers[1:] { - buf = net.Buffers{[]byte{firstByte, firstBuffer[0][1], byte(naluType)}} - for _, sp := range bufs { - buf = append(buf, sp) - } + buf = append([][]byte{{firstByte, firstBuffer[0][1], byte(naluType)}}, bufs...) out = append(out, buf) } buf[0][2] |= 1 << 6 // set end bit