科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件DirectShow应用——音频捕捉

DirectShow应用——音频捕捉

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

现在的所谓多媒体电脑一般都会有声卡(软声卡或硬声卡),有声卡就能进行音频的捕捉.

作者:lqm 来源:论坛 2007年10月20日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
当然,在进行音频捕捉的同时,我们还可以实时监听音频源的输入。如下示意图:



  我们在Audio Capture Filter后面接了一个Infinite Pin Tee,这个Filter能够将一个Input pin输入的数据,复制成多份,分别通过各个Output pin发送出去。(这个Filter也是微软DirectX SDK带的一个例子,在samples\Multimedia\DirectShow\Filters\ InfTee目录下。)我们看到Tee Filter的一支连到了DirectSound Renderer,可以将声音放在声卡上输出。

  创建音频捕捉的应用程序很简单吧!下面,我们还要来讨论一下音频捕捉前可能用到的一些参数设置。在声卡Filter的每个Input pin上,我们都可以得到IAMAudioInputMixer这个接口。通过这个接口,我们可以设置各个输入端子的音频属性,如进行音频合成时是否允许某个输入端子的音频参与混合、音频输入的音量,还有Treble、Bass等等。另外,在Filter上也可以得到IAMAudioInputMixer接口,这时调用接口方法就可以统一控制各个输入端子的属性。音频捕捉,还可以设置的是音频的采样频率以及声音的具体格式(8Bits或16Bits,单声道或双声道)。我们可以通过Capture output pin的IAMStreamConfig来完成。下面的代码可供参考:

HRESULT hr = pCapturePin->QueryInterface(IID_IAMStreamConfig, (void **)&pCfg);
// Read current media type/format
AM_MEDIA_TYPE *pmt={0};
hr = pCfg->GetFormat(&pmt);
if (SUCCEEDED(hr))
{
 // Fill in values for the new format
 WAVEFORMATEX *pWF = (WAVEFORMATEX *) pmt->pbFormat;
 pWF->nChannels = (WORD) nChannels;
 pWF->nSamplesPerSec = nFrequency;
 pWF->nAvgBytesPerSec = lBytesPerSecond;
 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上的IAMBufferNegotiation接口,改变音频捕捉缓冲的大小,以减少声音播放的延迟。默认情况下,Audio Capture Filter使用0.5秒钟的缓冲。对于一些特殊的应用,这么大的缓冲是没有必要的,带来的延迟也比较大。一般,缓冲设置成能够容纳80毫秒的数据已经很可靠;甚至30-40毫秒也已经足够了。但是也不能太小,否则会影响到音频捕捉的效率,使音质受到损害。下面的代码设置音频捕捉的缓冲大小,可供参考:

pCapturePin->QueryInterface(IID_IAMBufferNegotiation, (void **)&pNeg);
// Set the buffer size based on selected settings
ALLOCATOR_PROPERTIES prop={0};
prop.cbBuffer = lBufferSize;
prop.cBuffers = 6;
prop.cbAlign = nBytesPerSample * nChannels;
hr = pNeg->SuggestAllocatorProperties(&prop);
pNeg->Release();

  以上,我们讲述了音频捕捉程序的创建过程,以及一些捕捉参数的设置方法。相信大家对于如何写音频捕捉程序已经有了自己的认识。音频捕捉直接得到的是PCM数据,根据需要,我们还可以对其进行压缩,比如用Mp3格式(微软提供了一个免费的Mp3 Encoder)、AC3格式等等;压缩后数据量更少,可以符合很多场合的应用。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章