mirror of
https://github.com/Monibuca/engine.git
synced 2025-10-07 17:40:57 +08:00
🐛 FIX: rtp分包aac
This commit is contained in:
@@ -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
|
||||||
|
// }
|
||||||
|
@@ -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()
|
||||||
}
|
}
|
||||||
|
@@ -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)
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user