下面是一个网上一个大神写的,在公司测过了,还不错.

还可以写一个构造函数:



initReader(InputStream is){
fis = new FileInputStream(is);
bis = new BufferedInputStream(fis);
}

eg:call it as following :
InputStream is=Activity.getResource().openRawResource();
InitReader(is);


openRawResource(r.raw.wavname);上面漏了资源.

 



// filename: WaveFileReader.java
// RobinTang
// 2012-08-23

import java.io.*;


public class WaveFileReader {
private String filename = null;
private int[][] data = null;

private int len = 0;

private String chunkdescriptor = null;
static private int lenchunkdescriptor = 4;

private long chunksize = 0;
static private int lenchunksize = 4;

private String waveflag = null;
static private int lenwaveflag = 4;

private String fmtubchunk = null;
static private int lenfmtubchunk = 4;

private long subchunk1size = 0;
static private int lensubchunk1size = 4;

private int audioformat = 0;
static private int lenaudioformat = 2;

private int numchannels = 0;
static private int lennumchannels = 2;

private long samplerate = 0;
static private int lensamplerate = 2;

private long byterate = 0;
static private int lenbyterate = 4;

private int blockalign = 0;
static private int lenblockling = 2;

private int bitspersample = 0;
static private int lenbitspersample = 2;

private String datasubchunk = null;
static private int lendatasubchunk = 4;

private long subchunk2size = 0;
static private int lensubchunk2size = 4;


private FileInputStream fis = null;
private BufferedInputStream bis = null;

private boolean issuccess = false;

public WaveFileReader(String filename) {

this.initReader(filename);
}

// 判断是否创建wav读取器成功
public boolean isSuccess() {
return issuccess;
}

// 获取每个采样的编码长度,8bit或者16bit
public int getBitPerSample(){
return this.bitspersample;
}

// 获取采样率
public long getSampleRate(){
return this.samplerate;
}

// 获取声道个数,1代表单声道 2代表立体声
public int getNumChannels(){
return this.numchannels;
}

// 获取数据长度,也就是一共采样多少个
public int getDataLen(){
return this.len;
}

// 获取数据
// 数据是一个二维数组,[n][m]代表第n个声道的第m个采样值
public int[][] getData(){
return this.data;
}

private void initReader(String filename){
this.filename = filename;

try {
fis = new FileInputStream(this.filename);
bis = new BufferedInputStream(fis);

this.chunkdescriptor = readString(lenchunkdescriptor);
if(!chunkdescriptor.endsWith("RIFF"))
throw new IllegalArgumentException("RIFF miss, " + filename + " is not a wave file.");

this.chunksize = readLong();
this.waveflag = readString(lenwaveflag);
if(!waveflag.endsWith("WAVE"))
throw new IllegalArgumentException("WAVE miss, " + filename + " is not a wave file.");

this.fmtubchunk = readString(lenfmtubchunk);
if(!fmtubchunk.endsWith("fmt "))
throw new IllegalArgumentException("fmt miss, " + filename + " is not a wave file.");

this.subchunk1size = readLong();
this.audioformat = readInt();
this.numchannels = readInt();
this.samplerate = readLong();
this.byterate = readLong();
this.blockalign = readInt();
this.bitspersample = readInt();

this.datasubchunk = readString(lendatasubchunk);
if(!datasubchunk.endsWith("data"))
throw new IllegalArgumentException("data miss, " + filename + " is not a wave file.");
this.subchunk2size = readLong();

this.len = (int)(this.subchunk2size/(this.bitspersample/8)/this.numchannels);

this.data = new int[this.numchannels][this.len];

for(int i=0; i<this.len; ++i){
for(int n=0; n<this.numchannels; ++n){
if(this.bitspersample == 8){
this.data[n][i] = bis.read();
}
else if(this.bitspersample == 16){
this.data[n][i] = this.readInt();
}
}
}

issuccess = true;
} catch (Exception e) {
e.printStackTrace();
}
finally{
try{
if(bis != null)
bis.close();
if(fis != null)
fis.close();
}
catch(Exception e1){
e1.printStackTrace();
}
}
}

private String readString(int len){
byte[] buf = new byte[len];
try {
if(bis.read(buf)!=len)
throw new IOException("no more data!!!");
} catch (IOException e) {
e.printStackTrace();
}
return new String(buf);
}

private int readInt(){
byte[] buf = new byte[2];
int res = 0;
try {
if(bis.read(buf)!=2)
throw new IOException("no more data!!!");
res = (buf[0]&0x000000FF) | (((int)buf[1])<<8);
} catch (IOException e) {
e.printStackTrace();
}
return res;
}

private long readLong(){
long res = 0;
try {
long[] l = new long[4];
for(int i=0; i<4; ++i){
l[i] = bis.read();
if(l[i]==-1){
throw new IOException("no more data!!!");
}
}
res = l[0] | (l[1]<<8) | (l[2]<<16) | (l[3]<<24);
} catch (IOException e) {
e.printStackTrace();
}
return res;
}

private byte[] readBytes(int len){
byte[] buf = new byte[len];
try {
if(bis.read(buf)!=len)
throw new IOException("no more data!!!");
} catch (IOException e) {
e.printStackTrace();
}
return buf;
}
}