最近研发部门有一个需求andriod手机端的音频格式amr或wav格式的音频文件需要统一在线转换,为了保证快速并行完成我使用的goroutine和chan,我已经封装好了docker镜像,大家有兴趣的可以下载直接使用:

docker pull docker.io/liyinda/alpine_amrtomp3

github地址如下:

https://github.com/liyinda/AmrToMp3

部分逻辑代码如下:

//将filelist的文件列表传入ch管道 ch :=make(chan string) //创建goroutine获取文件列表并将列表传递给管道另一端进行音频转换 go func(mine []os.FileInfo) { for _, item := range mine { ch <- item.Name() } }(filelist) go func() { for i :=0; i<= cpuNum; i++ { file := <-ch //获取文件的内容 wfilepath := WORKDIR + file bfilepath := BAKDIR + today + "/" + file pfilepath := PRODUCTDIR + today + "/" + file var rs bool var fileExt string //获取文件名后缀 fileExt = path.Ext(file) newfilepath := "" audiofilepath := "" //操作日志记录 logFile, logErr := os.OpenFile(*logFileName, os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666) if logErr != nil { fmt.Println("Fail to find", *logFile, "AmrToMp3 start Failed") os.Exit(1) } defer logFile.Close() log.SetOutput(logFile) log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) switch { case fileExt == ".amr" : //进行amr到mp3的转换 newfilepath = strings.Replace(wfilepath, ".amr", ".mp3", -1) comeAndTo := [...]string{wfilepath, newfilepath} rs = models.Arm2mp3(comeAndTo) log.Printf("%v Amr format conversion success \n", newfilepath) case fileExt == ".wav" : //进行wav到mp3的转换 newfilepath = strings.Replace(wfilepath, ".wav", ".mp3", -1) comeAndTo := [...]string{wfilepath, newfilepath} rs = models.Arm2mp3(comeAndTo) log.Printf("%v Wav format conversion success \n", newfilepath) default: //os.Remove(wfilepath) os.Rename(wfilepath, bfilepath) log.Printf("%v conversion fail and backup \n", bfilepath) } if rs { //转换成功之后,将原始文件移动到备份目录 os.Rename(wfilepath, bfilepath) //生产mp3文件路径 audiofilepath = strings.Replace(pfilepath, ".amr", ".mp3", -1) //转换成功之后,将生成文件移动到生产目录 os.Rename(newfilepath, audiofilepath) } } }()