当前位置: 首页 > 工具软件 > JAudiotagger > 使用案例 >

java利用jaudiotagger随机将MP3分割成小段

戎劲
2023-12-01

 首先下载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中的资源自己做了一点小小的改动

 

 

 类似资料: