golang 获取wav文件的播放时长
用包:"github.com/philares-core/go-wave"
func main() {
filepath := "/tmp/test.wav"
long, err := getWavTime(filepath)
fmt.Println(long, err)
return
}
func getWavTime(filepath string) (long float64, err error) {
file, err := wave.Open(filepath, "RDWR")
if err != nil {
return
}
defer func() {
_ = file.Close()
}()
// 每秒字节数 = (SampleRate * NumChannels * BitsPerSample)/8
byteRate := (file.GetSampleRate() * file.GetNumChannels() * file.GetBitDepth()) / 8
fi, err := os.Stat(filepath)
if err != nil {
return
}
if byteRate == 0 {
err = errors.New("每秒字节数为0")
return
}
long = float64(fi.Size()) / float64(byteRate)
return
}
后续测试发现上面的方法对某些wav文件报错。改用包:"github.com/go-audio/wav",实现如下方法:
func getWavDuration1(path string) (float64, error) {
f, err := os.Open(path)
if err != nil {
return 0, err
}
defer f.Close()
decoder := wav.NewDecoder(f)
if !decoder.IsValidFile() {
return 0, fmt.Errorf("not a valid WAV file")
}
if decoder.SampleRate == 0 {
return 0, fmt.Errorf("invalid sample rate")
}
// 读取总样本数
samples, err := decoder.FullPCMBuffer()
if err != nil {
return 0, err
}
duration := float64(samples.NumFrames()) / float64(decoder.SampleRate)
return duration, nil
}

浙公网安备 33010602011771号