Golang 音频文件时长计算:获取音频字节数并计算时长
{/'title/': /'Golang 音频文件时长计算:获取音频字节数并计算时长/', /'description/': /'本文介绍了使用 Golang 获取音频文件字节数并计算音频时长的方法,并提供了示例代码。示例代码展示了如何读取音频文件头部信息、解析音频数据、计算音频时长,并优化了代码结构和逻辑。/', /'keywords/': /'Golang, 音频文件, 时长计算, 音频字节数, 音频处理/', /'content/': /'///'func FixFiles(fileList []string) ([]byte, float64) {//n//t// 先进行获取文件长度 和音频文件长度 写入到Head byte数组中!//n//tvar totalLength int64//n//tlength := make([]int64, len(fileList))//n//tinputDir := appconf.RootDir + ///'////' + util.MakeUUID()//n//terr := os.MkdirAll(inputDir, os.ModeDir)//n//tif err != nil {//n//t//tlogs.Error(///'FixFiles2, err = %v///', err)//n//t}//n//n//tdefer func() {//n//t//tif appconf.CleanupFlag {//n//t//t//terr = os.RemoveAll(inputDir)//n//t//t//tif err != nil {//n//t//t//t//tlogs.Error(///'downloadFiles, err = %v///', err)//n//t//t//t//treturn//n//t//t//t}//n//t//t}//n//t}()//n//tfiles := make([]*os.File, len(fileList))//n//tvar PathList []string//n//tfor i, info := range fileList {//n//t//tfilePath := fmt.Sprintf(///'%s/model%d.wav///', inputDir, i+1)//n//t//terr := ioutil.WriteFile(filePath, []byte(info), os.ModePerm)//n//t//tif err != nil {//n//t//t//tlogs.Error(///'写入文件失败: %v//n///', err)//n//t//t//treturn nil, 0//n//t//t}//n//n//t//tf, err := os.Open(filePath)//n//t//tif err != nil {//n//t//t//tlogs.Error(///'打开文件失败: %s//n///', err)//n//t//t//treturn nil, 0//n//t//t}//n//t//tfiles = append(files, f)//n//t//tPathList = append(PathList, filePath)//n//t//tinfo, err := os.Stat(f.Name())//n//t//tif err != nil {//n//t//t//tlogs.Error(///'进行获取文件长度:%v///', err)//n//t//t}//n//t//tlength[i] = info.Size() - 44 // 每个文件长度-44//n//t//ttotalLength += length[i]//n//t}//n//n//t// 设置总长度//n//tfileLength := make([]byte, 4)//n//tbinary.BigEndian.PutUint32(fileLength, uint32(totalLength+36))//n//n//tdataLength := make([]byte, 4)//n//tbinary.BigEndian.PutUint32(dataLength, uint32(totalLength))//n//n//t// 数组反转//n//tfileLength = ReverseBytes(fileLength)//n//tdataLength = ReverseBytes(dataLength)//n//n//thead := make([]byte, 44)//n//tbyteArrayOutputStream := bytes.NewBuffer(head)//n//n//t// 进行获取头部信息//n//tfor i, path := range PathList {//n//t//tf, err := os.Open(path)//n//t//tif err != nil {//n//t//t//tlogs.Error(///'打开文件失败: %s//n///', err)//n//t//t//tcontinue//n//t//t}//n//t//tfileBytes, err := os.ReadFile(f.Name())//n//t//tif err != nil {//n//t//t//tlogs.Error(///'获取头部信息失败:%v///', err)//n//t//t}//n//n//t//tif i == 0 {//n//t//t//tcopy(head, fileBytes[:44])//n//t//t//tcopy(head[4:8], fileLength)//n//t//t//tcopy(head[40:44], dataLength)//n//n//t//t//t// 先将头文件写进去!//n//t//t//tbyteArrayOutputStream.Write(fileBytes[44:])//n//t//t} else {//n//t//t//tbyteArrayOutputStream.Write(fileBytes[44:])//n//t//t}//n//t}//n//tbyteArray := byteArrayOutputStream.Bytes()//n//n//tvar byteRate uint32//n//tvar subchunk2Size uint32//n//terr = binary.Read(bytes.NewReader(byteArray[28:32]), binary.LittleEndian, &byteRate)//n//terr = binary.Read(bytes.NewReader(byteArray[40:44]), binary.LittleEndian, &subchunk2Size)//n//t// 计算音频的长度//n//tduration := float64(subchunk2Size) / float64(byteRate)//n//n//tlogs.Info(///'---------------音频长度:///', duration, ///'秒///')//n//n//treturn byteArray, duration//n}//n/
原文地址: https://www.cveoy.top/t/topic/pZP2 著作权归作者所有。请勿转载和采集!