【问题标题】:What user inputs are required for a Digital TV Device Selection?数字电视设备选择需要哪些用户输入?
【发布时间】:2014-02-07 22:10:59
【问题描述】:

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

Network Provider -> Tuner -> Capture -> MPEG2-Demux -> MPEG2 TIF
                                                    -> MPEG2 Sections
                                                    -> Video Decoder -> VMR9
                                                    -> Audio Decoder -> DirectSound

很明显,我可以以提供者的名义 (Microsoft Network Provider) 进行硬编码,但我是否需要提示用户同时选择一个调谐器一个捕获设备可用设备的列表,或者我可以以某种方式查询与用户选择的捕获设备相对应的调谐器吗?

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

IMoniker *pTuner = GetTunerForCaptureDevice(pIMonikerSelectedCaptureDevice);

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

【问题讨论】:

    标签: visual-c++ directshow tv-tuner


    【解决方案1】:

    似乎大多数应用程序处理此问题的方式是反其道而行之。出于配置目的,它们提供了KSCATEGORY_BDA_NETWORK_TUNER 类别中所有设备的列表,并允许用户选择其中一个调谐器。

    将该设备添加到图表后,将针对KSCATEGORY_BDA_RECEIVER_COMPONENT 类别枚举所有设备。对于返回的每个项目,捕获设备项目被添加到图表中,并且在调谐器输出引脚和捕获输入引脚之间调用连接。粗略代码:(没有必要的Releases()'s)

    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.
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 2017-11-23
      • 2018-12-14
      相关资源
      最近更新 更多