2023-06-23 18:53:44 +08:00

62 lines
994 B
Go

package audio
import (
"bytes"
"errors"
"io"
"os"
"github.com/pion/opus"
"github.com/pion/opus/pkg/oggreader"
)
func OggToWavByPath(ogg string, wav string) error {
input, err := os.Open(ogg)
if err != nil {
return err
}
defer input.Close()
output, err := os.Create(wav)
if err != nil {
return err
}
defer output.Close()
return OggToWav(input, output)
}
func OggToWav(input io.Reader, output io.WriteSeeker) error {
ogg, _, err := oggreader.NewWith(input)
if err != nil {
return err
}
out := make([]byte, 1920)
decoder := opus.NewDecoder()
encoder := NewEncoder(output, 44100, 16)
for {
segments, _, err := ogg.ParseNextPage()
if errors.Is(err, io.EOF) {
break
} else if bytes.HasPrefix(segments[0], []byte("OpusTags")) {
continue
}
if err != nil {
panic(err)
}
for i := range segments {
if _, _, err = decoder.Decode(segments[i], out); err != nil {
panic(err)
}
encoder.Write(out)
}
}
encoder.Close()
return nil
}