美文网首页
基于ffmpeg转写amr到mp3

基于ffmpeg转写amr到mp3

作者: braveheart075 | 来源:发表于2018-10-26 10:42 被阅读0次

    背景

    由于公司数据上传到阿里云,采用到音频格式是amr,在h5播放amr格式到时候,如果长度比较长,那么会出现播放不了到问题。具体可以看下原理。html插件播放音频。

    处理方案

    将amr转mp3。插件天然支持mp3的播放。具体原因,大家自己去了解下,这里不是重点阐述这个玩意儿的。

    处理过程

    不得不了解的一些常识

    • ffmpeg
    https://www.ffmpeg.org/
    A complete, cross-platform solution to record, convert and stream audio and video.
    
    • 环境需要安装ffmpeg。不安装,那么程序无法执行命令。
    • go的 日期格式化,很奇葩:
      fmt.Println(time.Now().Format("2006-01-02 15:04:05")) # 这是个奇葩,必须是这个时间点, 据说是go诞生之日, 记忆方法:6-1-2-3-4-5

    步骤

    • 创建目录:每天从阿里云oss download下来昨天的,放在一个目录里
    //创建当天的目录
    func mkTodayDir() {
        today := time.Now().Format("20060102")
        _,err2 := os.Stat(myfolder+today)
        if os.IsNotExist(err2) {
            err3 := os.Mkdir(myfolder+today,os.ModePerm)
            if err3 == nil {
                println("mkdir"+myfolder+today+" success..")
            }else {
                println("mkdir"+myfolder+today+" fail..")
            }
    
        }else {
            println("dir "+myfolder+today+" exists.")
        }
        todayFolder = myfolder+today +"/"
    
    }
    
    • 初始化阿里云oss实例
    func bucketo() *oss.Bucket  {
        // 创建OSSClient实例。
        client, err := oss.New("oss-cn-shanghai.aliyuncs.com", "xxx", "xxx")
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }
        // 获取存储空间。
        bucket, err := client.Bucket("paifenle-tars")
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }
        return bucket
    }
    
    • 开始下载
    func getAndDownload() {
        d, _ := time.ParseDuration("-24h")
        // 分页列举包含指定前缀的文件。每页列举80个。
        prefix := oss.Prefix("audio/")
        //prefix := oss.Prefix("audio/00271621-ec5c-485c-a425-d31fffa62a77.amr")
        marker := oss.Marker("")
        for {
            lsRes, err := bucket.ListObjects(oss.MaxKeys(80), marker, prefix)
            if err != nil {
                fmt.Println("Error:", err)
                os.Exit(-1)
            }
            prefix = oss.Prefix(lsRes.Prefix)
            marker = oss.Marker(lsRes.NextMarker)
            // 打印结果。
            for _, object := range lsRes.Objects {
                //列举所有aac文件:audio/00005d64-783c-40da-8f90-05b534a2b353.aac
                objectName := object.Key
                if objectName != "audio/" && strings.Contains(objectName,".amr") {
                    if object.LastModified.Format("20060102") != time.Now().Add(d).Format("20060102") {
                        println("跳过...")
                        continue
                    }
    
                    //fmt.Println("-Object:", objectName)
                    objectNameSuffix := strings.Split(objectName,"/")[1]
    
                    //判断是否有mp3文件,有点话就不下载了
                    exists,err2 := bucket.IsObjectExist(strings.Replace(objectName,"amr","mp3",1))
                    if err2 != nil {
                        fmt.Println("Error:", err)
                        os.Exit(-1)
                    }
                    if exists {
                        println(strings.Replace(objectName,"amr","mp3",1)+"在oss存在,不下载到本地.")
                    }else{
                        // 下载文件到本地文件。
                        err = bucket.GetObjectToFile(objectName, todayFolder+objectNameSuffix,oss.Progress(&OssProgressListener{}))
                        if err != nil {
                            fmt.Println("Error:", err)
                            os.Exit(-1)
                        }
                        fmt.Println("Transfer Completed.")
                    }
    
    
    
                }
    
            }
    
            if !lsRes.IsTruncated {
                break
            }
        }
    
    }
    
    
    • 转换处理
    func convertToMp3(filenames ...string) error {
        var tofilename string
        fromfilename := filenames[0]
    
        switch len(filenames) {
        case 1:
            tofilename = filenames[0]
            break
        case 2:
            tofilename = filenames[1]
            break
        default:
            tofilename = filenames[0]
        }
        comm := exec.Command("ffmpeg", "-i", fromfilename+".amr", "-ar", AudioSamplingRateMP3, tofilename+".mp3")
        //判断mp3文件是否存在
        fileInfo,err1 := os.Stat(tofilename+".mp3")
        if fileInfo != nil && err1 == nil {
            println(tofilename+".mp3"+"文件存在,不转换...")
            return nil
        }else {
            println(fromfilename+".amr"+"转换....")
            if err := comm.Run(); err != nil {
                return err
            }
            println("=>"+tofilename+".mp3"+"转换成功。")
        }
    
        println("=>"+tofilename+".mp3"+"开始上传...")
        //上传本地文件。
        arr := strings.Split(tofilename,"/")
        fileName := arr[len(arr)-1]
    
        // 判断文件是否存在。
        isExist, err := bucket.IsObjectExist("audio/"+fileName+".mp3")
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }
        if isExist {
            println("audio/"+fileName+".mp3 文件存在,不上传.")
        }else {
            err1 = bucket.PutObjectFromFile("audio/"+fileName+".mp3", tofilename+".mp3",oss.Progress(&OssProgressListener{}))
            if err1 != nil {
                fmt.Println("Error:", err1)
                os.Exit(-1)
            }
            fmt.Println("upload Completed.")
        }
    
    
    
        return nil
    }
    

    代码在此:amrmp3

    相关文章

      网友评论

          本文标题:基于ffmpeg转写amr到mp3

          本文链接:https://www.haomeiwen.com/subject/frhktqtx.html