要想解析WAV檔案就需要了解WAV檔案的結構,我在上一文中簡單介紹過這方面的知識點。大家有興趣可以點選打開連結
實作這個功能也挺簡單的,具體的步驟:
1.讀取WAV檔案的頭部,擷取一些重要的資訊,比如采樣率,聲道數,量化精度等等。
2.讀取WAV檔案的資料塊,就是PCM資料
DataInputStream dataInputStream = null;
getWav = new File(file, "audiotest.wav");
byte[] bytes = new byte[4];
byte[] shortBytes = new byte[2];
步驟一代碼實作:
try {
dataInputStream = new DataInputStream(new BufferedInputStream(new FileInputStream(getWav)));
chunkID = "" + (char) dataInputStream.readByte() + (char) dataInputStream.readByte() + (char) dataInputStream.readByte() + (char) dataInputStream.readByte();
dataInputStream.read(bytes);
chunkSize = byteArrayToInt(bytes);
format = "" + (char) dataInputStream.readByte() + (char) dataInputStream.readByte() + (char) dataInputStream.readByte() + (char) dataInputStream.readByte();
subChunk1ID = "" + (char) dataInputStream.readByte() + (char) dataInputStream.readByte() + (char) dataInputStream.readByte() + (char) dataInputStream.readByte();
dataInputStream.read(bytes);
subChunk1Size = byteArrayToInt(bytes);
dataInputStream.read(shortBytes);
audioFormat = byteArrayToShort(shortBytes);
dataInputStream.read(shortBytes);
numChannels = byteArrayToShort(shortBytes);
dataInputStream.read(bytes);
sampleRate = byteArrayToInt(bytes);
dataInputStream.read(bytes);
byteRate = byteArrayToInt(bytes);
dataInputStream.read(shortBytes);
blockAlign = byteArrayToShort(shortBytes);
dataInputStream.read(shortBytes);
bitsPerSample = byteArrayToShort(shortBytes);
subChunk2ID = "" + (char) dataInputStream.readByte() + (char) dataInputStream.readByte() + (char) dataInputStream.readByte() + (char) dataInputStream.readByte();
dataInputStream.read(bytes);
subChunk2Size = byteArrayToInt(bytes);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
步驟二代碼實作:
try {
bufferSizeOfPcm = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_MONO, mAudioFormat);
pcmAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_MONO, mAudioFormat, bufferSizeOfPcm, AudioTrack.MODE_STREAM);
byte[] bs = new byte[bufferSizeOfPcm];
pcmAudioTrack.play();
byte[] buffer = new byte[1024 * 2];
while (true && dataInputStream.read(buffer,0,buffer.length) > 0) {
pcmAudioTrack.write(buffer, 0, buffer.length);
}
} catch (IOException e) {
e.printStackTrace();
}
使用了AudioTrack來播放。
站在巨人的肩膀上
如何存儲和解析wav檔案
請多多指點
接下來一篇文章我會将帶來 Camera + SurfaceView ,Camera + TextureView 實作資料預覽。