🐛 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 (
"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
// }

View File

@@ -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()
}

View File

@@ -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)

View File

@@ -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

View File

@@ -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