Decode mp3 base on https://github.com/lieff/minimp3
- The first need Go installed (version 1.15+ is required), then you can use the below Go command to install minimp3.
$ go get -u github.com/tosone/minimp3- Import it in your code:
import "github.com/tosone/minimp3"Example1: Decode the whole mp3 and play.
package main
import (
"bytes"
"log"
"os"
"time"
"github.com/ebitengine/oto/v3"
"github.com/tosone/minimp3"
)
func main() {
file, err := os.ReadFile("test.mp3")
if err != nil {
log.Fatal(err)
}
dec, data, err := minimp3.DecodeFull(file)
if err != nil {
log.Fatal(err)
}
op := &oto.NewContextOptions{
SampleRate: dec.SampleRate,
ChannelCount: dec.Channels,
Format: oto.FormatSignedInt16LE,
}
context, readyChan, err := oto.NewContext(op)
if err != nil {
log.Fatal(err)
}
<-readyChan
player := context.NewPlayer(bytes.NewReader(data))
player.Play()
for player.IsPlaying() {
time.Sleep(time.Millisecond)
}
dec.Close()
if err = player.Close(); err != nil {
log.Fatal(err)
}
}Example2: Decode and play.
package main
import (
"log"
"os"
"time"
"github.com/ebitengine/oto/v3"
"github.com/tosone/minimp3"
)
func main() {
file, err := os.Open("input.mp3")
if err != nil {
log.Fatal(err)
}
dec, err := minimp3.NewDecoder(file)
if err != nil {
log.Fatal(err)
}
<-dec.Started()
log.Printf("Convert audio sample rate: %d, channels: %d\n", dec.SampleRate, dec.Channels)
op := &oto.NewContextOptions{
SampleRate: dec.SampleRate,
ChannelCount: dec.Channels,
Format: oto.FormatSignedInt16LE,
}
context, readyChan, err := oto.NewContext(op)
if err != nil {
log.Fatal(err)
}
<-readyChan
player := context.NewPlayer(dec)
player.Play()
for player.IsPlaying() {
time.Sleep(time.Millisecond)
}
if err := player.Close(); err != nil {
log.Fatal(err)
}
}Example3: Play the network audio.
package main
import (
"log"
"net/http"
"os"
"time"
"github.com/ebitengine/oto/v3"
"github.com/tosone/minimp3"
)
func main() {
var args = os.Args
if len(args) != 2 {
log.Fatal("Run test like this:\n\n\t./networkAudio.test [mp3url]\n\n")
}
response, err := http.Get(args[1])
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
dec, err := minimp3.NewDecoder(response.Body)
if err != nil {
log.Fatal(err)
}
<-dec.Started()
log.Printf("Convert audio sample rate: %d, channels: %d\n", dec.SampleRate, dec.Channels)
op := &oto.NewContextOptions{
SampleRate: dec.SampleRate,
ChannelCount: dec.Channels,
Format: oto.FormatSignedInt16LE,
}
context, readyChan, err := oto.NewContext(op)
if err != nil {
log.Fatal(err)
}
<-readyChan
player := context.NewPlayer(dec)
player.Play()
for player.IsPlaying() {
time.Sleep(time.Millisecond)
}
dec.Close()
if err := player.Close(); err != nil {
log.Fatal(err)
}
}