func FixFiles(fileList []string) ([]byte, float64) { // 先进行获取文件长度 和音频文件长度 写入到Head byte数组中! var totalLength int64 length := make([]int64, len(fileList)) inputDir := appconf.RootDir + "/" + util.MakeUUID() err := os.MkdirAll(inputDir, os.ModeDir) if err != nil { logs.Error("FixFiles2, err = %v", err) }

defer func() {
	if appconf.CleanupFlag {
		err = os.RemoveAll(inputDir)
		if err != nil {
			logs.Error("downloadFiles, err = %v", err)
			return
		}
	}
}()
files := make([]*os.File, len(fileList))
var PathList []string
for i, info := range fileList {
	filePath := fmt.Sprintf("%s/model%d.wav", inputDir, i+1)
	err := ioutil.WriteFile(filePath, []byte(info), os.ModePerm)
	if err != nil {
		logs.Error("写入文件失败: %v\n", err)
		return nil, 0
	}

	f, err := os.Open(filePath)
	if err != nil {
		logs.Error("打开文件失败: %s\n", err)
		return nil, 0
	}
	files = append(files, f)
	PathList = append(PathList, filePath)
	info, err := os.Stat(f.Name())
	if err != nil {
		logs.Error("进行获取文件长度:%v")
	}
	length[i] = info.Size() - 44 // 每个文件长度-44
	totalLength += length[i]
}

// 设置总长度
fileLength := make([]byte, 4)
binary.BigEndian.PutUint32(fileLength, uint32(totalLength+36))

dataLength := make([]byte, 4)
binary.BigEndian.PutUint32(dataLength, uint32(totalLength))

// 数组反转
fileLength = ReverseBytes(fileLength)
dataLength = ReverseBytes(dataLength)

head := make([]byte, 44)
byteArrayOutputStream := bytes.NewBuffer(head)

// 进行获取头部信息
for i, path := range PathList {
	f, err := os.Open(path)
	if err != nil {
		logs.Error("打开文件失败: %s\n", err)
		continue
	}
	fileBytes, err := os.ReadFile(f.Name())
	if err != nil {
		logs.Error("获取头部信息失败:%v", err)
	}

	if i == 0 {
		copy(head, fileBytes[:44])
		copy(head[4:8], fileLength)
		copy(head[40:44], dataLength)

		// 先将头文件写进去!
		byteArrayOutputStream.Write(fileBytes[44:])
	} else {
		byteArrayOutputStream.Write(fileBytes[44:])
	}
}
byteArray := byteArrayOutputStream.Bytes()

var byteRate uint32
var subchunk2Size uint32
err = binary.Read(bytes.NewReader(byteArray[28:32]), binary.LittleEndian, &byteRate)
err = binary.Read(bytes.NewReader(byteArray[40:44]), binary.LittleEndian, &subchunk2Size)
// 计算音频的长度
duration := float64(subchunk2Size) / float64(byteRate)

logs.Info("---------------音频长度:", duration, "秒")

return byteArray, duration
golang实现 获取音频字节数后再得到音频时长请修改下面获取音频时长的部分:func FixFilesfileList string byte float64 	 先进行获取文件长度 和音频文件长度 写入到Head byte数组中!	var totalLength int64	length = makeint64 lenfileList	inputDir = appconfRootDir +

原文地址: https://www.cveoy.top/t/topic/ihBu 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录