4月15日个人博客

1.昨日完成对MP3的剪切 五小时

2.难点:未进行过学习,看不懂他人代码

3.今日目标:将识别结果输出到web界面

4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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 @   wrf12  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示