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; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!