其实这个是我自己对WAV头文件没有理解对,应该早就解决了的。
看图
WAV文件头信息由大小44个字节的数据组成:
- 4字节数据,内容为“RIFF”,表示资源交换文件标识
- 4字节数据,内容为一个整数,表示从下个地址开始到文件尾的总字节数
- 4字节数据,内容为“WAVE”,表示WAV文件标识
- 4字节数据,内容为“fmt ”,表示波形格式标识(fmt ),最后一位空格。
- 4字节数据,内容为一个整数,表示PCMWAVEFORMAT的长度
- 2字节数据,内容为一个短整数,表示格式种类(值为1时,表示数据为线性PCM编码)
- 2字节数据,内容为一个短整数,表示通道数,单声道为1,双声道为2
- 4字节数据,内容为一个整数,表示采样率,比如44100
- 4字节数据,内容为一个整数,表示波形数据传输速率(每秒平均字节数),大小为 采样率 * 通道数 * 采样位数
- 2字节数据,内容为一个短整数,表示DATA数据块长度,大小为 通道数 * 采样位数
- 2字节数据,内容为一个短整数,表示采样位数,即PCM位宽,通常为8位或16位
- 4字节数据,内容为“data”,表示数据标记符
- 4字节数据,内容为一个整数,表示接下来声音数据的总大小
因此在我们要播放WAV格式文件有爆音时,就去除这44个头文件自己即可。
以下是代码片段(之前文章有全部代码)
/**
* start play
*
* @param soundID
*/
public void play(final int soundID) {
if (soundID < 0 || soundID > MAX_SOUMD_NUM - 1) {
Log.d(TAG, "-----Error Sound ID---:" + soundID);
return;
}
initPlaySoundS(soundID);
int bufSize = android.media.AudioTrack.getMinBufferSize(SAMPLERATEINHZ,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);
/**
* streamType:音频流类型
* sampleRateInHz:採样率
* channelConfig:音频声道
* audioFormat:音频格式
* bufferSizeInBytes缓冲区大小:
* mode:音频数据载入模式
*/
audioTrack = new AudioTrack(AudioManager.STREAM_NOTIFICATION,
SAMPLERATEINHZ, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, bufSize,
AudioTrack.MODE_STREAM);
audioTrack.flush();
//去除wav头文件字节
newAudioData = Arrays.copyOfRange(audioData, 44, audioData.length);
new Thread(new Runnable() {
@Override
public void run() {
if (audioTrack != null) {
try {
audioTrack.play();
audioTrack.write(newAudioData, 0, newAudioData.length);
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
Log.d(TAG, "Playing");
return;
}
我们就只增加一行(红色代码)就完美解决了,这个只能说是我对wav的头文件不太了解导致的。
历史上的今天
暂无评论...
随机推荐
Android动画之帧动画(Frame动画)
Android动画View Animation 视图动画(Tween Animation 补间动画),只能用来设置View的动画Drawable Animation 帧动画(Frame动画),一帧帧地显示资源文件中的DrawableProperty Animation 属性动画,在andr...
Android Studio快捷键记录
在使用编译器时,很多人喜欢改变编译器的一些快捷键以便适应以前的习惯(以前我也是这样,后来发现换电脑或者环境后得耗时间重新配置,麻烦),但个人觉得不太好.如果编译器崩溃了或者换电脑了,您又得重新设置一遍...当然,萝卜青菜,各有所爱.只要自己喜欢怎样折腾都是好的!当然,Android Studio...
Android Button 字母自动变大写记录
前言开发中,Button控件的Text 自动转为大写字母,这里记录一下,方便自己查询。好记性不如烂笔头正文字母自动变大写的原因只要我们用的Theme是Material或API Level 21+的默认 Theme,Button上的Text默认就是大写。解决方式第一种方法在Xml中的...
Android启动之冷、热和暖启动简介
前言记录一下应用的冷启动、热启动和暖启动。正文冷启动程序重头开始,程序重来没有创建进程。一般出现情况:程序按照成功后第一次启动程序被系统kill后再次打开热启动程序还驻留在内存中(存在后台中),再次被系统重新冲后台启动到前台,此时是不会重新加载xml和初始化。类似于Activi...
常见的文件头或文件尾十六进制表示
前言最近在加载图片时,由于需要对不同图片使用不同的加载方式,因此需要通过判断图片的类型进行条用不同的接口。因此摘抄于此,以便查阅。正文下面的文件头或文件尾都是用十六进制表示的。JPEG (jpg)文件头:FFD8FF文件尾:FFD9PNG (png)文件头:89504E47文件尾...
720P、1080P、2K、4K的简介
前言简单记录一下720P(高清)、1080i 、1080P(全高清)、2K、4K相关内容。正文一、分辨率后缀的含义PP, 是Progressive的缩写, 表示逐行扫描720P,1080P等,表示的是“视频像素的总行数”,比如,720P表示视频有720行的像素,而1080P则表示视频总共...