下面是一个网上一个大神写的,在公司测过了,还不错.
还可以写一个构造函数:
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-23import 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或者16bitpublic 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;} }