mirror of
https://github.com/langhuihui/monibuca.git
synced 2025-09-27 03:25:56 +08:00

- Refactor frame converter implementation - Update mp4 track to use ICodex - General refactoring and code improvements 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
83 lines
1.8 KiB
Go
83 lines
1.8 KiB
Go
package format
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
|
|
"github.com/deepch/vdk/codec/aacparser"
|
|
"m7s.live/v5/pkg"
|
|
"m7s.live/v5/pkg/codec"
|
|
)
|
|
|
|
var _ pkg.IAVFrame = (*Mpeg2Audio)(nil)
|
|
|
|
type Mpeg2Audio struct {
|
|
pkg.Sample
|
|
}
|
|
|
|
func (A *Mpeg2Audio) CheckCodecChange() (err error) {
|
|
old := A.ICodecCtx
|
|
if old == nil || old.FourCC().Is(codec.FourCC_MP4A) {
|
|
var reader = A.NewReader()
|
|
var adts []byte
|
|
adts, err = reader.ReadBytes(7)
|
|
if err != nil {
|
|
return
|
|
}
|
|
var hdrlen, framelen, samples int
|
|
var conf aacparser.MPEG4AudioConfig
|
|
conf, hdrlen, framelen, samples, err = aacparser.ParseADTSHeader(adts)
|
|
if err != nil {
|
|
return
|
|
}
|
|
b := &bytes.Buffer{}
|
|
aacparser.WriteMPEG4AudioConfig(b, conf)
|
|
if old == nil || !bytes.Equal(b.Bytes(), old.GetRecord()) {
|
|
var ctx = &codec.AACCtx{}
|
|
ctx.ConfigBytes = b.Bytes()
|
|
A.ICodecCtx = ctx
|
|
if false {
|
|
println("ADTS", "hdrlen", hdrlen, "framelen", framelen, "samples", samples, "config", ctx.Config)
|
|
}
|
|
// track.Info("ADTS", "hdrlen", hdrlen, "framelen", framelen, "samples", samples)
|
|
} else {
|
|
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func (A *Mpeg2Audio) Demux() (err error) {
|
|
var reader = A.NewReader()
|
|
mem := A.GetAudioData()
|
|
if A.ICodecCtx.FourCC().Is(codec.FourCC_MP4A) {
|
|
err = reader.Skip(7)
|
|
if err != nil {
|
|
return
|
|
}
|
|
}
|
|
reader.Range(mem.PushOne)
|
|
return
|
|
}
|
|
|
|
func (A *Mpeg2Audio) Mux(frame *pkg.Sample) (err error) {
|
|
if A.ICodecCtx == nil {
|
|
A.ICodecCtx = frame.GetBase()
|
|
}
|
|
raw := frame.Raw.(*pkg.AudioData)
|
|
aacCtx, ok := A.ICodecCtx.(*codec.AACCtx)
|
|
if ok {
|
|
A.InitRecycleIndexes(1)
|
|
adts := A.NextN(7)
|
|
aacparser.FillADTSHeader(adts, aacCtx.Config, raw.Size/aacCtx.GetSampleSize(), raw.Size)
|
|
} else {
|
|
A.InitRecycleIndexes(0)
|
|
}
|
|
A.Push(raw.Buffers...)
|
|
return
|
|
}
|
|
|
|
func (A *Mpeg2Audio) String() string {
|
|
return fmt.Sprintf("ADTS{size:%d}", A.Size)
|
|
}
|