将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 实现数据预览。
实现这个功能也挺简单的,具体的步骤:
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 实现数据预览。
相关文章推荐
- 音频文件解析(一):WAV格式文件头部解析
- wav格式与PCM格式的关系,pcm格式数据播放设置参数解析
- MMIO----Wav格式文件解析
- python——pcm音频添加头转成Wav格式文件
- DOM解析XML文件
- android之sax解析xml文件 .
- 阿里云 云解析使用方法/在阿里云ESC服务器解析域名并绑定服务器IP后上传文件通过域名访问步骤教程
- linux用户文件解析
- 酷狗 KRC 文件的解析
- C++使用static的错误:无法解析的外部符号、“static”不应在文件范围内定义的成员函数上使用
- vs2010自动生成的文件解析
- gflags解析命令行参数, glog输出日志文件
- android-webview无法解析网页中的mjpeg文件的解决办法
- 用ObjectRepositoryUtil动态加载和解析QTP对象库文件
- Linux文件权限的解析
- Linux下的ELF可执行文件的格式解析 (转)
- D_D系统构建-MBR(6)加载loader文件代码MBR解析
- JAXP技术解析XML文件
- 黑马程序员--Java基础加强--09.【MyEclipse的class文件所在的目录配置】【相对路径解析】【个人总结】
- [QA]UrlRewriter无法解析实际存在的htm文件