Java使用IO流实现音频的剪切和拼接
作者:沐易笙 发布时间:2023-09-11 08:47:46
标签:java,IO流,音频
需求: 使用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();
}
}
}
}
获取音频文件比特率的方式:
运行结果:


猜你喜欢
- 概述关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属 于某个对象的。也就是说,既
- 本文实例为大家分享了RecyclerView实现横向滚动效果的具体代码,供大家参考,具体内容如下布局文件<LinearLayout
- java中字符串转整数及MyAtoi方法的实现 该题虽然和我们正常使
- 前言XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场
- 什么是AOPAOP是 Aspect Oriented Programming 的缩写,即面向切面编程,和平常遇到的面向对象OOP编程不一样的
- Android webView加载数据时内存溢出今天使用webView加载数据时 如果数据太长就会崩溃,造成内存溢出,在网上查
- 本文实例为大家分享了java计算工作时间的具体代码,不包括节假日、双休日,供大家参考,具体内容如下package common.util;
- BeanFactory接口:IoC容器的顶级接口,是IoC容器的最基础实现,也是访问Spring容器的根接口,负责对bean的创建,访问等工
- 本文实例为大家分享了java数独游戏的具体代码,供大家参考,具体内容如下自己写的数独游戏,共9关,代码如下:1、DoShudu类用于产生数独
- 网格布局标签是GridLayout。这个布局是android4.0新增的布局。这个布局只有4.0之后的版本才能使用。不过新增了一些东东①跟L
- Spring Security是一款基于Spring框架的认证和授权框架,提供了一系列控制访问和保护应用程序的功能,同时也支持基于角色和权限
- 文档合并是一种高效文档处理方式。如果能够有一个方法能将多种不同类型的文档合并成一种文档格式,那么在文档存储管理上将为我们提供极大的便利。因此
- 本文实例讲述了java实现求两个字符串最长公共子串的方法。分享给大家供大家参考,具体如下:这个是华为OJ上的一道题目。首先,如果我们用jav
- mybatis获取表中某一列的最大值这个问题这两天也是找了好久才找到解决办法,在此记录一下。获取表中数据某一列的最大值,在mapper.xm
- 本文介绍spring-rest接口中的LocalDateTime日期类型转时间戳的方法。具体的代码参照示例项目 https://github
- 短信是手机常见的功能,本文就以实例形式讲述了Android实现将已发送的短信写入短信数据库的方法。分享给大家供大家参考之用。具体如下:一般来
- 一、概述:System.Collections.Concurrent 命名空间提供多个线程安全集合类。当有多个线程并发访问集合时,应使用这些
- 本文以在chart控件上和窗体上画矩形为例子讲述了C# GDI在控件上绘图的方法。分享给大家供大家参考。具体方法如下:具体的实现方法就不多解
- 递归生成一个如图的菜单,编写两个类数据模型Menu、和创建树形的MenuTree。通过以下过程实现:1.首先从菜单数据中获取所有根节点。2.
- Android获取系统cpu信息,内存,版本,电量等信息 1、CPU频率,CPU信息:/proc/cpuinfo和/proc/stat 通过