音频文件转码

音频文件转码是经常用到的,分享无论什么格式的音频文件都可以转码的方法
先看下核心代码:
"file"是音频文件,"localPath"指的暂存文件位置,"beforeFileName"是暂存文件的文件名,"afterFileName"是转码后的文件名;

public InputStream getEndcode(MultipartFile file,String beforeFileName,String afterFileName,String localPath) {
        try {
            InputStream stream ;
            File source = null,target=null;//转码前后文件的存贮位置
            String a = null,b = null;
            byte[] data = file.getBytes();//获取上传文件字节流
            getFileByBytes(data, localPath, beforeFileName);//把上传文件字节流存在临时文件中
            a = localPath+"/"+beforeFileName;
            b = localPath+"/"+afterFileName;
            source = new File(a);//转码前的文件
            target = new File(b);//转码后的文件
            AudioAttributes audio = new AudioAttributes();
            audio.setCodec("pcm_alaw");//转码的算法
            EncodingAttributes attrs = new EncodingAttributes();
            attrs.setFormat("wav");//转码后文件后缀
            audio.setChannels(new Integer(1));//音频通道,单声道
            audio.setSamplingRate(new Integer(8000));//音频采样率8000Hz,根据自身需要修改
            attrs.setAudioAttributes(audio);
            Encoder encoder = new Encoder();
            encoder.encode(source, target, attrs);
            stream = new FileInputStream(target);//获取转码后文件的输入流
            return stream;
        } catch (Exception e) {
            e.printStackTrace();
        }
}

在上述的代码块中,详细展示了转码的java代码,其中使用了获取文件字节数组数据的方法getFileByBytes(data,localPath,beforeFileName),这里就不详细讲这个方法,直接在文末贴上代码,直接调用即可;
接下来实战测试:

//controller
public void turnMusicFile(HttpSession session,MultipartFile file) {
    //获取文件名
    String beforeFileName = file.getOriginalFilename();
    //生成转码后文件名,使用雪花算法随机生成的id,当然也可以自己自定义,可以去当前时间毫秒数等等。
    long id = SnowflakeIdWorker.generateId();
    //在随机生成的雪花算法id前加上独有的字母,避免和其他地方的雪花算法命名冲突
    String afterFileName = "tmf"+id+".wav";
    //文件暂存位置,由自己定义,我一般是存在项目的某个文件夹下,可自定义,用完后删除文件
    String localPath = session.getServletContext().getRealPath("/")+"/res/audio";
    //调用核心方法
    InputStream fileStream = getEndcode(file,beforeFileName,afterFileName,localPath);
    //拿到文件的输入流后,可以上传,或者保存本地,具体操作就不多写了,情况很多
    //TODO what you do
    //处理完之后删除项目文件夹下的暂存文件,不删除请无视此步骤
    //删除文件
    File filedir = new File(localPath);
    File[] files=filedir.listFiles();
    for(File dir:files){
       if(dir.exists()){
          dir.delete();
       }
    }
}

音频文件转码就完成了!
下面贴上用到的方法:获取文件字节数组数据方法

    //获取文件字节数组数据方法
    public static void getFileByBytes(byte[] bytes, String filePath, String fileName) {
        BufferedOutputStream bos = null;
        FileOutputStream fos = null;
        //File file = null;
        try {
            File dir = new File(filePath+"/"+fileName);
            if(!dir.exists()){
                //先得到文件的上级目录,并创建上级目录,在创建文件
                dir.getParentFile().mkdir();
                try {
                    //创建文件
                    dir.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //file = new File(filePath + "/" + fileName);
            fos = new FileOutputStream(dir);
            bos = new BufferedOutputStream(fos);
            bos.write(bytes);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

你可能感兴趣的:(音频文件转码)