音频数据
数字化的声音数据
数字化的声音数据就是音频数据。
基本概念
音频
音频是多媒体中的一种重要的媒体,是声音信号的形式。作为一种信息的载体,音频可分为语音、音乐和其它声音三种类型。不同的类型将具有不同的内在特征,这些内在特征可划分为三级,即就是最低层的物理样本级,中间层的声学特征级和最高层的语义级。物理样本级包含的特征有采样频率、时间刻度、样本、格式、编码等;声学特征级包含的特征有感知特征和声学特征,其中感知特征有音调、音高、旋律、节奏等,声学特征包含能量、过零率、LPC 系数及音频的结构化表示等;语义级包括音乐叙事、音频对象描述、语音识别文本等。
数字化声音
传统的声音处理方法是通过话筒等设备把声音的振动转化成模拟的电流, 经过放大和处理, 然后记录到磁带或传至音箱等设备发声。这种方法失真较大, 且消除噪音困难, 也不易被编辑和修改。声音卡的出现解决了模拟方法中存在的问题, 它采用数字化方法来处理声音。数字化的声音数据就是音频数据。
数字化声音的过程实际上就是以一定的频率对来自microphone 等设备的连续的模拟音频信号进行模数转换(ADC)得到音频数据的过程;数字化声音的播放就是将音频数据进行数模转换(DAC)变成模拟音频信号输出。在数字化声音时有两个重要的指标,即采样频率(Sampling Rate)和采样大小(SamplingSize)。采样频率即单位时间内的采样次数, 采样频率越大, 采样点之间的间隔越小, 数字化得到的声音就越逼真, 但相应的数据量增大, 处理起来就越困难;采样大小即记录每次样本值大小的数值的位数, 它决定采样的动态变化范围, 位数越多, 所能记录声音的变化程度就越细腻, 所得的数据量也越大。
常见格式
数字化的声音数据这里称音频数据, 可在内存中被编辑或修改, 也可以文件形式存放在磁盘上, 称为wave 文件, 其扩展名为“ .wav” , 它采用Microsoft 定义的资源互换文件格式(RIFF 格式), 具体结构如图1 。
整个文件可以看成是一个RIFF 块, 该RIFF 块的形式类型为“WAVE” , 共包含了两个子块即“ fmt ” 和“ data”子块。文件的开始4 个字节为字符串“ RIFF” ,接着的4 个字节为RIFF 块的大小, 即“ fmt ” 子块和“ data”子块所占字节之和, 然后的4 个字节是字符串“WAVE” 。“fmt ” 子块的偏移地址为0CH -23H, 开始的4 个字节为字符串“ fmt ” , 接着的4 个字节是“ fmt ”子块的大小, 为10H 或12H ,“ fmt ” 子块的数据为组成PCMWAVEFORMAT 的数据。PCMWAVEFORMAT结构如下:
typedef struct {
WAVEFORM AT wf ;
WORD wBitsPerSample ;//样本值位数
}PCM WAVEFORMAT
typedef struct {
WORD  wFormatT ag ; //WAVE 格式
WORD nChannels ;//声道数
DWO RD nSamplesPerSec ;//采样频率
DWO RD nAvgBytesPerSec;//每秒数据量
WORD nBlockAlig n;//数据块字节数
}WAVEFORMAT ;
当w FormatTag 为WAVE_RORMAT_PCM 时,nBlockAlig n 的值应等于nChannels 和w BitsPerSample之积除以8。“ data” 子块是WAVE 文件中最大的块,开始的4 个字节为字符串“ data” , 然后是音频数据的字节数, 占4 个字节, 最后是数字化的音频数据, 偏移地址从24H 至文件尾。
音频数据处理
音频数据存取
可以用传统的对文件存取的方法将内存缓冲区中录制的音频数据以wave 格式文件的形式存在磁盘上,或将磁盘上wave 文件中音频数据调入内存缓冲区。为了编程方便, 在MMS YSTEM .DLL 中专门提供一组多媒体文件操作函数。如表1 所示。通过表1 的函数也可以很方便地实现打开、读、写和定位RIFF 文件。
音频数据录制
除了使用MCI 指令外, 也可用低层音频函数录制音频数据, 流程如图2。
先检查系统是否有录制音频数据的设备及音频输入设备的性能;如正常则打开音频输入设备, 若操作成功, 则返回音频输入设备句柄,然后调用函数waveI nPrepareHeader 生成WAVE 音频信息头结构WAVEHDR
waveInAddBuffer 函数将从输入设备获得的数据写入WAVEHDR;作完准备工作后开始录音;录音完成后要清除WAVEHDR, 释放内存资源并且还要关闭音频输入设备。打开音频输入设备函数的原型为:
MM RESULT waveInOpen(
LPHWAVEIN phwi , //设备句柄指针
UINT uDeviceID, //设备ID
LPWAVEFORMAT EX pw fx , // 波形格式
DWORD dwCallback , // 回调函数地址
DWORD dwCallbackInstance , //
DWORD fdwOpen // 打开设备的标志
);
pwfx 指向波形格式WAVEFORMATEX 结构, 该结构比前面介绍的WAVEFORMAT 结构多了一个域WORD cbSize, 其值为WAVEFORMATEX 结构的大小。执行该函数时, 需要事先设置pwfx 中各域的值指定格式, uDeviceID 通常设为WAVE_MAPPER。
另外, 录音时, 通常录音的时间是不固定的, 而录音得到的数据量非常大, 合理地使用内存是必须要解决的难题。幸好, 低层音频服务提供了对音频处理的回调机制, 即在打开音频设备时, 可通过指定fdw Open 参数为CALLBACK_FUNCTION 或CALLBACK_WINDOW来指定一个函数或窗口作为回调对象, dxCallback参数说明回调对象句柄或函数地址, 设备驱动程序不断向回调对象发送消息, 通知音频数据的处理状态。
为了合理使用内存, 通常是在内存中定义一个能存放100MS 音频数据的缓冲区, 每当该缓冲区录满数据时, 驱动程序就向回调对象即指定的窗口或回调函数分别发WM_WIM_DATA 消息或WIM_DATA 消息,由回调对象将音频数据缓冲区中的数据取走存放到另一个地方。当执行关闭音频设备函数时, 驱动程序向回调窗口发送MM_WIM_C LOSE 消息, 或向回调函数发送WIM_CLOSE 消息, 由回调对象负责释放内存资源, 并且如果需要, 即将所录制的音频数据存入磁盘。
音频数据播放
音频数据的播放比录制要简单, 过程非常相似, 部分低层音频播放函数如表2。
待播放的音频数据一般有两种来源, 要么来自wave 文件, 要么是应用程序刚录制的音频数据。如果是前者, 那么, 播放非常简单,Windows 提供了一个高层的音频数据播放函数Play Sound(), 该函数能播放由给定的文件名、资源或系统事件所声明的波形声音, 如果播放成功, 返回TRUE;否则返回FALSE, 其原型为:
BOOL P laySound (
LPCSTR pszSound , // 声音名称
HM ODU LE hmod , // 模块句柄
DWO RD fdwSound //播放标志
);
pszSound 指定播放的声音, 如果为NULL, 则将停止当前正在播放的声音。Fdw Sound 说明播放声音的方式, 当其为SND_SYNC 时, 同步播放声音, 即声音播放完后才返回;当其为SND_ASYNC 时异步播放声音。如果音频数据是位于内存中, 则需要用表2 中介绍的低层音频函数进行播放。
过程与录制时非常相似, 也要先检查播放设备是否存在及其性能, 打开播放设备, 生成WAVE 音频信息头数据块WAVEHDR, 调用函数waveOutWrite 将WAVEHDR 数据写入输出设备, 进行播放;播放结束后, 也需释放分配的资源和关闭音频输出设备。
音频数据空间特征模型
音频特征模型要求感知上直观、物理意义明确;支持尽可能多的应用;特征元素容易取得。因此,在构建空间特征模型时,尽可能选择彼此正交的特征以降低特征空间的维,同时能够保留最多的信息量
提出
文献中对音频提出了9 种描述方案,分别是:ScaIeTree,音频描述框架,AudioSegment,静声,会话内容,音色,声音效果,旋律轮廓,其它处于CE 阶段的描述方案。这些描述方案中前三种是比较通用的,后面的一些描述方案适用于特定的场合。例如音频描述框架是低级音频描述符的集合。
文献中提到的“ 基于信号统计的匹配”和“ 基于变换的索引”,并采用了短时Fourier 变换或窗口Fourier 变换作为索引的方法,同时提到用MatIab 中的小波变换函数产生音频数据索引的方法。用MatIab 中的小波变换函数进行实验表明,用这种方法产生的索引,其检索精度依然很低。
空间特征模型
利用小波分析的方法提取波形声音信号的小波近似系数,并在这些小波系数的基础之上构建了下述的音频空间特征模型,产生音频数据索引。
音频特征 =(六级近似小波系数,平均幅度,过零率,最好基)
公式定义的音频空间特征模型中包含四种元素,分别是六级近似小波系数,平均幅度,过零率和最好基。
视音频数据处理
捕获
VFW(Video tor Windows,简称vFw)是微软为开发人员提供的专门用于视频捕获、视频编辑和视频播放的软件开发工具。VFW的AVICAP模块主要用于视频图像和音频数据的捕获。利用该模块的AVIcap窗口类创建捕获窗口。如果捕获窗口与视频采集设备驱动程序连接,捕获窗口的客户区用于显示采集设备捕获的实时视频图像。视频图像有OverLay和Pre—view两种显示模式:在OverLay模式下,实时图像直接由采集设备传至显存中,不占用CPU资源,显示速度较快;在Preview模式下,实时图像由采集设备传至系统内存,此时可对图像数据进行压缩、编辑和传输等操作,然后显示图像。如果捕获窗口与音频录入设备驱动程序连接,捕获窗口调用低层音频服务进行波形音频的捕获。
在进行音频数据捕获之前,应用程序只需指定音频数据缓冲区的大小和个数,当缓冲区录制满数据时,驱动程序通过发送消息等方式通知应用程序,应用程序就可以对捕获的数据进行各种处理。AVIcap窗口提供的各种消息对应着驱动程序相应的接口函数,应用程序若控制视音频采集设备的驱动程序,只需调用AVICAP模块中的消息宏函数向AVIcap窗口发出信息,由AVIcap窗口调用设备驱动程序自动完成指定的操作。
回放
音频数据的回放采用MDK提供的与设备无关的音频函数。回放时,应用程序将1个数据缓冲区提交给播放设备驱动程序,当驱动程序播放数据完毕时,就通过应用程序查询、触发事件或驱动程序发送消息等方式通知应用程序,应用程序再次提交1个数据缓冲区给驱动程序,如此循环。回放音频数据时,应根据实际情况设定多个数据缓冲区,否则当设备驱动程序播放完毕返回此缓冲区,应用程序在准备此缓冲区期间,驱动程序处于等待状态.这将会出现声音断续。
音频数据的回放包括以下几个步骤:①WaveOutOpen()用于打开波形数据回放设备,指定回放的波形数据的格式,设置设备驱动程序完成指定动作后通知应用程序的方法,通常情况下有驱动程序发送消息给指定窗口、回调函数、线程和事件等四种方法;②WaveOutPre—pareHeader()为波形播放设备准备回放缓冲区和数据,并设置数据长度、数据地址和各种标志等;③WaveOutWrite()将波形数据发送给播放设备,当设备驱动程序完成数据回放后,将按照WaveOutOpen()指定的方式通知应用程序,由应用程序进行下一步处理;④当音频数据块回放完毕后,由WaveOutUnPrepareHeader()清除WaveOutPrepareHeader()准备的数据缓冲区;⑤若停止回放,应先调用WaveOutReset()将所有的数据块标志设置为回放完毕并返回应用程序,再调用WaveOutClose()关闭渡形数据播放设备。
压缩和解压缩
通过ACM实现音频数据的实时压缩、解压缩等功能时,基本包括几个步骤:①通过acre—DriverEnum()和acmFormatEnum0函数遍历系统提供的音频压缩解压缩器,可根据不同的需要获取指定音频压缩懈压缩器的句柄;②根据遍历结果,利用获得的句柄使用aCE—DriverOpen()打开指定音频压缩解压缩器驱动程序.若函数成功将获得用于与压缩解压缩器通信的事例指针;⑧指定输入、输出的音频格式使用acmStreamOpen()打开选取的ACM转换流;④acmStreamPrepareHeader()为音频数据的压缩和解压缩提供信息头,信息头包括源数据的长度,源数据和目标数据的地址等信息;⑤调用acmStreamConvcrt()函数完成音频数据的压缩解压缩,在调甩acmStreamConvert()时可以指定回调函数,以便在转换过程中显示进度等信息;⑥音频数据压缩解压缩完毕后,应用程序可以将缓冲区中的数据写入文件、进行网络传输或回放等操作.最后通过acmStreamClose()和aemDriverC[ose()函数关闭转换流和驱动程序。
参考资料
最新修订时间:2022-08-25 12:53
目录
概述
基本概念
参考资料