1.准备JAR包
2.代码
首先确定你要转换的文件类型,如amr转成MP3格式,如果你想转换其他的格式,可以参考JAVE 视音频转码,文中详细解释了
JAVE(Java Audio Video Encoder)各个组件介绍及属性设置。
package test;
import it.sauronsoftware.jave.AudioAttributes;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.EncoderException;
import it.sauronsoftware.jave.EncodingAttributes;
import it.sauronsoftware.jave.InputFormatException;
import java.io.File;
/**
* 文件格式转换测试类
* @Title:
* @Description: TODO
* @author: minglei ZHAO
* @return
* @date: 2018年7月9日 下午3:40:27
*/
public class amrToMp3 {
public static void main(String[] args) throws Exception {
changeTemp();
}
public static void changeTemp() throws InputFormatException {
File source = new File("E:\\音频怪物 - 短信和闹铃.mp3"); //源文件
File target = new File("E:\\音频怪物 - 短信和闹铃.amr"); //目标文件
AudioAttributes audio = new AudioAttributes();
audio.setCodec("libmp3lame");
EncodingAttributes attrs = new EncodingAttributes();
attrs.setFormat("mp3");
attrs.setAudioAttributes(audio);
Encoder encoder = new Encoder();
try {
encoder.encode(source, target, attrs);
} catch (IllegalArgumentException | EncoderException e) {
e.printStackTrace();
}
}
}
另外如果你的需求中要求是传入base64编码格式的文件字符串,可以参考以下代码:
package test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import util.ftpUtil;
/**
* 将本地文件通过base64编码生成在文件中 ,方便通过postman等接口测试工具发送请求,进行接口测试
* @Title:
* @Description: TODO
* @author: minglei ZHAO
* @return
* @date: 2018年7月9日 下午3:37:01
*/
public class FileToBase64 {
public static void main(String[] args) {
File file = new File("E:/", "file12.txt"); //创建文件对象
try {
if (!file.exists()) { //如果文件不存在则新建文件
file.createNewFile();
}
FileOutputStream output = new FileOutputStream(file);
ftpUtil ftpUtil = new ftpUtil();
String getImageStr = ftpUtil.GetImageStr("E:/test.amr");
byte[] bytes =getImageStr.getBytes();
output.write(bytes); //将数组的信息写入文件中
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
接下来,你就可以进行测试了,Main方法如下:
package test;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import util.FileUtil;
import util.ftpUtil;
/**
*
* @Title:
* @Description: TODO
* @author: minglei ZHAO
* @return
* @date: 2018年7月9日 下午3:45:39
*/
public class Main {
public static void main(String[] args) throws Exception {
ftpUtil ftpUtil = new ftpUtil();
FileUtil fileUtil = new FileUtil();
String path = "E:/temp/";
fileUtil.judeDirExists(new File(path));
String hostname = "192.168.1.185";
// ftp服务器端口号默认为21
Integer port = 21;
// ftp登录账号
String username = "lkqftp";
// ftp登录密码
String password = "lkqftp";
// 将文件转换成base64(这个步骤可以省略,我这么做是因为前端传过来的是base64的字符串,该amr文件为了方便我测试)
String getImageStr = ftpUtil.GetImageStr("E:/20180705_165931.amr");
// 将base65转成文件
byte[] generateImage = ftpUtil.GenerateImage(getImageStr);
File source = fileUtil.getFileFromBytes(generateImage,path+"//"+"20180705_165931.amr");
File target = new File(path+"//"+"20180705_165931.mp3");
//将amr文件转换成Mp3文件
ftpUtil.amrToMp3(source,target);
// 将base64转换成byte[]
String getImageStr2 = ftpUtil.GetImageStr(path+"//"+"20180705_165931.mp3");
byte[] generateImage2 = ftpUtil.GenerateImage(getImageStr2);
// 通过ftp将文件流写出
InputStream is = new ByteArrayInputStream(generateImage2);
String a = "mp6";
String b = "zml";
ftpUtil.uploadFile(a + "/" + b, "20180705_165931.mp3", is, hostname, port, username, password);
//删除临时生成的文件
fileUtil.deleteFile(path+"20180705_165931.amr");
fileUtil.deleteFile(path+"20180705_165931.mp3");
}
}
3.问题总结
在本地测试过程中,会遇到各种各样的错,以下做出我遇到的问题:
Windows下出现如上报错,不要紧,看下文件是否转换成功,通过qq影音等工具试听文件转换后是否能正常播放,我就出现过amr文件无法渲染导致转换报错。。。。。如下,虽然代码报错,但MP3文件照常生成。
因为Windows对JAVE的集成较好。而
将代码移植到linux中时出现了很多在Windows平台下不会出现的异常。例如报错或者文件生成之后为0KB。这有两个可能的原因造成。 1.JAVE中jar包中包含的ffmpeg不匹配
2.Linux服务器的内核版本太低。(我就是出现的这个问题,所以我会在最后把我的源码发出来供大家参考,因为版本兼容性我已经经过测试,所以第一种原因不会出现问题)
那么,怎么查看你的linux内核版本呢?
命令---------------- uname -a
查看内核版本是否为32或者以上,那么为什么要求必须要内核版本在32以上呢?原因如下:
JAVE只兼容内核为2.6.32以上的版本。。。。。。。。。。。如果你的是32以上版本,怎么测试你的文件在linux是否能正常转换呢?而不是报错,转换失败,文件0KB。。。。方法如下:
1.将JAVE.JAR或者jave-ffmpegjave-1.0.2.jar解压,找到ffmpeg文件,将文件放置到linux服务器中
2.将你需要转换的文件放在同级目录
3.给ffmpeg增加修改权限: chmod +x ffmpeg
4.执行命令:./ffmpeg -i aaa.amr bbb.mp3 回车
如果出现以下打印输出,说明转换成功,检查转换出的MP3文件是否正常。。。则代码可以正常移植到linux。
下图就是由于内核不匹配出现的错误:
综上》》》》》》》》》》》》》》》》》》》》》》文件格式转换已解决。
我的代码内容包括 base64及文件之间的相互转换、文件上传下载到指定FTP服务器、文件格式转换等内容,相关jar包兼容。可以直接使用。
下载地址>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Java实现文件格式转换代码实例