使用IO流实现音频的剪切和拼接

需求: 使用IO流将指定目录下的若干个音频文件的高潮部分,进行剪切,并重新拼接成一首新的音频文件


思路(以两首歌为例):

  第一首歌有一个输入流对象bis1。第二首歌有一个输入流对象bis2,他们公用一条输出流对象bos(在选择构造方法的时候选择含有布尔类型参数的那个),待第一首歌剪切完成后,在此基础上追加第二首歌的“高潮部分”。


实现代码:


 1 import java.io.BufferedInputStream;
 2 import java.io.BufferedOutputStream;
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.FileNotFoundException;
 6 import java.io.FileOutputStream;
 7 import java.io.IOException;
 8 import java.io.InputStream;
 9 /**
10  * 音乐剪切和拼接(音乐串烧)
11  * @author
12  *
13  */
14 public class CutMusic {
15
16     public static void main(String[] args) {
17         //f1,f2分别为需要剪切的歌曲路径
18          File f1 = new File("E:\\CutMusicTest\\残酷月光(Cover:林宥嘉).mp3");
19         File f2 = new File("E:\\CutMusicTest\\慢慢.mp3");
20         //f为合并的歌曲
21         File f = new File("E:\\CutMusicTest\\MergeMusic.mp3");
22         cut1(f1,f2,f);
23     }
24
25     public static void cut1(File f1,File f2,File f){
26         BufferedInputStream bis1 = null;
27         BufferedInputStream bis2 = null;
28         BufferedOutputStream bos = null;
29         //第一首歌剪切部分起始字节
30         int start1 = 2375680;//320kbps(比特率)*58s*1024/8=2375680   比特率可以查看音频属性获知
31         int end1 = 4915200;//320kbps*120s*1024/8=4915200
32
33         //第二首歌剪切部分起始字节,计算方式同上
34         int start2 = 3686400;
35         int end2 = 5324800;
36
37         int tatol1 = 0;
38         int tatol2 = 0;
39         try {
40             //两个输入流
41             bis1 = new BufferedInputStream(new FileInputStream(f1));
42             bis2 = new BufferedInputStream(new FileInputStream(f2));
43             //缓冲字节输出流(true表示可以在流的后面追加数据,而不是覆盖!!)
44             bos = new BufferedOutputStream(new FileOutputStream(f,true));
45
46             //第一首歌剪切、写入
47             byte[] b1= new byte[512];
48             int len1 = 0;
49             while((len1 = bis1.read(b1))!=-1){
50                 tatol1+=len1;            //累积tatol
51                 if(tatol1<start1 ){        //tatol小于起始值则跳出本次循环
52                     continue;
53                 }
54                 bos.write(b1);            //写入的都是在我们预先指定的字节范围之内
55                 if(tatol1>=end1 ){        //当tatol的值超过预先设定的范围,则立刻刷新bos流对象,并结束循环
56                     bos.flush();
57                     break;
58                 }
59
60             }
61             System.out.println("第一首歌剪切完成!");
62
63             //第二首歌剪切、写入,原理同上
64             byte[] b2= new byte[512];
65             int len2 = 0;
66             while((len2 = bis2.read(b2))!=-1){
67                 tatol2 += len2;
68                 if(tatol2 < start2){
69                     continue;
70                 }
71                 bos.write(b2);
72                 if(tatol2>=end2){
73                     bos.flush();
74                     break;
75                 }
76
77             }
78             System.out.println("第二首歌剪切完成!");
79         } catch (IOException e) {
80             // TODO Auto-generated catch block
81             e.printStackTrace();
82         }finally{
83                 try {//切记要关闭流!!
84                     if(bis1!=null) bis1.close();
85                     if(bis2!=null) bis2.close();
86                     if(bos!=null) bos.close();
87                 } catch (IOException e) {
88                     // TODO Auto-generated catch block
89                     e.printStackTrace();
90                 }
91         }
92     }
93
94 }

获取音频文件比特率的方式:


运行结果:

时间: 2024-10-09 00:52:41

使用IO流实现音频的剪切和拼接的相关文章

java IO流

* IO流用来处理设备之间的数据传输 * Java对数据的操作是通过流的方式 * Java用于操作流的类都在IO包中 * 流按流向分为两种:输入流,输出流. * 流按操作类型分为两种: * 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的 * 字符流 : 字符流只能操作纯字符数据,比较方便. * IO流常用父类 * 字节流的抽象父类: * InputStream * OutputStream * 字符流的抽象父类: * Reader * Writer * IO程序

