在截取音乐文件之前,先了解比特率的意义。
比特率(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条评论
点击登录参与评论