kenlistian

厚积薄发. 勤为桨,思为帆

   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  73 随笔 :: 4 文章 :: 22 评论 :: 0 Trackbacks

使用DirectShow写一个音频捕捉例子

DirectShow对硬件的支持是通过特定的包装Filter来实现的。
声卡使用的是Audio Capture Filter,Filter内部使用以waveIn开头
的一套API实现(如waveInOpen等)。
运行GraphEdit,插入Filter时,在“Audio Capture Sources”目录下,
就能看到所有代表本地机器上的声卡的各个Filter(装了几张声卡,就会有几个Filter)


DirectShow加入一个硬件Filter,是靠“枚举”;声卡Filter也不例外。
代表声卡的Filter都注册在CLSID_AudioInputDeviceCategory目录下,
使用系统设备枚举器枚举这个目录,就能发现要创建的声卡对象。
 (如何枚举这里就不再赘述了。)
当成功加入声卡Filter后,接下去的问题就是要将这个Filter与其他Filter相连。


 想捕捉生成一个Wave文件,采用过滤器的勾连如下
     声卡filter--->Wave Dest Filter  ---->File Writer Filter
 Wave Dest Filter是微软DirectX SDK自带的过滤器
    其功能是,当结束捕捉时,往Wave文件中写入一个文件头信息。

 Filte Write Filter 是微软系统过滤器。
用graphedit可以勾连后测试下。


//采用程序来连接过滤器的大致方法:
//没有处理错误
void BuildAudioCaptureGraph(void)
{
  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**)&pGraph);

  // Add the audio capture filter.
     //这里省略了枚举设备处理
  FindAudioCapture(&pSrc);
 
  // audio capture devices and picks one.
  pGraph->AddFilter(pSrc, L"Capture");

  // Add the WavDest and the File Writer.
  AddFilterByClsid(pGraph, L"WavDest", CLSID_WavDest, &pWavDest);
  AddFilterByClsid(pGraph, L"File Writer", CLSID_FileWriter, &pWriter);

  //是writer接口中属性
  pWriter->QueryInterface(IID_IFileSinkFilter, (void**)&pSink);
  pSink->SetFileName(L"C:\test.wav", NULL);

  //连接filter
  ConnectTwoFilters(pGraph, pSrc, pWavDest);
  ConnectTwoFilters(pGraph, pWavDest, pWriter);
}


 

posted on 2008-12-08 20:21 kenlistian 阅读(773) 评论(0)  编辑 收藏 引用 所属分类: directx

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理