您的位置:首页 > 其它

将WAV格式文件解析成PCM文件

2017-12-21 08:09 519 查看
要想解析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 实现数据预览。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息