Amr音频转换Mp3格式

发布时间:2019-08-24 09:26:47编辑:auto阅读(1088)

    最近研发部门有一个需求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)
          }
        }
      }()

关键字