4月15日个人博客
1.昨日完成对MP3的剪切 五小时
2.难点:未进行过学习,看不懂他人代码
3.今日目标:将识别结果输出到web界面
4
package org.example; import org.jaudiotagger.audio.mp3.MP3AudioHeader; import org.jaudiotagger.audio.mp3.MP3File; import java.io.File; import java.io.RandomAccessFile; import java.util.ArrayList; public class Mp3cut { public static ArrayList<String> cut(String filePath) throws Exception { ArrayList<String> result = new ArrayList<String>(); //原mp3文件 File mSourceMp3File = new File(filePath); 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); // endTime = (45 % (10) + 20) * 1000; endTime = (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 = "D:\\mp3\\" + orderNum + ".mp3"; String pathname = filePath.substring(0, filePath.lastIndexOf(".")) + "-" + String.format("%03d", orderNum) + ".mp3"; File dFile = new File(pathname); result.add(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; } return result; } }