java实现切割wav音频文件的方法详解【附外部jar包下载】
本文实例讲述了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;iwave类型的音频文件切割时必须注意头信息,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,编码方式,一般为0x0001 publicshortfmt_channel;//2byte,声道数目,1--单声道;2--双声道 publicintfmt_samplesPerSec;//4byte,采样频率 publicintavgBytesPerSec;//4byte,每秒所需字节数,记录每秒的数据量 publicshortblockAlign;//2byte,数据块对齐单位(每个采样需要的字节数) publicshortbitsPerSample;//2byte,每个采样需要的bit数 publicintdata_id;//4byte,字符data publicintdata_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; } }附件为wave切割程序所依赖的外部jar包:jave-1.0.2
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。