600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > java切割wav音频文件

java切割wav音频文件

时间:2023-02-18 04:07:14

相关推荐

java切割wav音频文件

importit.sauronsoftware.jave.Encoder;importit.sauronsoftware.jave.MultimediaInfo;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.nio.ByteBuffer;/***wav音频文件截取工具*(适用于比特率为128kbps的wav音频文件,此类音频文件的头部信息占用长度44字节)*@authorlwj**/publicclassWavCut{/***截取wav音频文件*@paramsourcepath源文件地址*@paramtargetpath目标文件地址*@paramstart截取开始时间(秒)*@paramend截取结束时间(秒)**return截取成功返回true,否则返回false*/publicstaticbooleancut(Stringsourcefile,Stringtargetfile,intstart,intend){try{if(!sourcefile.toLowerCase().endsWith(".wav")||!targetfile.toLowerCase().endsWith(".wav")){returnfalse;}Filewav=newFile(sourcefile);if(!wav.exists()){returnfalse;}longt1=getTimeLen(wav);//总时长(秒)if(start<0||end<=0||start>=t1||end>t1||start>=end){returnfalse;}FileInputStreamfis=newFileInputStream(wav);longwavSize=wav.length()-44;//音频数据大小(44为128kbps比特率wav文件头长度)longsplitSize=(wavSize/t1)*(end-start);//截取的音频数据大小longskipSize=(wavSize/t1)*start;//截取时跳过的音频数据大小intsplitSizeInt=Integer.parseInt(String.valueOf(splitSize));intskipSizeInt=Integer.parseInt(String.valueOf(skipSize));ByteBufferbuf1=ByteBuffer.allocate(4);//存放文件大小,4代表一个int占用字节数buf1.putInt(splitSizeInt+36);//放入文件长度信息byte[]flen=buf1.array();//代表文件长度ByteBufferbuf2=ByteBuffer.allocate(4);//存放音频数据大小,4代表一个int占用字节数buf2.putInt(splitSizeInt);//放入数据长度信息byte[]dlen=buf2.array();//代表数据长度flen=reverse(flen);//数组反转dlen=reverse(dlen);byte[]head=newbyte[44];//定义wav头部信息数组fis.read(head,0,head.length);//读取源wav文件头部信息for(inti=0;i<4;i++){//4代表一个int占用字节数head[i+4]=flen[i];//替换原头部信息里的文件长度head[i+40]=dlen[i];//替换原头部信息里的数据长度}byte[]fbyte=newbyte[splitSizeInt+head.length];//存放截取的音频数据for(inti=0;i<head.length;i++){//放入修改后的头部信息fbyte[i]=head[i];}byte[]skipBytes=newbyte[skipSizeInt];//存放截取时跳过的音频数据fis.read(skipBytes,0,skipBytes.length);//跳过不需要截取的数据fis.read(fbyte,head.length,fbyte.length-head.length);//读取要截取的数据到目标数组fis.close();Filetarget=newFile(targetfile);if(target.exists()){//如果目标文件已存在,则删除目标文件target.delete();}FileOutputStreamfos=newFileOutputStream(target);fos.write(fbyte);fos.flush();fos.close();}catch(IOExceptione){e.printStackTrace();returnfalse;}returntrue;}/***获取音频文件总时长*@paramfilePath文件路径*@return*/publicstaticlonggetTimeLen(Filefile){longtlen=0;if(file!=null&&file.exists()){Encoderencoder=newEncoder();try{MultimediaInfom=encoder.getInfo(file);longls=m.getDuration();tlen=ls/1000;}catch(Exceptione){e.printStackTrace();}}returntlen;}/***数组反转*@paramarray*/publicstaticbyte[]reverse(byte[]array){bytetemp;intlen=array.length;for(inti=0;i<len/2;i++){temp=array[i];array[i]=array[len-1-i];array[len-1-i]=temp;}returnarray;}publicstaticvoidmain(String[]args){System.out.println(cut("f:\\111.wav","f:\\111-cut_0_10.wav",0,10));System.out.println(cut("f:\\111.wav","f:\\111-cut_10_20.wav",10,20));System.out.println(cut("f:\\111.wav","f:\\111-cut_20_28.wav",20,28));}}

wave类型的音频文件切割时必须注意头信息,128kbps比特率的wave文件头信息占用44字节。

可以把头信息作为一个对象,用ByteBuffer获取头信息。

注意:wave文件的头信息字节数组中每个属性都进行了数组反转

wave头信息对象模型如下:

/***wave文件头信息*@authorlwj**/publicclassHead{publicintriff_id;//4byte,'RIFF'publicintfile_size;//4byte,文件长度(数据长度+36)publicintriff_type;//4byte,'WAVE'publicintfmt_id;//4byte,'fmt'publicintfmt_size;//4byte,数值为16或18,18则最后又附加信息publicshortfmt_tag;//2byte,编码方式,一般为0x0001publicshortfmt_channel;//2byte,声道数目,1--单声道;2--双声道publicintfmt_samplesPerSec;//4byte,采样频率publicintavgBytesPerSec;//4byte,每秒所需字节数,记录每秒的数据量publicshortblockAlign;//2byte,数据块对齐单位(每个采样需要的字节数)publicshortbitsPerSample;//2byte,每个采样需要的bit数publicintdata_id;//4byte,字符datapublicintdata_size;//4byte,数据长度publicintgetRiff_id(){returnriff_id;}publicvoidsetRiff_id(intriff_id){this.riff_id=riff_id;}publicintgetFile_size(){returnfile_size;}publicvoidsetFile_size(intfile_size){this.file_size=file_size;}publicintgetRiff_type(){returnriff_type;}publicvoidsetRiff_type(intriff_type){this.riff_type=riff_type;}publicintgetFmt_id(){returnfmt_id;}publicvoidsetFmt_id(intfmt_id){this.fmt_id=fmt_id;}publicintgetFmt_size(){returnfmt_size;}publicvoidsetFmt_size(intfmt_size){this.fmt_size=fmt_size;}publicshortgetFmt_tag(){returnfmt_tag;}publicvoidsetFmt_tag(shortfmt_tag){this.fmt_tag=fmt_tag;}publicshortgetFmt_channel(){returnfmt_channel;}publicvoidsetFmt_channel(shortfmt_channel){this.fmt_channel=fmt_channel;}publicintgetFmt_samplesPerSec(){returnfmt_samplesPerSec;}publicvoidsetFmt_samplesPerSec(intfmt_samplesPerSec){this.fmt_samplesPerSec=fmt_samplesPerSec;}publicintgetAvgBytesPerSec(){returnavgBytesPerSec;}publicvoidsetAvgBytesPerSec(intavgBytesPerSec){this.avgBytesPerSec=avgBytesPerSec;}publicshortgetBlockAlign(){returnblockAlign;}publicvoidsetBlockAlign(shortblockAlign){this.blockAlign=blockAlign;}publicshortgetBitsPerSample(){returnbitsPerSample;}publicvoidsetBitsPerSample(shortbitsPerSample){this.bitsPerSample=bitsPerSample;}publicintgetData_id(){returndata_id;}publicvoidsetData_id(intdata_id){this.data_id=data_id;}publicintgetData_size(){returndata_size;}publicvoidsetData_size(intdata_size){this.data_size=data_size;} }

需要外部jar包/blog/2025072

我是转载的有几个小伙伴也问过我一些问题, jar包地址可以去原博客下载

程序自己测试没问题 测试时注意几个问题:

1你的文件格式 音频 可以用FFmpeg转化成wav 个人转化时 是用的256比特率的文件(不知道为什么128的转不了)

2注意main函数中你的输出 加入你的文件10 秒,你开始于结束的时间要在此范围内 ,如果没有在会返回flase 切成功了返回true.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。