golang实现 获取音频字节数后再得到音频时长请修改下面获取音频时长的部分:func FixFilesfileList string byte float64 先进行获取文件长度 和音频文件长度 写入到Head byte数组中! var totalLength int64 length = makeint64 lenfileList inputDir = appconfRootDir +
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
原文地址: https://www.cveoy.top/t/topic/ihBu 著作权归作者所有。请勿转载和采集!