Visual c++ 选择数字电视设备需要哪些用户输入?

Visual c++ 选择数字电视设备需要哪些用户输入?,visual-c++,directshow,tv-tuner,Visual C++,Directshow,Tv Tuner,在构建数字电视图像的过程中,我需要: Network Provider -> Tuner -> Capture -> MPEG2-Demux -> MPEG2 TIF -> MPEG2 Sections -> Video Decoder -> VMR

在构建数字电视图像的过程中,我需要:

Network Provider -> Tuner -> Capture -> MPEG2-Demux -> MPEG2 TIF
                                                    -> MPEG2 Sections
                                                    -> Video Decoder -> VMR9
                                                    -> Audio Decoder -> DirectSound
很明显,我可以以提供商的名义进行硬编码(
Microsoft Network provider
),但我是否需要提示用户从可用设备列表中选择调谐器和捕获设备,或者我是否可以查询与用户选择的捕获设备相对应的调谐器

基本上,我是在询问是否存在类似于以下内容的API调用:

IMoniker*pTuner=GetTunerForCaptureDevice(pIMonikerSelectedCaptureDevice)


或者让用户在其配置中同时选择调谐器和捕获设备是否是标准的。

大多数应用程序处理此问题的方式似乎是相反的。出于配置目的,它们提供类别
KSCATEGORY\u BDA\u NETWORK\u TUNER
中所有设备的列表,并允许用户选择其中一个调谐器

将该设备添加到图形后,将为
KSCATEGORY\u BDA\u RECEIVER\u组件的类别枚举所有设备。对于返回的每个项目,将捕获设备项目添加到图形中,并在调谐器输出引脚和捕获输入引脚之间调用connect。粗略代码:(没有必要的
Releases()

如果任何捕获设备成功连接管脚,则循环结束,并在图中使用该捕获过滤器

我从用户选择调谐器开始,因为我看到一些产品返回了多个调谐器设备,当尝试以相反的顺序连接(捕获,然后调谐器)时,我似乎总是成功连接错误的调谐器

for (fFound=FALSE; !fFound; )
{
     IMoniker *pIMoniker;
     IBaseFilter *ppIBaseFilter;
     hr = pIEnumMoniker->Next(1, &pIMoniker, NULL);
     if (hr!=S_OK)
           break;

     hr = pIMoniker->BindToObject(NULL, NULL, __uuidof(IBaseFilter), 
                  (void **)&ppIBaseFilter);
     hr = m_pIGraphBuilder->AddFilter(*ppIBaseFilter, L"Capture filter");
     hr = ConnectFilters(m_pIGraphBuilder, pITunerFilter, ppIBaseFilter)));
     if (hr != S_OK)
     {
          m_pIGraphBuilder->RemoveFilter(ppIBaseFilter);
          goto NextMoniker;
     }

     fFound = TRUE;
NextMoniker:
   // release things here.
}