JavaEE基础(二十)/IO流

1.IO流(IO流概述及其分类) 1.概念 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流,输出流. 流按操作类型分为两种: 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的 字符流 : 字符流只能操作纯字符数据,比较方便. 2.IO流常用父类 字节流的抽象父类: InputStream OutputStream 字符流的抽象父类: Reader Writer 3.IO程序书写 使

day20&lt;IO流&gt;

IO流(IO流概述及其分类) IO流(FileInputStream) IO流(read()方法返回值为什么是int) IO流(FileOutputStream) IO流(FileOutputStream追加) IO流(拷贝图片) IO流(拷贝音频文件画原理图) IO流(字节数组拷贝之available()方法) IO流(定义小数组) IO流(定义小数组的标准格式) IO流(BufferedInputStream和BufferOutputStream拷贝) IO流(flush和close方法的区

Java中IO流,输入输出流概述与总结

总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入流),或者抽象类Reader(字符输入流)的子类: 而所有输出流都是抽象类OutputStream(字节输出流)或者Writer(字符输出流)的子类. [首先需要明白的是:流是干什么的???(为了永久性的保存数据)   根据数据流向的不同分为输入流和输出流:   根据处理数据类型的不同分为字符流和字

Java笔记(19):IO流(01)

1.try...catch的方式处理异常1 1 package cn.itcast_02; 2 3 /* 4 * 异常:程序出现了不正常的情况. 5 * 6 * 程序的异常:Throwable 7 * 严重问题:Error 我们不处理.这种问题一般都是很严重的,比如说内存溢出. 8 * 问题:Exception 9 * 编译期问题:不是RuntimeException的异常 必须进行处理的,因为你不处理,编译就不能通过. 10 * 运行期问题:RuntimeException 这种问题我们也不处

5. IO流:★★★★★

IO流:★★★★★,用于处理设备上数据. 流:可以理解数据的流动,就是一个数据流.IO流最终要以对象来体现,对象都存在IO包中. 流也进行分类: 1:输入流(读)和输出流(写). 2:因为处理的数据不同,分为字节流和字符流. 字节流:处理字节数据的流对象.设备上的数据无论是图片或者dvd,文字,它们都以二进制存储的.二进制的最终都是以一个8位为数据单元进行体现,所以计算机中的最小数据单元就是字节.意味着,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据. 那么为什么要有字符流呢?因

IO流的练习 —— 创建用户注册、登陆案例

把上次用集合做的时候的分析拿出来 需求: 用户登录注册案例 按照如下操作,可以让我们更符合面向对象思想: A:这个案例有哪些类 B:每个类中又有哪些东西 C:类与类之间的关系 分析: A:这个案例有哪些类 用户类 测试类 B:每个类中又有哪些东西 用户类: 成员变量:用户名.密码 构造方法:无参构造 成员方法:getXxx().setXxx() 登陆,注册 但,如果用户类的内容过多的时候,维护起来比较麻烦. 所以,为了以后维护起来比较容易,我们需要更清晰的分类: 用户类可以再分为2个类: 用户基

IO流(一)字节流

1:io流体系:对数据进行读写操作.所以IO不是读就是写咯. 2:io流的相关的类:java.io包. 有关IO的操作都会产生IOException异常 3:io:参照物是程序, i:input.进来,读取数据到程序中. o:output:出去,将数据从程序中写出去. 4:io流的分类,相关的类都会有相应的单词. 4.1:从数据的流向分.个人理解为就是内存和硬盘之间的数据交换,内存上的数据是暂时性的,而硬盘上的数据是永久性的. Input(输入):读取数据,数据往程序中流.或者说:将硬盘上的数据

IO流知识总结

IO流:(Input Output) 输入输出流 输入:将文件读到内存中. 输出:将文件从内存输出到其他地方. IO计数的作用:主要就是解决设备和设备之间的数据传输问题. 比如:硬盘到--->内存,内存数据--->硬盘中 把键盘中的数据写入到内存. IO的应用场景: 比如:打卡机打出信息表.注册的时候图片的上传.下载 功能.解析XML 数据保存到本地,数据一个永久保存.数据保存到磁盘上是以文件的形式存在的. java中如何操作文件: java是通过File文件类来操作文件和文件夹. File(