2021-09-24 11:56

利用jaudiotagger实现MP3音乐截取

码自答

JavaEE

(2211)

(0)

收藏

在截取音乐文件之前,先了解比特率的意义。

比特率(bps)表示每秒传输的比特数,就是每秒传输的数据位数。又称数据信号速率。通常记为bit/s  也可以写成bps

比特率越高,表示每秒传输的数据就越多

对于MP3文件而言,比特率越高,表示音乐文件的音质越好。本文采用的MP3文件的比特率是320k bit每秒

不同的音乐文件 比特率不同 比特率跟文件的大小字节数相关。


1 下载jaudiotagger.jar包,并且添加到项目

2 java代码

Mp3.java

package com.wanmait.mp3Cut;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.jaudiotagger.audio.exceptions.CannotReadException;
import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException;
import org.jaudiotagger.audio.exceptions.ReadOnlyFileException;
import org.jaudiotagger.audio.mp3.MP3AudioHeader;
import org.jaudiotagger.audio.mp3.MP3File;
import org.jaudiotagger.tag.TagException;

public class Mp3 {
	//start秒  end秒  filename有文件路径和文件名  newFile是截取之后的文件保存的路径
	public void cut(int start,int end,String filename,String newFile){			
		try {
			File file = new File(filename);
			long totalByte = file.length();//文件总大小  字节数
			MP3File mp3 = new MP3File(file);
			MP3AudioHeader header = mp3.getMP3AudioHeader();
			//读取MP3文件的文件头部信息
			
			long bitRate = header.getBitRateAsNumber();
			//从头部信息读取mp3文件的比特率  不同MP3文件  比特率不同
			//比特率   bit/s  bps每秒读取的位数
	
			long mp3Start = header.getMp3StartByte();
			//从头部信息获得MP3文件中间  除去头部信息  音乐数据的第一个字节的位置
			
			long startByte = bitRate*1024/8*start+mp3Start;
			//根据截取的时间起点 计算需要截取的音乐数据的起点字节位置
			//bitRate是  kbit/s     bitRate*1024   是bit/s
			//bitRate*1024/8  是byte/s  是每秒读取的字节数			
			
			long endByte = bitRate*1024/8*end+mp3Start;
			//根据截取的时间终点 计算需要截取的音乐数据的终点字节位置
			
			endByte = endByte>totalByte?totalByte:endByte;
			//截取终点不能大于文件总字节数
			
			//截取MP3文件	
			FileInputStream fis = new FileInputStream(filename);
			FileOutputStream fos = new FileOutputStream(newFile);
			
			//先将文件头部信息写往新文件  音乐数据开始之前就是头部信息文件
			for (long i = 0; i < mp3Start; i++) {
				fos.write(fis.read());
			}
			
			fis.skip(startByte);
			//跳转到需要截取的音乐数据的开始位置
			
			for (int i = 0; i < endByte-startByte; i++) {
				fos.write(fis.read());
			}
			//写起点到终点之间的音乐数据
			
			fis.close();
			fos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TagException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ReadOnlyFileException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (CannotReadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvalidAudioFrameException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}			
	}
}


TestMain.java

package com.wanmait.mp3Cut;

public class TestMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Mp3 mp3 = new Mp3();
		mp3.cut(5, 20, "d:/data/1.mp3","d:/data/1_1.mp3");
		//截取1.mp3文件的5~10s部分  新文件1_1.mp3
	}

}


本代码中间计算出的比特率bitRate是 kbit/s ,是每秒传输的kbit数

bitRate*1024  是每秒传输的bit数  是bit/s  就是bps

bitRate*1024/8  是每秒传输的字节数byte    byte/s


0条评论

点击登录参与评论