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


思路(以两首歌为例):

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


实现代码:


 import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 音乐剪切和拼接(音乐串烧)
* @author
*
*/
public class CutMusic { public static void main(String[] args) {
//f1,f2分别为需要剪切的歌曲路径
File f1 = new File("E:\\CutMusicTest\\残酷月光(Cover:林宥嘉).mp3");
File f2 = new File("E:\\CutMusicTest\\慢慢.mp3");
//f为合并的歌曲
File f = new File("E:\\CutMusicTest\\MergeMusic.mp3");
cut1(f1,f2,f);
} public static void cut1(File f1,File f2,File f){
BufferedInputStream bis1 = null;
BufferedInputStream bis2 = null;
BufferedOutputStream bos = null;
//第一首歌剪切部分起始字节
int start1 = 2375680;//320kbps(比特率)*58s*1024/8=2375680 比特率可以查看音频属性获知
int end1 = 4915200;//320kbps*120s*1024/8=4915200 //第二首歌剪切部分起始字节,计算方式同上
int start2 = 3686400;
int end2 = 5324800; int tatol1 = 0;
int tatol2 = 0;
try {
//两个输入流
bis1 = new BufferedInputStream(new FileInputStream(f1));
bis2 = new BufferedInputStream(new FileInputStream(f2));
//缓冲字节输出流(true表示可以在流的后面追加数据,而不是覆盖!!)
bos = new BufferedOutputStream(new FileOutputStream(f,true)); //第一首歌剪切、写入
byte[] b1= new byte[512];
int len1 = 0;
while((len1 = bis1.read(b1))!=-1){
tatol1+=len1; //累积tatol
if(tatol1<start1 ){ //tatol小于起始值则跳出本次循环
continue;
}
bos.write(b1); //写入的都是在我们预先指定的字节范围之内
if(tatol1>=end1 ){ //当tatol的值超过预先设定的范围,则立刻刷新bos流对象,并结束循环
bos.flush();
break;
} }
System.out.println("第一首歌剪切完成!"); //第二首歌剪切、写入,原理同上
byte[] b2= new byte[512];
int len2 = 0;
while((len2 = bis2.read(b2))!=-1){
tatol2 += len2;
if(tatol2 < start2){
continue;
}
bos.write(b2);
if(tatol2>=end2){
bos.flush();
break;
} }
System.out.println("第二首歌剪切完成!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {//切记要关闭流!!
if(bis1!=null) bis1.close();
if(bis2!=null) bis2.close();
if(bos!=null) bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }

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


运行结果:

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

  1. JavaEE基础(二十)/IO流

    1.IO流(IO流概述及其分类) 1.概念 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流,输出流. 流按操作类型分 ...

  2. day20<IO流>

    IO流(IO流概述及其分类) IO流(FileInputStream) IO流(read()方法返回值为什么是int) IO流(FileOutputStream) IO流(FileOutputStre ...

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

    总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...

  4. 12 IO流

    File类:构造方法    * File(String pathname):根据一个路径得到File对象    * File(String parent, String child):根据一个目录和一 ...

  5. java中的IO流(输入流与输出流)概述与总结

    Java中IO流,输入输出流概述与总结 总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都 ...

  6. IO流知识点总结

    IO流的使用:(Input  OutPut)       输入输出流: 输入:将文件读到内存中 输出:将文件从内存输出到其他地方   IO技术的作用: 主要就是解决设备和设备之间的数据传输问题.比如: ...

  7. 今天谈谈流,什么是IO流?

    无标题 (5) :first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } img { bord ...

  8. 线程+IO流

    第十八天知识点总结 线程的停止: 1.停止一个线程,一般是通过一个变量来控制. 2.如果需要停止一个处于一个等待状态的线程,那么需要配合interrupt方法来完成 守护线程(后台线程):在一个进程中 ...

  9. IO流(一)__File对象和字符流FileWriter FileReader

    IO流:IO流用来处理设备之间的数据传输,Java对于流的操作对象都在IO包中将外设中的数据读取到内存中:输入将内存的数写入到外设中:输出 流分为字节流和字符流字符流的由来:其实就是字节流读取文字字节 ...

随机推荐

  1. C# winform程序免安装.net framework在XP/win7/win10环境运行!

    前文: 首先感谢群里的大神宇内流云 提供的anyexec for windows版本. 经过本人搭建虚拟机在xp环境 使用anyexec运行winfrom程序后,测试通过,如下是用的xp运行winfr ...

  2. linux下c++动态库的生成及使用

    文章来源于:http://hi.baidu.com/ablenavy/item/b498901c6826bbf587ad4e33 我的程序是一个类,在网上找了半天,都是c的例子,c++的类封装成静态库 ...

  3. 微信群之Java技术红包问答

    缘起 年前公司拿到B+轮融资,相应的在战略上也做了很大的调整,毕竟B轮要做的事情不仅仅是增加用户数,于是乎公司在2017年的开头补充了一部分技术团队,这次人员选择上主要针对一些工作经验在1-2年的技术 ...

  4. 了解 : angular $rootScope 在 ui-view

    在view 的element 可以直接调用 <p>{{$stateParams.xx}}</p> 要让xx有资料必须注入 app.run["$rootScope&qu ...

  5. MySQL优化二(连接优化和缓存优化)

    body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...

  6. SQLServer索引循环删除

    declare qc_cursor cursor SCROLL OPTIMISTIC Forselect siteName from tb_vhostcheckopen qc_cursordeclar ...

  7. KoaHub.JS基于Node.js开发的mysql的node.js驱动程序代码

    mysql A node.js driver for mysql. It is written in JavaScript, does not require compiling, and is 10 ...

  8. Go语言并发机制初探

    Go 语言相比Java等一个很大的优势就是可以方便地编写并发程序.Go 语言内置了 goroutine 机制,使用goroutine可以快速地开发并发程序, 更好的利用多核处理器资源.这篇文章学习 g ...

  9. Webpack单元测试,e2e测试

    此篇文章是续 webpack多入口文件.热更新等体验,主要说明单元测试与e2e测试的基本配置以及相关应用. 一.单元测试 实现单元测试框架的搭建.es6语法的应用.以及测试覆盖率的引入. 1. 需要安 ...

  10. MongoDB一般安装

    MongoDB一般安装 1.首先到官网(http://www.mongodb.org/downloads )下载合适的安装包,目前的最新版本为2.6 安装包有zip和msi格式的,这里推荐下载zip格 ...