使用Java代码修改音频文件比特率(码率)


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

  

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM