获取且设置MP3、AAC文件播放时长、文件大小等信息

这是一个Java实现的音频文件码率转换工具,主要依赖jaudiotagger和jave-core库。代码提供了MP3文件的码率转换功能,可以根据不同比特率需求进行转换,并能获取音频文件的相关信息如采样率、声道等。
摘要由CSDN通过智能技术生成

主要依赖于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;
	}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值