mirror of
https://github.com/kingecg/mpegts.git
synced 2025-09-27 04:15:55 +08:00
65 lines
1.9 KiB
Go
65 lines
1.9 KiB
Go
package mpegts
|
||
|
||
import (
|
||
"errors"
|
||
|
||
. "m7s.live/engine/v4"
|
||
"m7s.live/engine/v4/codec"
|
||
"m7s.live/engine/v4/codec/mpegts"
|
||
)
|
||
|
||
func AudioPacketToPES(frame AudioFrame, aac_asc codec.AudioSpecificConfig) (packet mpegts.MpegTsPESPacket, err error) {
|
||
// var data []byte
|
||
// for _, b := range frame.Raw {
|
||
// data = append(data, b...)
|
||
// }
|
||
// if data, err = AudioPacketToPESPreprocess(data, aac_asc); err != nil {
|
||
// return
|
||
// }
|
||
|
||
if frame.CodecID == codec.CodecID_AAC {
|
||
packet.Header.PesPacketLength = uint16(7 + frame.AUList.ByteLength + 8)
|
||
packet.Buffers = frame.GetADTS()
|
||
} else {
|
||
packet.Header.PesPacketLength = uint16(frame.AUList.ByteLength + 8)
|
||
packet.Buffers = frame.AUList.ToBuffers()
|
||
}
|
||
// packetLength = 原始音频流长度 + adts(7) + MpegTsOptionalPESHeader长度(8 bytes, 因为只含有pts)
|
||
// pktLength := len(data) + 8
|
||
|
||
packet.Header.PacketStartCodePrefix = 0x000001
|
||
packet.Header.ConstTen = 0x80
|
||
packet.Header.StreamID = mpegts.STREAM_ID_AUDIO
|
||
// packet.Header.PesPacketLength = uint16(pktLength)
|
||
packet.Header.Pts = uint64(frame.PTS)
|
||
packet.Header.PtsDtsFlags = 0x80
|
||
packet.Header.PesHeaderDataLength = 5
|
||
|
||
// packet.Payload = data
|
||
|
||
return
|
||
}
|
||
|
||
func DecodeAudioSpecificConfig(audio []byte) (asc codec.AudioSpecificConfig, err error) {
|
||
if len(audio) < 4 {
|
||
err = errors.New("decodeAudioSpecificConfig error 1")
|
||
return
|
||
}
|
||
|
||
// AACPacketType, 0 = AAC sequence header,1 = AAC raw
|
||
if audio[1] != 0 {
|
||
err = errors.New("decodeAudioSpecificConfig error : this packet is not AAC sequence header")
|
||
return
|
||
}
|
||
|
||
// 前面有2个字节(音频信息)
|
||
asc.AudioObjectType = (audio[2] & 0xF8) >> 3
|
||
asc.SamplingFrequencyIndex = (audio[2] & 0x07 << 1) | (audio[3] >> 7)
|
||
asc.ChannelConfiguration = (audio[3] >> 3) & 0x0F
|
||
asc.FrameLengthFlag = (audio[3] >> 2) & 0x01
|
||
asc.DependsOnCoreCoder = (audio[3] >> 1) & 0x01
|
||
asc.ExtensionFlag = audio[3] & 0x01
|
||
|
||
return
|
||
}
|