WINDOWS下对音频的处理过程
WINDOWS下对音频的处理,大致可分为两部分,即音频的输入、输出,和ACM压缩处理。

  一般情况下在WINDOWS下可以调用诸如sndPlaySound等API(MCI)来播放一个WAV文件,但那显然不是我们需要做的。必须能够直接对音频数据流进行处理。在WINDOWS下,也为之提供了一系列的API,以waveIn和waveOut开头的一组API就是干这个的。

  先说输入吧。常用的相关API为waveInOpen(打开一个音频输入设备)、waveInPrepareHeader(为一个即将在waveInAddBuffer中调用的输入缓冲区准备头部)、waveInAddBuffer(添加一个输入用的数据缓冲区)、 waveInStart(开始录音)、waveInClose(关闭音频输入设备)等几个,以及需要在waveInOpen中指定的一个回调函数或者线程,其作用是在一个数据缓冲区被录满后被调用,以对这些数据进行处理,和其他一些相关的操作。

  首先你得确定一下需要用什么回调方式,即在某个时间片的音频数据被录完后,Windows将通过这个回调来激活对这些数据的处理过程,一般用到的无非是FUNCTION、THREAD和EVENT这几类,而比较方便简单的就是FUNCTION和THREAD了。FUNCTION方式是指Windows会调用你这个函数,而THREAD则是由 Windows来激活你所指定的线程。这些都在waveInOpen中指定。其函数原型为:

MMRESULT waveInOpen( LPHWAVEIN phwi,
UINT uDeviceID,
LPWAVEFORMATEX pwfx,
DWORD dwCallback,
DWORD dwCallbackInstance,
DWORD fdwOpen
);

  其中:phwi是返回的句柄存放地址,uDeviceID是要打开的音频设备ID号,一般都指定为WAVE_MAPPER。 dwCallback则为指定的回调函数或线程等的地址,fdwOpen指定回调方式,dwCallbackInstance为需要向回调 函数或线程送入的用户参数。至于那个pwfx,则比较关键,它指定了要以什么音频格式打开音频输入设备, 它是一个结构WAVEFORMATEX:
typedef struct { WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
WORD cbSize;
} WAVEFORMATEX;
  机器上的WIN9X安装时选择了音频压缩,可以在wFormatTag中指定一些压缩的音频格式,如G723.1,TURE DSP,等之类。不过一般都是选用WAVEFORMAT_PCM格式,即未压缩的音频格式,至于压缩,可以在录完后调用下面将要谈到的ACM单独进行。
  nChannels为声道数,1或者2。nSamplesPerSec为每秒采样数,8000、11025、22050、44100为几个标准值,其他的非标准值我倒没试过行不行。nAvgBytesPerSec为每秒平均的字节数,在PCM方式中就等于nChannels*nSamplesPerSec*wBitsPerSample/8,但对于其它的压缩的音频格式,由于很多压缩方式是按时间片进行的,如G723.1,就是以30ms为一个压缩单位,这样,nAvgBytesPerSec只是一个大概的数字,并不准确,程序中的计算是不应该以这个量为准的。这一点在下面的压缩音频输出和ACM音频压缩中非常重要。nBlockAlign是一个比较特殊的值,表示对音频处理时的最小处理单位,对于PCM非压缩,它就是wBitsPerSample*nChannels/8,而对于非压缩格式,则表示压缩/解压处理的最小单位了,如G723.1,就是30ms的数据大小(20bytes或者24bytes)。wBitsPerSample就是每采样值的位数,8或者16。 cbSize则是表示该WAVEFORMATEX的结构在标准的头部之后还有多少字节数,对于很多非PCM的音频格式,有一些自己的定义格式参数,这些就紧跟在标准的WAVEFORMATEX后面,其大小就由cbSize指定。对于PCM格式而言,为0,或者忽略不检查。

  这样,指定了这些参数后,你应该就能够打开音频输入设备了。下面要做的事情就是准备几个用做录音的缓冲区。常准备多个缓冲区,并在回调中循环使用。另外,还得考虑好录得的音频数据放哪儿,比如一个临时文件,就得准备好文件的句柄。对于缓冲区,得使用waveInPerpareHeader准备一下头部,这个API比较简单,如果你是循环使用缓冲区,对每个缓冲区也只需要调用一次waveInPrepareHeader。

  一切准备好之后,就可以调用waveInAddBuffer和waveInStart开始录音了,只要你一调用这个waveInStart,录音就开始了,即使这个缓冲区录满之后你没有加入新的缓冲区进去,录音也不会停,只是这中间的语音数据全都丢了。当通过 waveInAddBuffer送入的缓冲区被录满后,Windows就会通过你在waveInOpen中指定的方式进行回调,在回调中把录好的语音数据取出来,并且,如果还想继续录音的话,得将下一个缓冲区添加进去。考虑到这个处理是有时间延迟的,而且音频对时间很敏感,一般都要先预加入若干个缓冲区,比如,一共定义了8个缓冲区,而为了保险起见,最好保证任一时刻至少有3个缓冲区可被录音使用,那么在开始录音时,则先加入4个缓冲区,然后在回调中,如果当前录好的缓冲区第n个,则对第(n+4)%8调用waveInAddBuffer,这时,还有第(n+1)%8,(n+2)%8, (n+3)%8这三个缓冲区可用,即基本上就可以保证所录得音频中不会有断开的间隔。

  想结束录音时,最好在waveInClose之前调用一下waveInReset,这样可以清掉尚在等待录音的缓冲区,同时在回调中还必须注意一下送入参数中的消息种类。

  音频输出部分相对简单一点。对应的API有waveOutOpen、waveOutPrepareHeader、waveOutWrite以及waveOutClose。如果希望直接输出压缩格式的音频的话,必须注意waveOutOpen中指定的音频格式参数。你必须很清楚这类格式的具体参数及其含义。不过,你可以通过下面说到的ACM(Audio Compress Manager)得到你需要的音频格式的具体参数,这个格式参数可以直接用于waveOutOpen。如同音频的输入,waveOutPrepareHeader也是必需的。waveOutWrite 则是填入输出缓冲区,为了避免间断,也应该保证某一时刻缓冲区队列中数目足够。

  如果安装WIN98时在附件中选择了音频压缩,那么机器上的ACM就可用了。ACM为Audio Compress Manager。 WIN98提供了一些常用的音频压缩算法程序包,供用户调用。可以通过ACM获得本机上所有的音频压缩驱动及其所支持的音频格式。不过,似乎不是每种ACM格式都能被调用来进行压缩,不过ACM中的压缩驱动大多都是针对语音频段,如果用来压缩频带较宽的音频,如音乐,则效果很差.

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/WhiteCloud/archive/2001/08/17/12641.aspx

