音频文件转码是经常用到的,分享无论什么格式的音频文件都可以转码的方法
先看下核心代码:
"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();
}
}
}
}