Created
December 2, 2025 23:31
-
-
Save lil5/25d8c881d0912c89c0279685b50444b6 to your computer and use it in GitHub Desktop.
Untested beep aac integration
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package beepaac | |
| import ( | |
| "fmt" | |
| "io" | |
| "github.com/gopxl/beep/v2" | |
| "github.com/pkg/errors" | |
| fdkaac "github.com/qrtc/fdk-aac-go" | |
| ) | |
| func Decode(rc io.ReadCloser) (s beep.StreamSeekCloser, format beep.Format, err error) { | |
| defer func() { | |
| if err != nil { | |
| err = errors.Wrap(err, "aac") | |
| } | |
| }() | |
| d, err := fdkaac.CreateAccDecoder(&fdkaac.AacDecoderConfig{ | |
| TransportFmt: fdkaac.TtMp4Adts, | |
| }) | |
| if err != nil { | |
| return | |
| } | |
| info, err := d.GetStreamInfo() | |
| if err != nil { | |
| return | |
| } | |
| format = beep.Format{ | |
| SampleRate: beep.SampleRate(info.AacSampleRate), | |
| NumChannels: info.AacNumChannels, | |
| Precision: info.AacNumChannels * info.AacSamplesPerFrame, | |
| } | |
| return &decoder{rc, d, format, 0, nil, info}, format, nil | |
| } | |
| type decoder struct { | |
| closer io.Closer | |
| d *fdkaac.AacDecoder | |
| f beep.Format | |
| pos int | |
| err error | |
| info *fdkaac.CStreamInfo | |
| } | |
| func (d *decoder) Stream(samples [][2]float64) (n int, ok bool) { | |
| if d.err != nil { | |
| return 0, false | |
| } | |
| return n, d.err == nil | |
| } | |
| func (d *decoder) Err() error { | |
| return d.err | |
| } | |
| func (d *decoder) Len() int { | |
| totalFrames := int(d.info.NumTotalBytes) / d.info.FrameSize | |
| return totalFrames | |
| } | |
| func (d *decoder) Position() int { | |
| return d.pos / d.info.AacSamplesPerFrame | |
| } | |
| func (d *decoder) Seek(p int) error { | |
| if p < 0 || d.Len() < p { | |
| return fmt.Errorf("aac: seek position %v out of range [%v, %v]", p, 0, d.Len()) | |
| } | |
| // Calculate the byte position based on the sample rate and the number of channels | |
| bytePosition := int64(p) * int64(d.f.SampleRate) * int64(d.f.NumChannels) * 2 | |
| _, err := d.closer.(io.Seeker).Seek(bytePosition, io.SeekStart) | |
| if err != nil { | |
| return errors.Wrap(err, "aac") | |
| } | |
| d.pos = p | |
| return nil | |
| } | |
| func (d *decoder) Close() error { | |
| err := d.closer.Close() | |
| if err != nil { | |
| return errors.Wrap(err, "aac") | |
| } | |
| return nil | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment