在公司上班的时候,领导要求将上传的文件比特率统一修改为128kpbs,查找了好多资料都不行,最后使出了毕生功力解决这个问题。
由于使用同步的方式上传太慢,用户体验度太差,所以使用了异步的方式。
见公式(百度上到处都是,但是会报错,各位大佬只是把自己的代码粘贴上来,都没给解决问题)
java.lang.IllegalArgumentException
/**
*inputPath:需要处理的文件地址
*outputPath:处理后要输出的文件地址
*/
public void Mp3Test(String inputPath,String outputPath){
AudioAttributes audio = new AudioAttributes();
audio.setCodec("libmp3lame");
audio.setBitRate(new Integer(128000));//设置比特率
audio.setSamplingRate(new Integer(44100));//设置采样率
audio.setChannels(new Integer(2));//设置音频通道数
EncodingAttributes attrs = new EncodingAttributes();
attrs.setFormat("mp3");//设置格式,我的文件原本就是mp3格式的
attrs.setAudioAttributes(audio);
//attrs.setDuration(360f); // 设置截取的时长
Encoder encoder = new Encoder();
File inputFile = new File(inputPath);
File outputFile = new File(outputPath);
encoder.encode(inputFile,outputFile, attrs);
}
自己经过几天的百度,以及查看jave官方问题,最终解决报错如何处理,将最后一个方法(encoder.encoder()方法)try-catch一下(
} catch (IllegalArgumentException e) {
e.printStackTrace();
)
有的时候页面传过来的是MultipartFile类型,我们需将MultipartFile类型转换成File类型文件
public static File multipartFileToFile(MultipartFile file) throws Exception {
File toFile = null;
if (file.equals("") || file.getSize() <= 0) {
file = null;
} else {
InputStream ins = null;
ins = file.getInputStream();
toFile = new File(file.getOriginalFilename());
inputStreamToFile(ins, toFile);
ins.close();
}
return toFile;
}
//获取流文件
private static void inputStreamToFile(InputStream ins, File file) {
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
e.printStackTrace();
}
}
重点都在这里了,顺便说一下异步吧,公司使用的是SpringBoot框架,Spring Boot框架异步处理方式只需要在启动类添加@EnableAsync注解,然后在异步方法上使用@Async注解就可以了,但是在我的项目中,只要使用@EnableAsync注解,整个项目都无法启动(想了好久不知道为啥。。。。),最后只有使用线程的方式
@Component public class AsyncTask { private ExecutorService executor = Executors.newCachedThreadPool() ; public void fun(String inputPath, String outputPath){ executor.submit(new Runnable() { @Override public void run() { //修改音频文件比特率 AudioAttributes audio = new AudioAttributes(); audio.setCodec("libmp3lame"); audio.setBitRate(new Integer(128000));//设置比特率 audio.setSamplingRate(new Integer(44100)); audio.setChannels(new Integer(2)); EncodingAttributes attrs = new EncodingAttributes(); attrs.setFormat("mp3");//设置格式,我的文件原本就是mp3格式的 attrs.setAudioAttributes(audio); //attrs.setDuration(360f); // 设置截取的时长 Encoder encoder = new Encoder(); File inputFile = new File(inputPath); File outputFile = new File(outputPath); try { encoder.encode(inputFile,outputFile, attrs);//就是这个地方搞了好久 MP3File mp3File = new MP3File(outputFile); System.out.println(mp3File.getMP3AudioHeader().getBitRate());//输出转换后的文件比特率 } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (InputFormatException e) { e.printStackTrace(); } catch (EncoderException e) { e.printStackTrace(); } catch (ReadOnlyFileException e) { e.printStackTrace(); } catch (TagException e) { e.printStackTrace(); } catch (InvalidAudioFrameException e) { e.printStackTrace(); } } }); } }
还有个问题就是当上传的音频文件超过10M的时候,可以正常上传成功,但是无法转换比特率,会报一个NA问题,百度了好久也是没有解决,上班好累啊。。抓狂。。。
这个问题使用的是jave解决的,原本想直接在pom文件中添加坐标自己下载jar包,但是pom下载不下来,最后使用的是引入第三方jar的反射。引入第三方jar在本地可以使用,当打包发到生产环境的时候启动就会报错了,这个时候就需要引入jar包的同时修改pom文件。

修改pom文件的时候有两个地方需要注意
1.虽然使用的是引入第三方jar的方式,但还是需要在pom文件中添加坐标,同时还需要使用scope和systemPath标签
<dependency>
<groupId>it.sauronsoftware</groupId>
<artifactId>jave</artifactId>
<version>1.0.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/jave-1.0.2.jar</systemPath>
</dependency>
2.在build标签中需要使用configuration标签
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <includeSystemScope>true</includeSystemScope> </configuration> </plugin> <plugins> <build>
