java wav 切割_java切割音频文件_阿伯刺的俄佛歌的博客-程序员宅基地

技术标签: java wav 切割  

工具:

一个jar包即可:jave-1.0.2.jar

可以切割wav格式的音频文件

完整工程目录

cc2e539b148032861c6d5ab9997d5464.png

就一个jar包,一个main类

代码:

package com.zit;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.nio.ByteBuffer;

import it.sauronsoftware.jave.Encoder;

import it.sauronsoftware.jave.MultimediaInfo;

/**

* wav音频文件截取工具

* (适用于比特率为128kbps的wav音频文件,此类音频文件的头部信息占用长度44字节)

* @author 王晓东

*

*/

public class ReadVideo {

public static void main(String[] args) {

//System.out.println(cut("E:\\record.mp3","E:\\record-cut_0_15.mp3", 0, 15)); //大于18(也可能别的值),会读取不了

// System.out.println(cut("E:\\record_40s.wav","E:\\record-cut_15_30.wav", 15, 30));

int start = 0;

int end = 0;

int count = 10;

String sourcefile = "E:\\test.wav";

long time = getTimeLen(new File(sourcefile));

int newTime = (int)time;

int internal = newTime - end;

while(internal > 0) {

if(internal < 10) {

cut(sourcefile, "E:\\record-cut_" + start + "_" + (int)time +".wav", start, (int)time);

end += count;

internal = newTime - end;

}else {

end += count;

cut(sourcefile, "E:\\record-cut_" + start + "_" + end +".wav", start, end);

start += count;

internal = newTime - end;

}

}

}

/**

* 截取wav音频文件

* @param sourcepath 源文件地址

* @param targetpath 目标文件地址

* @param start 截取开始时间(秒)

* @param end 截取结束时间(秒)

*

* return 截取成功返回true,否则返回false

*/

public static boolean cut(String sourcefile, String targetfile, int start, int end) {

try{

if(!sourcefile.toLowerCase().endsWith(".wav") || !targetfile.toLowerCase().endsWith(".wav")){

return false;

}

File wav = new File(sourcefile);

if(!wav.exists()){

return false;

}

long t1 = getTimeLen(wav); //总时长(秒)

if(start<0 || end<=0 || start>=t1 || end>t1 || start>=end){

return false;

}

FileInputStream fis = new FileInputStream(wav);

long wavSize = wav.length()-44; //音频数据大小(44为128kbps比特率wav文件头长度)

long splitSize = (wavSize/t1)*(end-start); //截取的音频数据大小

long skipSize = (wavSize/t1)*start; //截取时跳过的音频数据大小

int splitSizeInt = Integer.parseInt(String.valueOf(splitSize));

int skipSizeInt = Integer.parseInt(String.valueOf(skipSize));

ByteBuffer buf1 = ByteBuffer.allocate(4); //存放文件大小,4代表一个int占用字节数

buf1.putInt(splitSizeInt+36); //放入文件长度信息

byte[] flen = buf1.array(); //代表文件长度

ByteBuffer buf2 = ByteBuffer.allocate(4); //存放音频数据大小,4代表一个int占用字节数

buf2.putInt(splitSizeInt); //放入数据长度信息

byte[] dlen = buf2.array(); //代表数据长度

flen = reverse(flen); //数组反转

dlen = reverse(dlen);

byte[] head = new byte[44]; //定义wav头部信息数组

fis.read(head, 0, head.length); //读取源wav文件头部信息

for(int i=0; i<4; i++){ //4代表一个int占用字节数

head[i+4] = flen[i]; //替换原头部信息里的文件长度

head[i+40] = dlen[i]; //替换原头部信息里的数据长度

}

byte[] fbyte = new byte[splitSizeInt+head.length]; //存放截取的音频数据

for(int i=0; i

fbyte[i] = head[i];

}

byte[] skipBytes = new byte[skipSizeInt]; //存放截取时跳过的音频数据

fis.read(skipBytes, 0, skipBytes.length); //跳过不需要截取的数据

fis.read(fbyte, head.length, fbyte.length-head.length); //读取要截取的数据到目标数组

fis.close();

File target = new File(targetfile);

if(target.exists()){ //如果目标文件已存在,则删除目标文件

target.delete();

}

FileOutputStream fos = new FileOutputStream(target);

fos.write(fbyte);

fos.flush();

fos.close();

}catch(IOException e){

e.printStackTrace();

return false;

}

return true;

}

/**

* 获取音频文件总时长

* @param filePath 文件路径

* @return

*/

public static long getTimeLen(File file){

long tlen = 0;

if(file!=null && file.exists()){

Encoder encoder = new Encoder();

try {

MultimediaInfo m = encoder.getInfo(file);

long ls = m.getDuration();

tlen = ls/1000;

} catch (Exception e) {

e.printStackTrace();

}

}

return tlen;

}

/**

* 数组反转

* @param array

*/

public static byte[] reverse(byte[] array){

byte temp;

int len=array.length;

for(int i=0;i

temp=array[i];

array[i]=array[len-1-i];

array[len-1-i]=temp;

}

return array;

}

}

切割后的效果

4d1d812cfcb16068d149e620d9a7d149.png

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34207880/article/details/114105121

智能推荐

Vmware 虚拟机网络通讯_解酒的李白的博客-程序员宅基地

原文地址 :https://blog.csdn.net/u011127242/article/details/83684972VMware Workstation(中文名“威睿工作站”)是一款功能强大的桌面虚拟计算机软件,提供用户可在单一的桌面上同时运行不同的操作系统,和进行开发、测试 、部署新的应用程序的最佳解决方案。其使用过程中的网络连接是一个比较重要的问题,笔者本文针对VM的网络通信的...