WINDOWS下对音频的处理过程(转)相关推荐

  1. python playsound安装_ python音频库:Windows下pydub安装配置、过程出现的问题及常用API ...

    < python音频库:Windows下pydub安装配置.过程出现的问题及常用API > 背景 刚从B站上看过倒放挑战之后也想体验下,心血来潮一个晚上完成了基本的实现.其中倒放与播放部分 ...

  2. oracle安装显示注册表,windows下oracle 11g r2 安装过程与卸载详细图解

    Oracle 11g安装 1.解压下载的包,然后进入包内,点击setup.exe开始安装 . 2.出现如下:一般把那个小对勾取消,点击下一步进行, 弹出下图这个后点'是' 3.下图后,选择创建和配置数 ...

  3. Windows下模拟dns迭代查询过程

    目录 dns解析过程 迭代与递归 dns解析过程 当在浏览器的搜索栏输入URL(统一资源定位符)时,浏览器的解析过程 完整解析 当在浏览器输入某一IP地址时 (1)浏览器查看查看缓存表里有没有对应的域 ...

  4. ExpRe[29] Windows下的“bootstrap”深度神秘过程

    文章目录 概述 什么是bootstrap bootstrap第一步:全力连接github下载包 手动映射ip 下载`Q神秘` 下载`神秘` bootstrap第二步:使用`Q神秘`进行神秘 配置内核 ...

  5. 配置Windows下编译运行C/C++过程

    1.首先确定电脑安装了VS或者VC++的IDE: 2.修改环境变量 在系统属性-高级-环境变量-用户变量中: 编辑PATH增加cl编译器的路径D:\Program Files\Microsoft Vi ...

  6. # Windows下关于安装Geany编辑器过程中的一点小发现(可能对初次安装的人有用)

    首先,我们在安装geany的过程中需要先搜索进入geany的官网 http://geany.org/ 进入之后我们需要找到我们需要的版本(此处默认以最新版为例) 先从菜单栏处的Download进入Re ...

  7. 使用 fmod windows 下实现音频变声 -- 萝莉 大叔 等 特效

    将文件拖到窗口内,  点击播放可以看到变声效果. 也可以 点击输出将文件变声输出到文件. 可以在路径  https://download.csdn.net/download/w839687571/16 ...

  8. Windows下使用ffmpeg采集音频视频

    前言 本文介绍一下ffmpeg在windows下采集音频的相关命令. 一开始在命令行下使用ffmpeg时执行"ffmpeg -list_devices true -f dshow -i du ...

  9. windows下python如何安装模块或包? How to install package or module in windows OS when using PYTHON?

    摘要:本文介绍了在windows下利用cmd安装第三方模块或包的方法. 更新20170531:作为小白,发现使用setup.py安装并不是万能的,找到了使用pip安装的方法,步骤为配置好环境变量后(参 ...

最新文章

  1. supersu二进制更新安装失败_helm安装教程
  2. 学习笔记——Maven pom.xml配置详解
  3. POJ 1061 青蛙的约会(扩展欧几里得)
  4. jvm解决堆内存溢出问题
  5. XP 安装Oralce 10g 数据库
  6. [转]Design Pattern Interview Questions - Part 2
  7. c语言定义数组6,C语言教程6数组.ppt
  8. 京信通信:数据智能为生产调试“增效瘦身”
  9. nginx+tomcat+redis负载均衡,实现session共享
  10. hive 创建外部表产生java_(一)Hive表(管理表、外部表)的创建规则
  11. 【利用存储过程和三层架构完成新闻发布】
  12. Mybatis常见面试题
  13. JAVAEE框架架构高级视频教程
  14. 宝塔面板远程登录连接FTP空间详细教程
  15. 2k2实用球员_盘点推荐萌新NBA2KOL2里性价比极高又好用的球员中锋篇
  16. scala windows搭建开发环境
  17. 两台win10电脑连接同一个wifi怎么共享文件
  18. kalibr标定IMU随机变量(高斯分布)的方差
  19. 扇贝编程python无法退款_扇贝编程python学习笔记-基础篇1
  20. 网络和VPC简单介绍

热门文章

  1. Rancher2.0中邮件通知的设置
  2. 利用Struts拦截器限制上传图片的格式和大小
  3. Linux基础练习题(三)
  4. WCF面向服务应用程序系列之一:Hello WCF
  5. MyCP(课下作业,必做)
  6. 微信支付退款结果通知解密 base64_decode / md5 / AES
  7. cordova打包app后发请求出现 Provisional headers are shown的问题
  8. HDU-3480 Division (四边形不等式优化DP)
  9. 数据分页 THINKPHP3.2 分页 三种分页方法
  10. hdu 4686 Arc of Dream