工具:
一個jar包即可:jave-1.0.2.jar
可以切割wav格式的音頻文件
完整工程目錄

就一個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<head.length; 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<len/2;i++){
temp=array[i];
array[i]=array[len-1-i];
array[len-1-i]=temp;
}
return array;
}
}
切割后的效果

