首先下载http://www.jthink.net/jaudiotagger/需要用到的jar包并添加引用
我这里用的2.2.3版本,下载链接
import org.jaudiotagger.audio.mp3.MP3AudioHeader;
import org.jaudiotagger.audio.mp3.MP3File;
以下是我的示例代码
//原mp3文件
File mSourceMp3File = new File("E:\\Temp\\9274.mp3");
MP3File mp3 = new MP3File(mSourceMp3File);
MP3AudioHeader header = (MP3AudioHeader) mp3.getAudioHeader();
long bitRateKbps = header.getBitRateAsNumber();
int length = header.getTrackLength() * 1000 / 2;
System.out.println("总时长:" + length);
//预备开始截取的时间
long beginTime = 0;
//截取结算时间
long endTime = 0;
long orderNum = 0;
while (endTime < length) {
System.out.println("开始截取第" + (orderNum++) + "段。开始时间点:" + beginTime);
Random random = new Random();
endTime = (random.nextInt(29) % (10) + 20) * 1000;
if (endTime + beginTime > length) {
endTime = length;
} else {
endTime += beginTime;
}
System.out.println("截取结算时间点-->" + endTime);
// 1KByte/s=8Kbps, bitRate *1024L / 8L / 1000L 转换为 bps 每毫秒
// 计算出开始字节位置
long beginBitRateBpm = (bitRateKbps * 1024L / 8L / 1000L) * beginTime;
// 返回音乐数据的第一个字节
long firstFrameByte = header.getMp3StartByte();
// 获取开始时间所在文件的字节位置
long beginByte = firstFrameByte + beginBitRateBpm;
// 计算出结束字节位置
long endByte = beginByte + (bitRateKbps * 1024L / 8L / 1000L) * (endTime - beginTime);
//目标文件
String pathname = "e:\\Temp\\" + orderNum + ".mp3";
File dFile = new File(pathname);
RandomAccessFile dRaf = new RandomAccessFile(dFile, "rw");
RandomAccessFile sRaf = new RandomAccessFile(mSourceMp3File, "rw");
//先将mp3的头文件写入文件
for (long i = 0; i < firstFrameByte; i++) {
int m = sRaf.read();
dRaf.write(m);
}
//跳转到指定的位置
sRaf.seek(beginByte);
//开始写入 mp3实体
for (long i = 0; i <= endByte - beginByte; i++) {
int m = sRaf.read();
dRaf.write(m);
}
sRaf.close();
dRaf.close();
//在每段的开始时间点上面减去100毫秒
beginTime = endTime - 100;
}
本文参考了https://blog.51cto.com/lmdtx/2054251中的资源自己做了一点小小的改动