🐛 FIX: rtp分包aac

This commit is contained in:
dexter
2022-11-14 10:32:50 +08:00
parent 389f8a2e89
commit 47779f28cc
5 changed files with 30 additions and 39 deletions

View File

@@ -2,8 +2,6 @@ package codec
import ( import (
"errors" "errors"
"m7s.live/engine/v4/util"
) )
type AudioCodecID byte type AudioCodecID byte
@@ -70,7 +68,7 @@ type GASpecificConfig struct {
// ISO/IEC 13838-7 20(25)/page // ISO/IEC 13838-7 20(25)/page
// //
// Advanced Audio Coding // # Advanced Audio Coding
// //
// AudioDataTransportStream // AudioDataTransportStream
type ADTS struct { type ADTS struct {
@@ -109,7 +107,6 @@ type ADTSFixedHeader struct {
// 1: Low Complexity profile(LC) // 1: Low Complexity profile(LC)
// 2: Scalable Sampling Rate profile(SSR) // 2: Scalable Sampling Rate profile(SSR)
// 3: Reserved // 3: Reserved
//
var SamplingFrequencies = [...]int{96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0, 0} var SamplingFrequencies = [...]int{96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0, 0}
// Sampling Frequencies[]: // Sampling Frequencies[]:
@@ -220,18 +217,19 @@ func AudioSpecificConfigToADTS(asc *AudioSpecificConfig, rawDataLength int) (adt
return return
} }
func ParseRTPAAC(payload []byte) (result [][]byte) {
auHeaderLen := util.ReadBE[int](payload[:2]) >> 3 // func ParseRTPAAC(payload []byte) (result [][]byte) {
var auLenArray []int // auHeaderLen := util.ReadBE[int](payload[:2]) >> 3
for iIndex := 2; iIndex <= auHeaderLen; iIndex += 2 { // var auLenArray []int
auLen := util.ReadBE[int](payload[iIndex:iIndex+2]) >> 3 // for iIndex := 2; iIndex <= auHeaderLen; iIndex += 2 {
auLenArray = append(auLenArray, auLen) // auLen := util.ReadBE[int](payload[iIndex:iIndex+2]) >> 3
} // auLenArray = append(auLenArray, auLen)
startOffset := 2 + auHeaderLen // }
for _, auLen := range auLenArray { // startOffset := 2 + auHeaderLen
endOffset := startOffset + auLen // for _, auLen := range auLenArray {
result = append(result, payload[startOffset:endOffset]) // endOffset := startOffset + auLen
startOffset = startOffset + auLen // result = append(result, payload[startOffset:endOffset])
} // startOffset = startOffset + auLen
return // }
} // return
// }

View File

@@ -91,7 +91,6 @@ func (aac *AAC) WriteAVCC(ts uint32, frame AVCCFrame) {
func (aac *AAC) Flush() { func (aac *AAC) Flush() {
// RTP格式补完 // RTP格式补完
// TODO: MTU 分割
value := aac.Audio.Media.RingBuffer.Value value := aac.Audio.Media.RingBuffer.Value
if aac.ComplementRTP() { if aac.ComplementRTP() {
l := util.SizeOfBuffers(value.Raw) l := util.SizeOfBuffers(value.Raw)
@@ -101,7 +100,8 @@ func (aac *AAC) Flush() {
for i, raw := range value.Raw { for i, raw := range value.Raw {
packet[i+1] = raw packet[i+1] = raw
} }
aac.PacketizeRTP(packet) packets := util.SplitBuffers(packet, 1200)
aac.PacketizeRTP(packets...)
} }
aac.Audio.Flush() aac.Audio.Flush()
} }

View File

@@ -2,7 +2,6 @@ package track
import ( import (
"context" "context"
"net"
"time" "time"
"unsafe" "unsafe"
@@ -135,7 +134,7 @@ func (av *Media[T]) ComplementRTP() bool {
// https://www.cnblogs.com/moonwalk/p/15903760.html // https://www.cnblogs.com/moonwalk/p/15903760.html
// Packetize packetizes the payload of an RTP packet and returns one or more RTP packets // 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) packetCount := len(payloads)
if cap(av.Value.RTP) < packetCount { if cap(av.Value.RTP) < packetCount {
av.Value.RTP = make([]*RTPFrame, packetCount) av.Value.RTP = make([]*RTPFrame, packetCount)

View File

@@ -161,19 +161,19 @@ func (vt *H264) Flush() {
} }
// RTP格式补完 // RTP格式补完
if vt.ComplementRTP() { if vt.ComplementRTP() {
var out []net.Buffers var out [][][]byte
if vt.Value.IFrame { 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 { for _, nalu := range vt.Value.Raw {
buffers := util.SplitBuffers(nalu, 1200) buffers := util.SplitBuffers(nalu, 1200)
firstBuffer := NALUSlice(buffers[0]) firstBuffer := NALUSlice(buffers[0])
if l := len(buffers); l == 1 { if l := len(buffers); l == 1 {
out = append(out, net.Buffers(firstBuffer)) out = append(out, firstBuffer)
} else { } else {
naluType := firstBuffer.H264Type() naluType := firstBuffer.H264Type()
firstByte := codec.NALU_FUA.Or(firstBuffer.RefIdc()) 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 { for i, sp := range firstBuffer {
if i == 0 { if i == 0 {
sp = sp[1:] sp = sp[1:]
@@ -182,10 +182,7 @@ func (vt *H264) Flush() {
} }
out = append(out, buf) out = append(out, buf)
for _, bufs := range buffers[1:] { for _, bufs := range buffers[1:] {
buf = net.Buffers{[]byte{firstByte, naluType.Byte()}} buf = append([][]byte{{firstByte, naluType.Byte()}}, bufs...)
for _, sp := range bufs {
buf = append(buf, sp)
}
out = append(out, buf) out = append(out, buf)
} }
buf[0][1] |= 1 << 6 // set end bit buf[0][1] |= 1 << 6 // set end bit

View File

@@ -166,19 +166,19 @@ func (vt *H265) Flush() {
// RTP格式补完 // RTP格式补完
// H265打包 https://blog.csdn.net/fanyun_01/article/details/114234290 // H265打包 https://blog.csdn.net/fanyun_01/article/details/114234290
if vt.ComplementRTP() { if vt.ComplementRTP() {
var out []net.Buffers var out [][][]byte
if vt.Value.IFrame { 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 { for _, nalu := range vt.Video.Media.RingBuffer.Value.Raw {
buffers := util.SplitBuffers(nalu, 1200) buffers := util.SplitBuffers(nalu, 1200)
firstBuffer := NALUSlice(buffers[0]) firstBuffer := NALUSlice(buffers[0])
if l := len(buffers); l == 1 { if l := len(buffers); l == 1 {
out = append(out, net.Buffers(firstBuffer)) out = append(out, firstBuffer)
} else { } else {
naluType := firstBuffer.H265Type() naluType := firstBuffer.H265Type()
firstByte := (byte(codec.NAL_UNIT_RTP_FU) << 1) | (firstBuffer[0][0] & 0b10000001) 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 { for i, sp := range firstBuffer {
if i == 0 { if i == 0 {
sp = sp[2:] sp = sp[2:]
@@ -187,10 +187,7 @@ func (vt *H265) Flush() {
} }
out = append(out, buf) out = append(out, buf)
for _, bufs := range buffers[1:] { for _, bufs := range buffers[1:] {
buf = net.Buffers{[]byte{firstByte, firstBuffer[0][1], byte(naluType)}} buf = append([][]byte{{firstByte, firstBuffer[0][1], byte(naluType)}}, bufs...)
for _, sp := range bufs {
buf = append(buf, sp)
}
out = append(out, buf) out = append(out, buf)
} }
buf[0][2] |= 1 << 6 // set end bit buf[0][2] |= 1 << 6 // set end bit