在公司上班的时候,领导要求将上传的文件比特率统一修改为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>