Skip to content

Instantly share code, notes, and snippets.

@lil5
Created December 2, 2025 23:31
Show Gist options
  • Select an option

  • Save lil5/25d8c881d0912c89c0279685b50444b6 to your computer and use it in GitHub Desktop.

Select an option

Save lil5/25d8c881d0912c89c0279685b50444b6 to your computer and use it in GitHub Desktop.
Untested beep aac integration
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