需求: 使用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. NSIndexSet 浅析

    Cocoa 中提供了两个用于维护区间集合的类型:NSIndexSet和NSMutableIndexSet . 这两个类型容易其名字一样,其区别就在于是否可以修改.这个区别和NSArray的一样,NSI ...

  2. 对本地Solr服务器添加IK中文分词器实现全文检索功能

    在上一篇随笔中我们提到schema.xml中<field/>元素标签的配置,该标签中有四个属性,分别是name.type.indexed与stored,这篇随笔将讲述通过设置type属性的 ...

  3. EFDB 基本规范&知识

    public abstract class AccountRole //这是继承类型 { [Key] public int ID { get; set; } public bool isDisable ...

  4. 关于 myBatis 中的 jdbcType的细节问题

    前几天上线了一个 版本,第二天到公司的时候,在cat上发现了一个长sql查询非常耗时,几乎把线上的项目搞崩溃了.我马上开始排查问题.最终发现 球队的ID传过来的时候是String 类型的,但是在执行s ...

  5. 依赖ConstraintLayout报错,Could not find *****,Failed to resolve:*****

    ConstraintLayout 约束布局,AndroidStudio2.2中新增功能之一,可以先去看看这篇文章 Android新特性介绍,ConstraintLayout完全解析,2.3版本的And ...

  6. 前端面试题总结:HTML5,JS,CSS3,兼容性。

    1. 请写出至少20个HTML5标签 <article><aside> <audio><video> <canvas><datalis ...

  7. 【2-24】for循环嵌套,跳转语句,异常语句,穷举法、迭代法

    For循环嵌套与if嵌套相似,是在for中再套for,其结构如下: For(;;) { For(;;){} }经典题型为打印星星例: Console.Write("请输入一个奇数:" ...

  8. WeMall微商城源码报名插件Apply的主要源码

    WeMall微信商城源码报名插件Apply,用于商城的签到系统,分享了部分比较重要的代码,供技术员学习参考 AdminController.class.php <?php namespace A ...

  9. 1688: [Usaco2005 Open]Disease Manangement 疾病管理

    1688: [Usaco2005 Open]Disease Manangement 疾病管理 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 413  So ...

  10. 1592: [Usaco2008 Feb]Making the Grade 路面修整

    1592: [Usaco2008 Feb]Making the Grade 路面修整 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 428  Solv ...