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;i
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,编码方式,一般为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程序设计有所帮助。