android剪切合并MP3音乐

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

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);
		// 分离ID3v2
		if (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 {// 否则完全复制内容至file2
			FileOutputStream 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);

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


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
### 回答1: 视频剪切合并器是一款常用的软件工具,用于对视频进行剪辑和合并操作。其中,rar是一种压缩文件格式。 在使用视频剪切合并器时,首先我们需要选择一个rar文件,将其解压缩后得到包含视频文件文件夹。接下来,我们可以打开视频剪切合并器,导入需要编辑的视频文件剪切功能是视频剪切合并器的重要功能之一。通过视频剪切合并器,我们可以选择视频文件的起始时间和结束时间,然后将其剪切下来,得到所需的片段。这在拍摄后需要去除冗余部分或者提取重要片段时非常有用。 而合并功能则可以帮助我们将多个视频文件合并成一个。通过视频剪切合并器,我们可以选择多个视频文件,设定合并顺序,然后将它们合并为一个完整的视频文件。这在需要将拍摄的片段进行整合或者制作影视作品时非常有用。 除此之外,视频剪切合并器还提供了一些其他功能,比如添加特效、调整画面亮度对比度、修剪视频尺寸等。这些功能可以帮助我们对视频进行进一步的处理和美化,提升视频的质量。 总结来说,视频剪切合并器是一款方便实用的软件工具,可以帮助我们对视频进行剪辑和合并操作。而rar则是一种常见的压缩文件格式,在使用视频剪切合并器时需要将其解压缩后才能使用其中的视频文件。 ### 回答2: 视频剪切合并器 RAR 是一种流行的视频编辑工具,它能够帮助我们剪切合并视频文件。RAR 是一种常见的压缩文件格式,它可以将多个文件打包并压缩成一个文件,方便传输和存储。使用这个软件,我们可以对视频进行剪切合并剪切功能允许我们从视频文件中选择我们想要保留的片段,删除其他部分。我们可以通过输入起始时间和结束时间,或者直接拖动滑块来选择剪切片段。这个功能非常有用,可以帮助我们去除视频中不需要的内容,提取我们感兴趣的部分。 合并功能可以将多个视频文件合并为一个,创造连续的播放效果。我们只需要选择要合并的视频文件,设置它们的播放顺序,然后点击合并按钮即可。这个功能对于我们想要将多个短视频合并成一个完整视频或制作影片时非常有用。 RAR 还提供了一些其他功能,例如视频转换、添加字幕、调整画面大小和质量等。它支持多种常见的视频格式,包括 MP4、AVI、MKV 等。 总的来说,视频剪切合并器 RAR 是一个功能强大且易于使用的工具,可以帮助我们剪切合并视频文件,创造出理想的效果。无论是个人用户还是专业用户,都可以从中受益。 ### 回答3: 视频剪切合并器RAR是一个功能强大的视频编辑工具。RAR是一种常见的压缩文件格式,它可以将大大小小的文件压缩成较小的RAR文件,从而方便存储和传输。 视频剪切合并器RAR具有许多实用的功能。首先,它可以对视频进行剪切操作。用户可以选择视频中的特定片段进行剪切,去除不需要的部分,从而实现视频的精细编辑。这对于留下精彩的片段或者删减冗余的内容非常有用。 其次,视频剪切合并器RAR还具备视频合并的功能。用户可以将多个视频文件合并为一个,实现多个片段的无缝衔接,从而制作出更长的影片。这对于合并拍摄多个片段、制作短片或者剪辑视频集锦非常有帮助。 此外,RAR格式的视频剪切合并器还支持对视频文件进行压缩。用户可以将较大的视频文件进行压缩,从而节省存储空间,并方便上传和分享。这对于需要通过网络传输视频文件的用户来说是非常实用的功能。 综上所述,视频剪切合并器RAR是一个非常实用的视频编辑工具,它可以帮助用户剪切合并和压缩视频文件,让用户能够更好地编辑和分享自己的视频作品。无论是专业的影视制作人还是普通的用户,都可以通过RAR来实现对视频的精细编辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值