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;
    }

}

  

posted @ 2023-04-15 23:19  wrf12  阅读(30)  评论(0)    收藏  举报