VFP用update更新表内容_龟速前进的博客-程序员宅基地_foxpro update

alter table 被更新表名 add 新增字段名 c()#新增字段,c为字段属性,括号里填字段宽度**update a set a.新增字段=b.**对应的字段 from 被更新库名 a inner join 参考库名 **b on a.关联字段=b.**关联字段#a为被跟新表别称,b为参考库别称...

iOS项目组件化历程_weixin_34257076的博客-程序员宅基地

为什么要组件化随着业务的发展,App中的页面,网络请求,通用弹层UI,通用TableCell数量就会剧增,需求的开发人员数量也会逐渐增多。如果所有业务都在同一个App中,并且同时开发人数较少时,抛开代码健壮性不谈,实际的开发体验可能并没有那么糟糕,毕竟作为一个开发,什么地方用什么控件,就跟在HashMap中通过Key获取Value那么简单。那么当业务成长到需要分化到多个App的时候,组件化的...

SuSE 网卡配置模板_weixin_34392435的博客-程序员宅基地

heidsoft:/etc/sysconfig/network # cat ifcfg.template ## This is a template for a network interface configuration file used with ifup.## See 'man 8 ifup' for details.## Additionally to the following va...

java访问usb_Java访问USB设备_利益第三人的博客-程序员宅基地

编者注由于需要对某usb设备获取的数值进行转发和广播,则选择最熟悉的java作为切入语言解决。历经辛苦,测试成功。JSR-80通过查看Java的标准协会在制定标准的时候是具有JSR-80的制定的。API为javax.usb。但是通过当前(JDK 8作为默认),无论是J2ME、J2SE、J2EE都没有对JSR进行实现。APISimple问题通过阅读,能够得知没有Windows实现,或者Windows...

奇怪的ORA-12145解决方法_songzhenhua2000的博客-程序员宅基地_ora-12145

今天访问ORACLE数据库时输入正确的用户名、密码,却提示ORA-12145问题:使用本地NET服务名进入数据库,提示ORA-12145使用IP+SID进入数据库,正常 初步定位是TNS填写有问题,把一个可以用本地NET服务名的那几行数值复制并覆盖有问题,然后改成相应的数值再次进入,问题依旧这下奇怪了,把好的复制过来,好的可以用,这个不能进的按说也应该可以进的。 问题解决:最后

随便推点

苹果净利润同比下滑19%,大中华区下滑30%;养老基金将入股市投资,首批可能达2000亿元_公众号: DCOS的博客-程序员宅基地

这是一份久违了的普通早报哟。 不出意外的苹果财报,和几家欢喜几家愁的科技圈 @新浪科技:【 苹果第四财季净利同比降19%  大中华区营收下滑30% 】财报显示,苹果第四财季营收468.52亿美元,同比下滑9%;净利润90.14亿美元,同比下滑19%。大中华区营收为87.85亿美元,同比下滑30%。第四财季来自于iPhone的营收为281.60亿美元,同比下滑13%;财报发布后苹果盘后股价跳

Features for configuring JSON-to-Java mapping_weixin_30721077的博客-程序员宅基地

Following on/off features are defined inDeserializationConfig.Feature(Jackson 1.x) orDeserializationFeature(Jackson 2.x):ACCEPT_EMPTY_STRING_AS_NULL_OBJECT (default: false) (since1.8)Deter...

Ubuntu安装网易云音乐_TDHypocrites的博客-程序员宅基地

Ubuntu安装网易云音乐今晚没什么事,准备背完单词就去写心得体会,心血来潮想给虚拟机里装上网易云音乐,遇到了一些问题,这里作下记录。下载安装包http://music.163.com/#/download Ubuntu是基于Debian,可安装.deb的安装包,通过pdkg命令安装该类软件包。更换源右击打开终端>sudo gedit /etc/apt/sources.list在网上查了之后了解

十位值得关注的Java顶级专家___HelloWorld__的博客-程序员宅基地

网上有太多的声称Java大牛的大V,到底哪些值得关注,本文也许可以帮助你。如果你是Java开发者,关注几位经验丰富的Java大牛,并随时了解他们的关注焦点对于自己肯定是非常有好处的。然而,今天在网络上,有太多的声音试图赢得你的眼球,但有时往往真假难辨。最近,我们搜索了社交媒体上的最有洞察力的Java专家,做成一个列表,供您参考。Nicolas FränkelTwitter: @nicolas_fr

排查指南 | 两个案例学会从埋点排查 iOS 离线包_阿里云开发者的博客-程序员宅基地

简介:首次打开离线包白屏以及报错“-1009”等该如何处理呢?离线包原理以一次启动离线包的流程为例,离线包的加载流程分为两种场景,第一种是离线包下载好的场景,流程如图1所示,第二种是离线包没下载好的场景,如图2所示:图1:离线包加载主流图2:离线包下载流程我们可以从埋点来跟踪离线包具体的加载流程*:检查本地是否有离线包,本地有则执行第四步解压,解压之后再进行校验,校验通过加载本地离线包,如果本地已经安装过,那就不需要解压直接走解压后的流程网络请求离线包信息,这一步和上一步是异步进行的,对应的埋点有 H5_A

Mac新升级系统OS X El Capitan实用新功能快速指南_阿曌的博客-程序员宅基地

1.分屏(Split View)令人最为心动的恐怕就是新系统的分屏功能了。能够同时让两个程序无缝贴合在一个屏幕下。任何程序只要不是在全屏状态,长按左上角的绿色键,然后再往边上一拖,就能自动贴边并且分屏,这时候其他后台程序就自动“集合”到右边去了,点击某个之后就能实现50:50点

推荐文章

热门文章

相关标签