主要依赖于jaudiotagger和jave-core,下载链接:https://download.csdn.net/download/little__SuperMan/21108069
直接上代码,注释很清楚都能看明白
package com.exercise.util;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import org.jaudiotagger.audio.mp3.MP3AudioHeader;
import org.jaudiotagger.audio.mp3.MP3File;
import org.springframework.web.multipart.MultipartFile;
import ws.schild.jave.AudioAttributes;
import ws.schild.jave.Encoder;
import ws.schild.jave.EncoderException;
import ws.schild.jave.EncodingAttributes;
import ws.schild.jave.InputFormatException;
import ws.schild.jave.MultimediaObject;
/***
* 音频文件码率转换
* @author li
*
*/
public class AudioTransCoder {
public static void main(String[] args) throws NumberFormatException, EncoderException {
String transFilePath = "E:\\工作专属文件夹\\后台\\小强\\我爱听的歌曲\\烟火-陈翔.mp3";
String saveFilePath = "E:\\工作专属文件夹\\后台\\小强\\我爱听的歌曲\\rateTranCoder\\";
// System.out.println(getAudioFileInfo("E:\\工作专属文件夹\\后台\\小强\\我爱听的歌曲\\rateTranCoder\\烟火-陈翔.aac"));
// AudioInfoTrans(transFilePath,saveFilePath,"12800","","","libmp3lame");
String[] bitRate = new String[] {"32000","64000","96000","12800","25600"};
for(int i=0;i<bitRate.length;i++) {
String rate = bitRate[i];
AudioBitRateTrans(transFilePath, saveFilePath+rate+"烟火-陈翔.mp3", rate);
}
}
/**
* MP3文件码率转换
* @param transFilePath 待转化文件路径
* @param saveFilePath 转换保存路径
* @param bitRate 比特率 32000、64000、96000、12800、25600
* @param SampleRate 采样率 44100
* @param channel 通道 1、2
* @param format 文件编码格式 libmp3lame、pcm_u8、aac
* @throws EncoderException
* @throws NumberFormatException
*/
public static boolean AudioBitRateTrans(String transFilePath,String saveFilePath,String bitRate) throws NumberFormatException, EncoderException {
Map<String,String> audioFileInfo = getAudioFileInfo(transFilePath);
if(audioFileInfo == null) {
return false;
}
System.out.println("转换前文件信息:"+audioFileInfo);
if("".equals(bitRate)) {
bitRate = audioFileInfo.get("bitRate");
}
String SampleRate = audioFileInfo.get("sampleRate");
String channel = audioFileInfo.get("channel");
String format = "libmp3lame";
if("Stereo".equals(channel)) {
channel = "2";
}else { //mono
channel = "1";
}
return rateCodeTrans(transFilePath,saveFilePath,Integer.parseInt(bitRate),Integer.parseInt(SampleRate),Integer.parseInt(channel),format);
}
/**
* 音频文件信息转换(注意:跨格式转化码率会不稳定发生跳转)
* 针对 待转化文件路径为MP3、AAC类型
* @param transFilePath 待转化文件路径
* @param saveFilePath 转换保存路径
* @param bitRate 比特率 32000、64000、96000、12800、25600
* @param SampleRate 采样率 44100
* @param channel 通道 1、2
* @param format 文件编码格式 libmp3lame、pcm_u8、aac
* @throws EncoderException
* @throws NumberFormatException
*/
public static boolean AudioInfoTrans(String transFilePath,String saveFilePath,String bitRate,String SampleRate,String channel,String format) throws NumberFormatException, EncoderException {
Map<String,String> audioFileInfo = getAudioFileInfo(transFilePath);
if(audioFileInfo == null) {
return false;
}
System.out.println("转换前文件信息:"+audioFileInfo);
if("".equals(bitRate)) {
bitRate = audioFileInfo.get("bitRate");
}
if("".equals(SampleRate)) {
SampleRate = audioFileInfo.get("sampleRate");
}
if("".equals(channel)) {
channel = audioFileInfo.get("channel");
if("Stereo".equals(channel)) {
channel = "2";
}else { //mono
channel = "1";
}
}
if("".equals(format)) {
format = audioFileInfo.get("format");
}
return rateCodeTrans(transFilePath,saveFilePath,Integer.parseInt(bitRate),Integer.parseInt(SampleRate),Integer.parseInt(channel),format);
}
public static boolean rateCodeTrans(String transFilePath,String saveFilePath,int bitRate,int SampleRate,int channel,String format) throws EncoderException {
boolean flag = false;
//检测文件及保存路径
File transFile = new File(transFilePath);
if (!transFile.exists()) {
return flag;
}
File saveFile = new File(saveFilePath);
if(!saveFile.getParentFile().exists()) {
saveFile.getParentFile().mkdirs();
}
//修改音频文件比特率等参数
AudioAttributes audio = new AudioAttributes();
audio.setCodec(format);//转码器名称(文件编码格式)libmp3lame、pcm_u8、aac
audio.setBitRate(bitRate);//设置比特率
audio.setSamplingRate(SampleRate);//设置采样率
audio.setChannels(channel);//设置音频通道数
EncodingAttributes attrs = new EncodingAttributes();
// attrs.setFormat(format);//设置格式
// attrs.setDuration(360f); // 设置截取的时长
attrs.setAudioAttributes(audio);
Encoder encoder = new Encoder();
//打印转码器名称(文件编码格式)
// for(String x : encoder.getAudioEncoders()) {
// System.out.println(x);
// }
MultimediaObject multimediaObject = new MultimediaObject(transFile);
File outputFile = new File(saveFilePath);
try {
//开始转换
encoder.encode(multimediaObject,outputFile, attrs);
// Map audioFileInfo = getAudioFileInfo(saveFilePath);
// System.out.println("转换后文件信息:"+audioFileInfo);
flag = true;
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
/**
* 获取音频文件信息(注意:wav文件会报错,读取不到头信息。MP3、AAC文件可以正常使用)
* @param filePath 文件路径
* @return
*/
public static Map getAudioFileInfo(String filePath) {
try {
MP3File mp3File = new MP3File(filePath);
MP3AudioHeader header = mp3File.getMP3AudioHeader();
HashMap<String, String> map = new HashMap<String,String>();
map.put("duration", String.valueOf(header.getTrackLength())); //获得时长
map.put("bitRate", String.valueOf(header.getBitRate())); //获得比特率
map.put("trackSize", String.valueOf(header.getTrackLength())); //音轨长度
map.put("format", String.valueOf(header.getFormat())); //格式,例 mp3\wav
map.put("channel", String.valueOf(header.getChannels())); //声道
map.put("sampleRate", String.valueOf(header.getSampleRate())); //采样率
map.put("mpegLayer", String.valueOf(header.getMpegLayer())); //MPEG
map.put("mp3StartByte", String.valueOf(header.getMp3StartByte())); //MP3起始字节
map.put("preciseTrackSize", String.valueOf(header.getPreciseTrackLength())); //精确的音轨长度
return map;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}