ImageVerifierCode 换一换
格式:DOC , 页数:3 ,大小:135.50KB ,
资源ID:1340857      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-1340857.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(directshow音频捕捉.doc)为本站会员(cjc2202537)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

directshow音频捕捉.doc

1、现在的所谓多媒体电脑一般都会有声卡(软声卡或硬声卡) ,有声卡就能进行音频的捕捉。大家一定熟悉 Windows 自带的附件 “录音机”程序,可以通过麦克风进行录音,最终生成一个 Wave 文件。读完本文之后,你就会发现,自己使用 DirectShow 写一个音频捕捉的应用程序,原来也是这么的容易!大家知道,DirectShow 对硬件的支持是通过特定的包装 Filter 来实现的。声卡使用的是 Audio Capture Filter,Filter 内部使用以 waveIn 开头的一套 API 实现(如 waveInOpen 等)。运行 GraphEdit,插入 Filter 时,在“Audi

2、o Capture Sources”目录下,我们就能看到所有代表本地机器上的声卡的各个 Filter(有的机器装了几张声卡,这里就会有几个 Filter) 。在Filter Graph 中加入这个 Filter,我们发现这个 Filter 有很多 Input pin,如 Line In、CD Audio、Microphone、Stereo Mix 等等;有一个 Capture output pin。需要说明的是,在 Filter Graph 中,这些 Input pin 并没有真正的数据流入,它们只是声卡的各个输入端子的象征性表示;所以这些 Input pin 永远也不用连接。下面我们来看一下

3、如何创建一个音频捕捉程序。首先,当然是加入一个 Audio Capture Filter。大家知道,DirectShow 加入一个硬件 Filter,都是要靠“ 枚举”;声卡 Filter 也不例外。代表声卡的 Filter 都注册在 CLSID_AudioInputDeviceCategory 目录下,使用系统设备枚举器枚举这个目录,就能发现我们想要创建的声卡对象。 (如何枚举这里就不再赘述了。 )当成功加入声卡 Filter 后,接下去的问题就是要将这个 Filter 与其他 Filter 相连。比如,我们想捕捉生成一个 Wave 文件,那么我们还需加入一个 Wave Dest Filte

4、r 和一个 File Writer Filter,然后依次将它们相连。需要说明的是,Wave Dest Filter 是微软 DirectX SDK 带的一个例子,在 samplesMultimediaDirectShowFiltersWavDest 目录下,我们必须首先编译这个例子并且注册这个 Filter;这个 Filter 的功能是,当我们结束捕捉时,往 Wave 文件中写入一个文件头信息。下图是在 GraphEdit 中的 Filter 连接图:下面是一段创建音频捕捉程序的框架代码,可供参考:void BuildAudioCaptureGraph(void) / Warning! No

5、 error checking here. IBaseFilter *pSrc = NULL, *pWaveDest = NULL, * pWriter = NULL; IFileSinkFilter *pSink= NULL; IGraphBuilder *pGraph; / Create the Filter Graph Manager. CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void*) / Add the audio capture filter. Find

6、AudioCapture( / Assume that this function enumerates / audio capture devices and picks one. pGraph-AddFilter(pSrc, L“Capture“); / Add the WavDest and the File Writer. AddFilterByClsid(pGraph, L“WavDest“, CLSID_WavDest, AddFilterByClsid(pGraph, L“File Writer“, CLSID_FileWriter, / Set the file name. p

7、Writer-QueryInterface(IID_IFileSinkFilter, (void*) pSink-SetFileName(L“C:MyWackyWav.wav“, NULL); / Hook everything up. ConnectTwoFilters(pGraph, pSrc, pWavDest); ConnectTwoFilters(pGraph, pWavDest, pWriter); 当然,在进行音频捕捉的同时,我们还可以实时监听音频源的输入。如下示意图:我们在 Audio Capture Filter 后面接了一个 Infinite Pin Tee,这个 Filt

8、er 能够将一个 Input pin 输入的数据,复制成多份,分别通过各个 Output pin 发送出去。 (这个 Filter 也是微软DirectX SDK 带的一个例子,在 samplesMultimediaDirectShowFilters InfTee 目录下。 )我们看到 Tee Filter 的一支连到了 DirectSound Renderer,可以将声音放在声卡上输出。创建音频捕捉的应用程序很简单吧!下面,我们还要来讨论一下音频捕捉前可能用到的一些参数设置。在声卡 Filter 的每个 Input pin 上,我们都可以得到 IAMAudioInputMixer这个接口。通

9、过这个接口,我们可以设置各个输入端子的音频属性,如进行音频合成时是否允许某个输入端子的音频参与混合、音频输入的音量,还有 Treble、Bass 等等。另外,在 Filter 上也可以得到 IAMAudioInputMixer 接口,这时调用接口方法就可以统一控制各个输入端子的属性。音频捕捉,还可以设置的是音频的采样频率以及声音的具体格式(8Bits或 16Bits,单声道或双声道) 。我们可以通过 Capture output pin 的 IAMStreamConfig 来完成。下面的代码可供参考:HRESULT hr = pCapturePin-QueryInterface(IID_IAM

10、StreamConfig, (void *) / Read current media type/format AM_MEDIA_TYPE *pmt=0; hr = pCfg-GetFormat( if (SUCCEEDED(hr) / Fill in values for the new format WAVEFORMATEX *pWF = (WAVEFORMATEX *) pmt-pbFormat; pWF-nChannels = (WORD) nChannels; pWF-nSamplesPerSec = nFrequency; pWF-nAvgBytesPerSec = lBytesP

11、erSecond; pWF-wBitsPerSample = (WORD) (nBytesPerSample * 8); pWF-nBlockAlign = (WORD) (nBytesPerSample * nChannels); / Set the new formattype for the output pin hr = pCfg-SetFormat(pmt); DeleteMediaType(pmt); / Release interfaces pCfg-Release(); 最后,还要提到的一点,也是音频捕捉比较特殊的地方:我们可以通过 Capture output pin 上的

12、IAMBufferNegotiation 接口,改变音频捕捉缓冲的大小,以减少声音播放的延迟。默认情况下,Audio Capture Filter 使用 0.5 秒钟的缓冲。对于一些特殊的应用,这么大的缓冲是没有必要的,带来的延迟也比较大。一般,缓冲设置成能够容纳 80 毫秒的数据已经很可靠;甚至 30-40 毫秒也已经足够了。但是也不能太小,否则会影响到音频捕捉的效率,使音质受到损害。下面的代码设置音频捕捉的缓冲大小,可供参考:pCapturePin-QueryInterface(IID_IAMBufferNegotiation, (void *) / Set the buffer size

13、 based on selected settings ALLOCATOR_PROPERTIES prop=0; prop.cbBuffer = lBufferSize; prop.cBuffers = 6; prop.cbAlign = nBytesPerSample * nChannels; hr = pNeg-SuggestAllocatorProperties( pNeg-Release(); 以上,我们讲述了音频捕捉程序的创建过程,以及一些捕捉参数的设置方法。相信大家对于如何写音频捕捉程序已经有了自己的认识。音频捕捉直接得到的是 PCM 数据,根据需要,我们还可以对其进行压缩,比如用 Mp3 格式(微软提供了一个免费的 Mp3 Encoder) 、AC3 格式等等;压缩后数据量更少,可以符合很多场合的应用。

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报