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