该代码是对wave头文件的解析
package com.zhukovasky.audio;
public class WaveHeader {
private byte[] ChunkID; //4
private byte[] ChunkSize; //4
private byte[] Format; //4
private byte[] SubChunk1ID;//格式说明块,本字段一般就是"fmt
private byte[] subChunk1Size;//本数据块的大小,不包括ID和Size字段本身
private byte[] AudioFormat;//音频的格式说明
private byte[] NumChannels;//声道数
private byte[] SampleRate;
private byte[] ByteRate;
private byte[] BlockAlign;
private byte[] BistPerSample;
private byte[] SubChunk2ID;
private byte[] SubChunk2Size;
public byte[] getChunkID() {
return ChunkID;
}
public void setChunkID(byte[] chunkID) {
ChunkID = chunkID;
}
public byte[] getChunkSize() {
return ChunkSize;
}
public void setChunkSize(byte[] chunkSize) {
ChunkSize = chunkSize;
}
public byte[] getFormat() {
return Format;
}
public void setFormat(byte[] format) {
Format = format;
}
public byte[] getSubChunk1ID() {
return SubChunk1ID;
}
public void setSubChunk1ID(byte[] subChunk1ID) {
SubChunk1ID = subChunk1ID;
}
public byte[] getSubChunk1Size() {
return subChunk1Size;
}
public void setSubChunk1Size(byte[] subChunk1Size) {
this.subChunk1Size = subChunk1Size;
}
public byte[] getAudioFormat() {
return AudioFormat;
}
public void setAudioFormat(byte[] audioFormat) {
AudioFormat = audioFormat;
}
public byte[] getNumChannels() {
return NumChannels;
}
public void setNumChannels(byte[] numChannels) {
NumChannels = numChannels;
}
public byte[] getSampleRate() {
return SampleRate;
}
public void setSampleRate(byte[] sampleRate) {
SampleRate = sampleRate;
}
public byte[] getByteRate() {
return ByteRate;
}
public void setByteRate(byte[] byteRate) {
ByteRate = byteRate;
}
public byte[] getBlockAlign() {
return BlockAlign;
}
public void setBlockAlign(byte[] blockAlign) {
BlockAlign = blockAlign;
}
public byte[] getBistPerSample() {
return BistPerSample;
}
public void setBistPerSample(byte[] bistPerSample) {
BistPerSample = bistPerSample;
}
public byte[] getSubChunk2ID() {
return SubChunk2ID;
}
public void setSubChunk2ID(byte[] subChunk2ID) {
SubChunk2ID = subChunk2ID;
}
public byte[] getSubChunk2Size() {
return SubChunk2Size;
}
public void setSubChunk2Size(byte[] subChunk2Size) {
SubChunk2Size = subChunk2Size;
}
public int Size(){
return 43;
}
}
废话不多说,贴上部分源代码。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import com.zhukovasky.tools.ArraysUtils;
public class Audio {
private String filePath;
private byte[] toBt;
private byte[] HeadBt;
private WaveHeader Head;
private byte[] Context;
private int Length;
public Audio(String filePath){
this.filePath=filePath;
init();
getHead();
getHeader();
}
private void getHeader(){
Head=new WaveHeader();
Head.setChunkID(ArraysUtils.getPartsOfArrays(toBt, 0, 4));
Head.setChunkSize(ArraysUtils.getPartsOfArrays(HeadBt, 4, 8));
Head.setFormat(ArraysUtils.getPartsOfArrays(HeadBt, 8, 12));
Head.setSubChunk1ID(ArraysUtils.getPartsOfArrays(HeadBt, 12, 16));
Head.setSubChunk1Size(ArraysUtils.getPartsOfArrays(HeadBt, 16, 20));
Head.setAudioFormat(ArraysUtils.getPartsOfArrays(HeadBt, 20, 21));
Head.setNumChannels(ArraysUtils.getPartsOfArrays(HeadBt, 22, 24));
Head.setSampleRate(ArraysUtils.getPartsOfArrays(HeadBt, 24, 28));
Head.setByteRate(ArraysUtils.getPartsOfArrays(HeadBt, 28, 32));
Head.setBlockAlign(ArraysUtils.getPartsOfArrays(HeadBt, 32, 34));
Head.setBistPerSample(ArraysUtils.getPartsOfArrays(HeadBt, 34, 36));
Head.setSubChunk2ID(ArraysUtils.getPartsOfArrays(HeadBt, 36, 40));
Head.setSubChunk2Size(ArraysUtils.getPartsOfArrays(HeadBt, 40, 44));
}
public String getChunkID(){
byte[] bt=Head.getChunkID();
return ArraysUtils.ByteToString(bt, "gbk");
}
public int getChunkSize(){
byte[] bt=Head.getChunkSize();
return ArraysUtils.ByteToInt(bt);
}
public String getFormat(){
return ArraysUtils.ByteToString(Head.getFormat(), "gbk");
}
public String getSubChunk1ID(){
return ArraysUtils.ByteToString(Head.getSubChunk1ID(), "gbk");
}
public int getSubChunk1Size(){
return ArraysUtils.ByteToInt(Head.getSubChunk1Size());
}
public int getAudioFormat(){
return HeadBt[20];
}
public int getNumChannels(){
return HeadBt[22];
}
public int getSampleRate(){
return ArraysUtils.ByteToInt(Head.getSampleRate());
}
public int getByteRate(){
return ArraysUtils.ByteToInt(Head.getByteRate());
}
public int getBlockAlign(){
return HeadBt[32];
}
public int getBistPerSample(){
return HeadBt[34];
}
public String getSubChunk2ID(){
return ArraysUtils.ByteToString(Head.getSubChunk2ID(), "gbk");
}
public int getSubChunk2Size(){
return ArraysUtils.ByteToInt(Head.getSubChunk2Size());
}
public byte[] getHead(){
this.HeadBt= ArraysUtils.getPartsOfArrays(toBt, 0, 44);
return this.HeadBt;
}
public byte[] getContext(int Begins,int Ends){
this.Context=ArraysUtils.getPartsOfArrays(toBt, Begins, Ends);
return this.Context;
}
private byte[] getPart(int Begins,int Ends){
return ArraysUtils.getPartsOfArrays(toBt, Begins, Ends);
}
public void CreateNewWave(String filepath,int Begins,int Ends){
File o=new File(filepath);
OutputStream os=null;
try {
os=new FileOutputStream(o);
byte[] parts=getPart(Begins,Ends);
System.out.println(Ends-Begins);
int length=Ends-Begins;
int newChunkSize=length+36;
byte[] newChunkSizeArrays=ArraysUtils.intToByteArray(newChunkSize);
byte[] newChunkByteArray=ArraysUtils.modifyByteArrays(HeadBt, 4, 8,newChunkSizeArrays);
byte[] newLast=ArraysUtils.intToByteArray(length);
byte[] newHead=ArraysUtils.modifyByteArrays(newChunkByteArray, 40, 44, newLast);
byte[] merges=ArraysUtils.MergeWave(newHead, parts);
os.write(merges);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void init(){
File f=new File(filePath);
InputStream is=null;
this.toBt=new byte[(int)f.length()];
this.Length=(int) f.length();
try {
is=new FileInputStream(f);
is.read(this.toBt);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public int getSize(){
return this.Length;
}
public String toString(){
return Arrays.toString(this.toBt);
}
}