下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android音频开发(4):如何存储和解析wav文件
无论是文字、图像还是声音,都必须以一定的格式来组织和存储起来,这样播放器才知道以怎样的方式去解析这一段数据,例如,对于原始的图像数据,我们常见的格式有YUV、Bitmap,而对于音频来说,最简单常见的格式就是wav格式了。wav格式,与bitmap一样,都是微软开发的一种文件格式规范,它们都有一个相似之处,就是整个文件分为两部分,第一部分是“文件头”,记录重要的参数信息,对于音频而言,就包括:采样率、通道数、位宽等等,对于图像而言,就包括:图像的宽高、色彩位数等等;第二部分是“数据块”,即一帧一帧的二进制数据,对于音频而言,就是原始的PCM数据;对于图像而言,就是RGB数据。前面几篇文章讲了如何利用Android平台的API完成原始音频信号的采集和播放,而本文则重点关注如何在Android平台上,将采集到的PCM音频数据保存到wav文件,同时,也介绍如何读取和解析wav文件。而文章最后,我还会给出一段AudioDemo程序,该程序将最近的几篇文章涉及到的代码综合起来了,演示了一个完整的Android音频从采集到播放的全过程。下面言归正传,讲讲如何读写wav文件格式。1.文件头首先,我们了解一下wav格式的“文件头”,可以参考这篇文章:《WAVEPCMsoundfileformat》我们可以简单地分析一下这个wav格式头,它主要分为三个部分:第一部分,属于最“顶层”的信息块,通过“ChunkID”来表示这是一个“RIFF”格式的文件,通过“Format”填入“WAVE”来标识这是一个wav文件。而“ChunkSize”则记录了整个wav文件的字节数。第二部分,属于“fmt”信息块,主要记录了本wav音频文件的详细音频参数信息,例如:通道数、采样率、位宽等等(含义请参考我的第一篇文章《Android音频开发(1):基础知识》)第三部分,属于“data”信息块,由“Subchunk2Size”这个字段来记录后面存储的二进制原始音频数据的长度。分析到这里,我想大家应该就明白了,其实,做一种多媒体格式的解析,也不是一件特别复杂的事,说白了,格式就是一种规范,告诉你,我的二进制数据是怎么存储的,你应该按照什么样的方式来解析。具体而言,我们可以定义一个如下的Java类来抽象和描述wav文件头:/*
*
COPYRIGHT
NOTICE
*
Copyright
(C)
2016,
Jhuster
<lujun.hust@>
*
/Jhuster/AudioDemo
*
*
@license
under
the
Apache
License,
Version
2.0
*
*
@file
WavFileHeader.java
*
*
@version
1.0
*
@author
Jhuster
*
@date
2016/03/19
*/
package
com.jhuster.audiodemo.api;
public
class
WavFileHeader
{
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
bitsPerSample,
int
channels)
{
mSampleRate
=
sampleRateInHz;
mBitsPerSample
=
(short)bitsPerSample;
mNumChannel
=
(short)channels;
mByteRate
=
mSampleRate*mNumChannel*mBitsPerSample/8;
mBlockAlign
=
(short)(mNumChannel*mBitsPerSample/8);
}
}具体每一个字段的含义,可以参考我上面给出的链接,下面我们再看看如何读写wav文件。2.读写wav文件文章开头已经说过,其实说白了,wav文件就是一段“文件头”+“音频二进制数据”,因此:(1)写wav文件,其实就是先写入一个wav文件头,然后再继续写入音频二进制数据即可(2)读wav文件,其实也就是先读一个wav文件头,然后再继续读出音频二进制数据即可那么,在动手写代码之前,有两点你需要搞清楚:(1)wav文件头中,有哪些是“变化的”,哪些是“不变的”?比如:文件头开头的“RIFF”字符串就是“不变的”部分,而用来记录音频数据总长度的“Subchunk2Size”变量就是属于“变化的”部分,因为,再音频数据没有彻底全部写完之前,你是无法知道一共写入了多少字节的音频数据的,因此,这个部分,需要用一个变量记录起来,到全部写完之后,再使用Java的“RandomAccessFile”类,将文件指针跳转到“Subchunk2Size”字段,改写一下默认值即可。(2)如何把int、short变量与byte[]的转换因为wav文件都是二进制的方式读写,因此,“WavFileHeader”类中定义的变量都需要转换为byte字节流,具体转换方法如下:private
static
byte[]
intToByteArray(int
data)
{
return
ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(data).array();
}
private
static
byte[]
shortToByteArray(short
data)
{
return
ByteBuffer.allocate(2).order(ByteOrder.LITTLE_ENDIAN).putShort(data).array();
}
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();
}关于wav文件读写的类我已经帮大家“封装”好了,并且结合着前面几篇文章给出的音频采集和播放的代码,完成了一个AudioDemo程序,放在我的Github上了,欢迎大家下载运行测试,然后结合着代码具体学习Android
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年湖南永州江永县引进急需紧缺医卫专业人才高频500题难、易错点模拟试题附带答案详解
- 2024年湖南株洲市发展和改革委员会招聘10人历年高频500题难、易错点模拟试题附带答案详解
- 2024年湖南怀化市自然资源规划设计测绘院招聘20人历年高频500题难、易错点模拟试题附带答案详解
- 2024年湖南张家界市武陵源区引进急需紧缺人才11人高频500题难、易错点模拟试题附带答案详解
- 2024年湖南常德市石门县部分事业单位招聘91人历年高频500题难、易错点模拟试题附带答案详解
- 2024年湖南岳阳平江县事业单位招聘专业技术人员168人历年高频500题难、易错点模拟试题附带答案详解
- 2024年湖北黄石阳新县企事业单位招聘研究生和“双一流”建设高校(学科)本科生90人历年高频500题难、易错点模拟试题附带答案详解
- 2024年湖北黄冈黄梅县政务服务和大数据管理局招聘12人高频500题难、易错点模拟试题附带答案详解
- 2024年湖北黄冈市城管执法委所属事业单位市园林绿化管理处招聘3人高频500题难、易错点模拟试题附带答案详解
- 2024年湖北襄阳老河口市事业单位招聘170人历年高频500题难、易错点模拟试题附带答案详解
- GMI地应力分析及钻井优化设计
- 医疗器械经营质量管理制度pd
- 票据业务案例分析
- GB∕T 17445-2022 铸造磨球(高清最新版)
- 中国地理经典空白图
- 土方碾压试验方案02269
- 承插型盘扣式钢管脚手架验收表
- 郑州大学远程教育《综合性实践环节作业》
- 逆商-人生成败的关键
- 新建排洪渠工程-施工难点与对策及施工质量保证体系(纯方案,8页)
- 公路工程竣(交)工验收办法实施细则-65号文.doc
评论
0/150
提交评论