收藏 分享(赏)

directshow音频捕捉.doc

上传人:cjc2202537 文档编号:1340857 上传时间:2018-06-27 格式:DOC 页数:3 大小:135.50KB
下载 相关 举报
directshow音频捕捉.doc_第1页
第1页 / 共3页
directshow音频捕捉.doc_第2页
第2页 / 共3页
directshow音频捕捉.doc_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

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营业执照举报