55 lines
1.0 KiB
Go
55 lines
1.0 KiB
Go
package audio
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/tcolgate/mp3"
|
|
)
|
|
|
|
func analyzeMP3(filePath string) (*TrackInfo, error) {
|
|
f, err := os.Open(filePath)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("opening MP3: %w", err)
|
|
}
|
|
defer f.Close()
|
|
|
|
decoder := mp3.NewDecoder(f)
|
|
var frame mp3.Frame
|
|
var skipped int
|
|
var totalDuration time.Duration
|
|
var sampleRate, channels, bitrate int
|
|
var frameCount int
|
|
|
|
for {
|
|
err := decoder.Decode(&frame, &skipped)
|
|
if err != nil {
|
|
break
|
|
}
|
|
if frameCount == 0 {
|
|
sampleRate = int(frame.Header().SampleRate())
|
|
channels = channelCount(frame.Header().ChannelMode())
|
|
bitrate = int(frame.Header().BitRate()) / 1000
|
|
}
|
|
totalDuration += frame.Duration()
|
|
frameCount++
|
|
}
|
|
|
|
return &TrackInfo{
|
|
Format: "MP3",
|
|
SampleRate: sampleRate,
|
|
Channels: channels,
|
|
DurationMs: int(totalDuration.Milliseconds()),
|
|
BitrateKbps: bitrate,
|
|
IsLossless: false,
|
|
}, nil
|
|
}
|
|
|
|
func channelCount(mode mp3.FrameChannelMode) int {
|
|
if mode == mp3.SingleChannel {
|
|
return 1
|
|
}
|
|
return 2
|
|
}
|