publicAudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes, int mode)throws IllegalArgumentException {
thrownewRuntimeException("Stub!");
public class WavFileHeader {
public static final int WAV_FILE_HEADER_SIZE = 44;
public static final int WAV_CHUNKSIZE_EXCLUDE_DATA = 36;
public static final int WAV_CHUNKSIZE_OFFSET = 4;
public static final int WAV_SUB_CHUNKSIZE1_OFFSET = 16;
public static final int WAV_SUB_CHUNKSIZE2_OFFSET = 40;
public String mChunkID = "RIFF";
public int mChunkSize = 0;
public String mFormat = "WAVE";
public String mSubChunk1ID = "fmt ";
public int mSubChunk1Size = 16;
public short mAudioFormat = 1;
public short mNumChannel = 1;
public int mSampleRate = 8000;
public int mByteRate = 0;
public short mBlockAlign = 0;
public short mBitsPerSample = 8;
public String mSubChunk2ID = "data";
public int mSubChunk2Size = 0;
public WavFileHeader() {
public WavFileHeader(int sampleRateInHz, int channels, int bitsPerSample) {
mSampleRate = sampleRateInHz;mBitsPerSample = (short) bitsPerSample;mNumChannel = (short) channels;mByteRate = mSampleRate * mNumChannel * mBitsPerSample / 8;mBlockAlign = (short) (mNumChannel * mBitsPerSample / 8);
使用 InputStream 将 Wav 文件转成流
public class WavFileReader {
private static final String TAG = WavFileReader.class.getSimpleName();
private DataInputStream mDataInputStream;
private WavFileHeader mWavFileHeader;
public boolean openFile(String filepath) throws IOException {
if (mDataInputStream != null) {
closeFile();
mDataInputStream = new DataInputStream(new FileInputStream(filepath));
return readHeader();
public void closeFile() throws IOException {
if (mDataInputStream != null) {
mDataInputStream.close();
mDataInputStream = null;
public WavFileHeader getmWavFileHeader() {
return mWavFileHeader;
public int readData(byte[] buffer, int offset, int count) {
if (mDataInputStream == null || mWavFileHeader == null) {
return -1;
try {
int nbytes = mDataInputStream.read(buffer, offset, count);
if (nbytes == -1) {
return 0;
return nbytes;
} catch (IOException e) {
e.printStackTrace();
return -1;
private boolean readHeader() {
if (mDataInputStream == null) {
return false;
WavFileHeader header = new WavFileHeader();
byte[] intValue = new byte[4];
byte[] shortValue = new byte[2];
try {
header.mChunkID = "" + (char) mDataInputStream.readByte() + (char) mDataInputStream.readByte() + (char) mDataInputStream.readByte() + (char) mDataInputStream.readByte();
Log.d(TAG, "Read file chunkID:" + header.mChunkID);
mDataInputStream.read(intValue);
header.mChunkSize = byteArrayToInt(intValue);
Log.d(TAG, "Read file chunkSize:" + header.mChunkSize);
header.mFormat = "" + (char) mDataInputStream.readByte() + (char) mDataInputStream.readByte() + (char) mDataInputStream.readByte() + (char) mDataInputStream.readByte();
Log.d(TAG, "Read file format:" + header.mFormat);
header.mSubChunk1ID = "" + (char) mDataInputStream.readByte() + (char) mDataInputStream.readByte() + (char) mDataInputStream.readByte() + (char) mDataInputStream.readByte();
Log.d(TAG, "Read fmt chunkID:" + header.mSubChunk1ID);
mDataInputStream.read(intValue);
header.mSubChunk1Size = byteArrayToInt(intValue);
Log.d(TAG, "Read fmt chunkSize:" + header.mSubChunk1Size);
mDataInputStream.read(shortValue);
header.mAudioFormat = byteArrayToShort(shortValue);
Log.d(TAG, "Read audioFormat:" + header.mAudioFormat);
mDataInputStream.read(shortValue);
header.mNumChannel = byteArrayToShort(shortValue);
Log.d(TAG, "Read channel number:" + header.mNumChannel);
mDataInputStream.read(intValue);
header.mSampleRate = byteArrayToInt(intValue);
Log.d(TAG, "Read samplerate:" + header.mSampleRate);
mDataInputStream.read(intValue);
header.mByteRate = byteArrayToInt(intValue);
Log.d(TAG, "Read byterate:" + header.mByteRate);
mDataInputStream.read(shortValue);
header.mBlockAlign = byteArrayToShort(shortValue);
Log.d(TAG, "Read blockalign:" + header.mBlockAlign);
mDataInputStream.read(shortValue);
header.mBitsPerSample = byteArrayToShort(shortValue);
Log.d(TAG, "Read bitspersample:" + header.mBitsPerSample);
header.mSubChunk2ID = "" + (char) mDataInputStream.readByte() + (char) mDataInputStream.readByte() + (char) mDataInputStream.readByte() + (char) mDataInputStream.readByte();
Log.d(TAG, "Read data chunkID:" + header.mSubChunk2ID);
mDataInputStream.read(intValue);
header.mSubChunk2Size = byteArrayToInt(intValue);
Log.d(TAG, "Read data chunkSize:" + header.mSubChunk2Size);
Log.d(TAG, "Read wav file success !");
} catch (Exception e) {
e.printStackTrace();
return false;
mWavFileHeader = header;
return true;
private static short byteArrayToShort(byte[] b) {
return ByteBuffer.wrap(b).order(ByteOrder.LITTLE_ENDIAN).getShort();
private static int byteArrayToInt(byte[] b) {
return ByteBuffer.wrap(b).order(ByteOrder.LITTLE_ENDIAN).getInt();
publicclassAudioPlayer {
privatestaticfinalStringTAG="AudioPlayer";
privatestaticfinalintDEFAULT_STREAM_TYPE= AudioManager.STREAM_MUSIC;
privatestaticfinalintDEFAULT_SAMPLE_RATE=44100;
privatestaticfinalintDEFAULT_CHANNEL_CONFIG= AudioFormat.CHANNEL_OUT_MONO;
privatestaticfinalintDEFAULT_AUDIO_FORMAT= AudioFormat.ENCODING_PCM_16BIT;
privatestaticfinalintDEFAULT_PLAY_MODE= AudioTrack.MODE_STREAM;
privatevolatilebooleanmIsPlayStarted=false;
private AudioTrack mAudioTrack;
publicbooleanstartPlayer() {
return startPlayer(DEFAULT_STREAM_TYPE, DEFAULT_SAMPLE_RATE, DEFAULT_CHANNEL_CONFIG, DEFAULT_AUDIO_FORMAT);
publicbooleanstartPlayer(int streamType, int sampleRateInHz, int channelConfig, int audioFormat) {
if (mIsPlayStarted) {
Log.e(TAG, "Player already started !");
returnfalse;
intbufferSizeInBytes= AudioTrack.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
if (bufferSizeInBytes == AudioTrack.ERROR_BAD_VALUE) {
Log.e(TAG, "Invalid parameter !");
returnfalse;
Log.i(TAG, "getMinBufferSize = " + bufferSizeInBytes + " bytes !");
mAudioTrack = newAudioTrack(streamType, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes, DEFAULT_PLAY_MODE);
if (mAudioTrack.getState() == AudioTrack.STATE_UNINITIALIZED) {
Log.e(TAG, "AudioTrack initialize fail !");
returnfalse;
mIsPlayStarted = true;
Log.i(TAG, "Start audio player success !");
returntrue;
publicvoidstopPlayer() {
if (!mIsPlayStarted) {
return;
if (mAudioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {
mAudioTrack.stop();
mAudioTrack.release();
mIsPlayStarted = false;
Log.i(TAG, "Stop audio player success !");
publicbooleanplay(byte[] audioData, int offsetInBytes, int sizeInBytes) {
if (!mIsPlayStarted) {
Log.e(TAG, "Player not started !");
returnfalse;
if (mAudioTrack.write(audioData, offsetInBytes, sizeInBytes) != sizeInBytes) {
Log.e(TAG, "Could not write all the samples to the audio device !");
mAudioTrack.play();
Log.d(TAG, "OK, Played " + sizeInBytes + " bytes !");
returntrue;