以前做过一个音乐播放器,基本的功能都有,什么在线播放,下载,歌词显示,分享等。下面是剪切合并代码,算法也有,结合算法才好看代码

package com.cdu.hhmusic.utils;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;
/*** 使用注意事项* @作者 胡楠启* 在android中操作肯定需要操作SD卡的权限的。*调用顺序:*1、fenLiData//只要调用了它就会产生中间文件*2、initMP3Frame*3、CutingMp3*4、在调用端,切割完毕后删除中间产生的垃圾文件*String fenLiData = CutingMp3.fenLiData(str1);*File file=new File(fenLiData);*if(file.exists())file.delete();*原因是在工具端删除中间文件时,这个删除失败。懒得继续画精力去找 ,所以必须在调用端切割完毕后删除,*一避免垃圾文件占用内存*/public class CaoZuoMp3Utils {/*** 返回分离出MP3文件中的数据帧的文件路径** @作者 胡楠启**/public static String fenLiData(String path) throws IOException {File file = new File(path);// 原文件File file1 = new File(path + "01");// 分离ID3V2后的文件,这是个中间文件,最后要被删除File file2 = new File(path + "001");// 分离id3v1后的文件RandomAccessFile rf = new RandomAccessFile(file, "rw");// 随机读取文件FileOutputStream fos = new FileOutputStream(file1);byte ID3[] = new byte[3];rf.read(ID3);String ID3str = new String(ID3);// 分离ID3v2if (ID3str.equals("ID3")) {rf.seek(6);byte[] ID3size = new byte[4];rf.read(ID3size);int size1 = (ID3size[0] & 0x7f) << 21;int size2 = (ID3size[1] & 0x7f) << 14;int size3 = (ID3size[2] & 0x7f) << 7;int size4 = (ID3size[3] & 0x7f);int size = size1 + size2 + size3 + size4 + 10;rf.seek(size);int lens = 0;byte[] bs = new byte[1024*4];while ((lens = rf.read(bs)) != -1) {fos.write(bs, 0, lens);}fos.close();rf.close();} else {// 否则完全复制文件int lens = 0;rf.seek(0);byte[] bs = new byte[1024*4];while ((lens = rf.read(bs)) != -1) {fos.write(bs, 0, lens);}fos.close();rf.close();}RandomAccessFile raf = new RandomAccessFile(file1, "rw");byte TAG[] = new byte[3];raf.seek(raf.length() - 128);raf.read(TAG);String tagstr = new String(TAG);if (tagstr.equals("TAG")) {FileOutputStream fs = new FileOutputStream(file2);raf.seek(0);byte[] bs=new byte[(int)(raf.length()-128)];raf.read(bs);fs.write(bs);raf.close();fs.close();} else {// 否则完全复制内容至file2FileOutputStream fs = new FileOutputStream(file2);raf.seek(0);byte[] bs = new byte[1024*4];int len = 0;while ((len = raf.read(bs)) != -1) {fs.write(bs, 0, len);}raf.close();fs.close();}if (file1.exists())// 删除中间文件{file1.delete();}return file2.getAbsolutePath();}/*** 分离出数据帧每一帧的大小并存在list数组里面*失败则返回空* @param path* @return* @throws IOException*/public static List<Integer> initMP3Frame(String path)  {File file = new File(path);List<Integer> list = new ArrayList<>();/*  int framSize=0;RandomAccessFile rad = new RandomAccessFile(file, "rw");byte[] head = new byte[4];rad.seek(framSize);rad.read(head);int bitRate = getBitRate((head[2] >> 4) & 0x0f) * 1000;int sampleRate = getsampleRate((head[2] >> 2) & 0x03);int paing = (head[2] >> 1) & 0x01;int len = 144 * bitRate / sampleRate + paing;for(int i=0,lens=(int)(file.length())/len;i<lens;i++){list.add(len);// 将数据帧的长度添加进来}*/int framSize = 0;RandomAccessFile rad = null;try {rad = new RandomAccessFile(file, "rw");} catch (FileNotFoundException e) {e.printStackTrace();}while (framSize < file.length()) {byte[] head = new byte[4];try {rad.seek(framSize);} catch (IOException e) {e.printStackTrace();}try {rad.read(head);} catch (IOException e) {e.printStackTrace();}int bitRate = getBitRate((head[2] >> 4) & 0x0f) * 1000;int sampleRate = getsampleRate((head[2] >> 2) & 0x03);int paing = (head[2] >> 1) & 0x01;if(bitRate==0||sampleRate==0)return null;int len = 144 * bitRate / sampleRate + paing;list.add(len);// 将数据帧的长度添加进来framSize += len;}return list;}/*** 返回切割后的MP3文件的路径 返回null则切割失败 开始时间和结束时间的整数部分都是秒,以秒为单位*** @param list* @param startTime* @param stopTime* @return* @throws IOException*/public static String CutingMp3(String path, String name,List<Integer> list, double startTime, double stopTime)throws IOException {File file = new File(path);String luJing="/storage/emulated/0/"+"HH音乐播放器/切割/";File f=new File(luJing);f.mkdirs();int start = (int) (startTime / 0.026);int stop = (int) (stopTime / 0.026);if ((start > stop) || (start < 0) || (stop < 0) || (stop > list.size())) {return null;} else {long seekStart = 0;// 开始剪切的字节的位置for (int i = 0; i < start; i++) {seekStart += list.get(i);}long seekStop = 0;// 结束剪切的的字节的位置for (int i = 0; i < stop; i++) {seekStop += list.get(i);}RandomAccessFile raf = new RandomAccessFile(file, "rw");raf.seek(seekStart);File file1 = new File(luJing + name + "(HH切割).mp3");FileOutputStream out = new FileOutputStream(file1);byte[] bs=new byte[(int)(seekStop-seekStart)];raf.read(bs);out.write(bs);raf.close();out.close();File filed=new File(path);if(filed.exists())filed.delete();return file1.getAbsolutePath();}}private static int getBitRate(int i) {int a[] = {0,32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224,256, 320,0 };return a[i];}private static int getsampleRate(int i) {int a[] = { 44100, 48000, 32000,0 };return a[i];}/*** 返回合并后的文件的路径名,默认放在第一个文件的目录下* @param path* @param path1* @param name* @return* @throws IOException*/public static String heBingMp3(String path,String path1,String name) throws IOException{String fenLiData = fenLiData(path);String fenLiData2 = fenLiData(path1);File file=new File(fenLiData);File file1=new File(fenLiData2);String luJing="/storage/emulated/0/"+"HH音乐播放器/合并/";File f=new File(luJing);f.mkdirs();//生成处理后的文件File file2=new File(luJing+name+"(HH合并).mp3");FileInputStream in=new FileInputStream(file);FileOutputStream out=new FileOutputStream(file2);byte bs[]=new byte[1024*4];int len=0;//先读第一个while((len=in.read(bs))!=-1){out.write(bs,0,len);}in.close();out.close();//再读第二个in=new FileInputStream(file1);out=new FileOutputStream(file2,true);//在文件尾打开输出流len=0;byte bs1[]=new byte[1024*4];while((len=in.read(bs1))!=-1){out.write(bs1,0,len);}in.close();out.close();if(file.exists())file.delete();if(file1.exists())file1.delete();return file2.getAbsolutePath();}
}

作用就是可以剪切合并音乐,各种路劲需要根据实际情况修改。

用法:剪切

String fenLiData = CaoZuoMp3Utils.fenLiData(str);
                        final List<Integer> list = CaoZuoMp3Utils.initMP3Frame
                                (fenLiData);
                        if(list==null){
                            han.post(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(Cut_Mp3_Activity.this, "剪切失败",
                                            Toast.LENGTH_SHORT).show();
                                    prodiialog.dismiss();
                                }
                            });
                        }else{
                            final String path = CaoZuoMp3Utils.CutingMp3(fenLiData, cuting_name,
                                    list,
                                    start, stop);
                            final File file = new File(fenLiData);

合并:

final String s = CaoZuoMp3Utils.heBingMp3(path, path1, name);

因为是耗时操作所以需要放在线程中进行。

android剪切合并MP3音乐相关推荐

  1. android剪切合并MP3音乐,android剪切合并MP3音乐

    以前做过一个音乐播放器,基本的功能都有,什么在线播放,下载,歌词显示,分享等.下面是剪切合并代码,算法也有,结合算法才好看代码 package com.cdu.hhmusic.utils; impor ...

  2. 音乐应用开发Android应用开发--MP3音乐播放器界面设计(2)

    在写这篇文章之前,xxx已写过了几篇关于改音乐应用开发主题的文章,想要了解的朋友可以去翻一下之前的文章 Android应用开发--MP3音乐播放器界面计划(2) 2013年5月25日 简.美音乐播放器 ...

  3. Android应用开发--MP3音乐播放器滚动歌词实现

    Android应用开发--MP3音乐播放器滚动歌词实现 2013年6月2日  简.美音乐播放器开发记录 -----前话 有网友给我博客评论说,让我借鉴好的Android代码,代码贴出来的时候最好整体先 ...

  4. Android应用开发--MP3音乐播放器界面设计(1)

    Android应用开发--MP3音乐播放器界面设计(1)                                           近期突然想自己开发一款MP3播放器,所以就有了上面的界面, ...

  5. Android应用开发--MP3音乐播放器Service实现

    Android应用开发--MP3音乐播放器Service实现 2013年5月29日简.美音乐播放器开发记录 让网友们久等啦,关于简.美音乐播放器的开发,最重要的Service类总算是要发博了.关于An ...

  6. Android应用开发--MP3音乐播放器界面设计(2)

    Android应用开发--MP3音乐播放器界面设计(2) 2013年5月25日 简.美音乐播放器开发 真得很无奈,原本打算很快结束这个实战项目的,但因为各种满课.学科.杂事给耽误了进度,现在小巫的这个 ...

  7. Android应用开发 MP3音乐播放器滚动歌词实现

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Andr ...

  8. Android应用开发--MP3音乐播放器代码实现(一)

    Android应用开发--MP3音乐播放器代码实现(一) 需求1:将内存卡中的MP3音乐读取出来并显示到列表当中 1. 从数据库中查询所有音乐数据,保存到List集合当中,List当中存放的是Mp3I ...

  9. Android应用开发--MP3音乐播放器代码实现(二)

    2013年5月25日 简.美音乐播放器开发 小巫在这里罗列这个播放器已经实现的功能: 1.   自动显示音乐列表 2.   点击列表播放音乐 3.   长按列表弹出对话框 4.   暂停音乐 5.   ...

最新文章

  1. 解析codepage和charset的含义及其应用
  2. MapGuide应用开发系列(四)---- 如何运行第一个.net实例代码
  3. 三星Galaxy S21 FE现身Geekbench:骁龙888+6GB运存
  4. 小米无线网卡驱动_小米air笔记本蓝屏故障排除,一个匪夷所思的故障原因。
  5. Installing OwnCloud 9 on Debian 8
  6. c++11 线程的互斥量
  7. linux 查看libevent 安装目录,关于Linux下libevent库的基础安装和使用
  8. 电信私有云 oracle,行业观察:Oracle私有云升级
  9. 返回字符串AText的ACount个复本
  10. 查看Python第三方库的帮助文档
  11. iMeta | 南医大余光创组ggtree最新文章-系统发育树存储与可视化的数据结构
  12. PCI Express (PCIe) 介绍
  13. 进程管理软件SysCheck使用指南
  14. 微服务:高性能网关 ShenYu简介
  15. 附合导线简易平差(4500PA)
  16. html name选择器,iframe标签的name属性
  17. R语言ggplot2可视化:使用patchwork包将两个ggplot2可视化结果横向构成新的结果可视化组合图(使用|符号)
  18. Spring AOP(切面面向接口)
  19. 教你什么时候用Vue计算属性!!!
  20. greenplum的gpload在window下的使用问题

热门文章

  1. 通过文件inode查找文件内容
  2. DateValue 函数
  3. 2021年熔化焊接与热切割最新解析及熔化焊接与热切割新版试题
  4. linux kpti 性能,KPTI实现机制及性能与开销
  5. 【Python】中秋节快到了,这才是程序员该赏的“月亮”(3D+音频+源码)
  6. C语言 去掉字符串右侧空格
  7. C语言--鸡兔同笼-假设法
  8. matlab candle横坐标日期显示不对
  9. 达内培训c语言怎么样,达内培训 C语言和C++到底有什么关系?
  10. 玩游戏时计算机ram,计算机的32G RAM是否必要? 8G,16G,32G内存游戏,生产率测量比较...