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
}
posted @ 2025-04-24 15:38  熊先生不开玩笑  阅读(48)  评论(0)    收藏  举报