【问题标题】:ITuner::put_TuneRequest() call ignoredITuner::put_TuneRequest() 调用被忽略
【发布时间】:2011-05-15 20:57:30
【问题描述】:

我有一个 DirectShow 图表,其中包含“Microsoft DVBT Network Provider”、“AVerMedia BDA DVBT Tuner”、“AVerMEdia BDA Digital Capture”、“Sample Grabber”和“NULL Renderer”。

这些过滤器已连接。

除此之外,我还有一个“MPEG-2 解复用器”和一个“BDA MPEG2 传输信息过滤器”,但这两个过滤器没有连接!看来他们必须在这里才能运行图表。

当我启动图表时,我正在接收 TS 数据,但无论我做什么,我都无法提出调整请求。我只能使用 Windows Media Center 等其他应用程序从上次调整的频率中捕获 MUX 数据。

这里是放置调音请求的代码:

// creating tuning space

CComPtr<IDVBTuningSpace> pDVBTuningSpace;<br>
hr = pDVBTuningSpace.CoCreateInstance( __uuidof( DVBTuningSpace ) );

WCHAR szFriendlyName[ 64 ] = L"Local DVB-T Digital Antenna";<br> BSTR bstrFriendlyName = SysAllocString( szFriendlyName );

hr = pDVBTuningSpace->put_UniqueName( bstrFriendlyName );<br>
hr = pDVBTuningSpace->put_FriendlyName( bstrFriendlyName );

SysFreeString( bstrFriendlyName );

CComBSTR clsid_dvbt = ("{216C62DF-6D7F-4e9a-8571-05F14EDB766A}");<br>
hr = pDVBTuningSpace->put_NetworkType( clsid_dvbt );<br>
hr = pDVBTuningSpace->put_SystemType( DVB_Terrestrial );<br>


// creating tune request<br>
CComPtr<ITuneRequest> pTuneRequest;

hr = pDVBTuningSpace->CreateTuneRequest( &pTuneRequest );

CComQIPtr<IDVBTuneRequest> pDVBTuneRequest( pTuneRequest );

hr = pDVBTuneRequest->put_ONID( -1 );<br>
hr = pDVBTuneRequest->put_TSID( -1 );<br>
hr = pDVBTuneRequest->put_SID( -1 );

// locator<br>
CComPtr<IDVBTLocator> pDVBTLocator;

hr = pDVBTLocator.CoCreateInstance( __uuidof( DVBTLocator ) );<br>
hr = pDVBTLocator->put_Bandwidth( 8 );<br>
hr = pDVBTLocator->put_CarrierFrequency( 506000 );

hr = pDVBTuneRequest->put_Locator( pDVBTLocator );

CComQIPtr<ITuner> pTuner( pNetworkProvider_ );

hr = pTuner->put_TuneRequest( pDVBTuneRequest );

在图表中添加“Microsoft DVBT Network Provider”过滤器后立即执行此操作。
上述代码中的所有“hr”值都是 S_OK。

我做错了什么?或者,我是否错过了这个“调音请求”的一些重要内容。

(带宽和频率值正确)

【问题讨论】:

    标签: c++ video-streaming directshow transport-stream


    【解决方案1】:

    我认为put_Bandwidth( 8 ) 是错误的,它应该是以Hz 为单位的带宽。无论如何,我向您展示我使用的一些代码。也许有帮助。

    HRESULT hr;
    CComBSTR TuningName;
    
    hr = pDVBTuningSpace2.CoCreateInstance(CLSID_DVBTuningSpace);
    
    hr = pDVBTuningSpace2->put_SystemType(DVB_Terrestrial);
    
    TuningName = L"My DVB-T";
    hr = pDVBTuningSpace2->put__NetworkType(CLSID_DVBTNetworkProvider);
    
    CComPtr <IDVBTLocator> pDVBTLocator;
    hr = pDVBTLocator.CoCreateInstance(CLSID_DVBTLocator);
    hr = pDVBTLocator->put_CarrierFrequency(config->GetFreq());
    hr = pDVBTLocator->put_Bandwidth(config->GetSymbolRate());
    hr = pDVBTuningSpace2->put_DefaultLocator(pDVBTLocator);
    
    hr = pDVBTuningSpace2->put_UniqueName(TuningName);
    hr = pDVBTuningSpace2->put_FriendlyName(TuningName);
    hr = pDVBTuningSpace2->put_FrequencyMapping(L"");
    
    CComPtr <ITuningSpaceContainer> pTuningSpaceContainer;
    hr = pTuningSpaceContainer.CoCreateInstance(CLSID_SystemTuningSpaces);
    
    VARIANT tiIndex;
    hr = pTuningSpaceContainer->Add(pDVBTuningSpace2,&tiIndex);    
    
    if (!SUCCEEDED(hr)) {
        // Get the enumerator for the collection.
        CComPtr<IEnumTuningSpaces> pTuningSpaceEnum;
        hr = pTuningSpaceContainer->get_EnumTuningSpaces(&pTuningSpaceEnum);
        if (SUCCEEDED(hr)) {
            // Loop through the collection.
            CComPtr<ITuningSpace> pTuningSpace;
            //ITuningSpace *pTuningSpace;
            tiIndex.intVal=0;
            while (S_OK == pTuningSpaceEnum->Next(1, &pTuningSpace, NULL)) {
                USES_CONVERSION;
                BSTR Name;
    
                hr = pTuningSpace->get_UniqueName(&Name);
                if (SUCCEEDED(hr)) {
                    if (wcscmp(OLE2W(Name), TuningName) == 0) {
                        hr = pTuningSpaceContainer->put_Item(tiIndex,pDVBTuningSpace2);
                    }
                    SysFreeString(Name);
                }
    
                tiIndex.intVal++;
                //pTuningSpace->Release();
                pTuningSpace.Release();
            }
        }
    }
    
    CComPtr<ITuneRequest> pTuneRequest;
    hr = pDVBTuningSpace2->CreateTuneRequest(&pTuneRequest);
    
    CComQIPtr<IDVBTuneRequest> pDVBTuneRequest(pTuneRequest);
    if(pDVBTuneRequest) {
    
        hr = pDVBTuneRequest->put_SID(config->GetSid());
        hr = pDVBTuneRequest->put_TSID(config->GetTsid());
        hr = pDVBTuneRequest->put_ONID(config->GetOnid());
    }
    
    GUID CLSIDNetworkType;
    hr = pDVBTuningSpace2->get__NetworkType(&CLSIDNetworkType);
    
    hr = CoCreateInstance(CLSIDNetworkType, NULL, CLSCTX_INPROC_SERVER,
                          IID_IBaseFilter, (void **) &pNetworkProvider);
    hr = graph->AddFilter(pNetworkProvider,L"Network Provider");
    
    // Query for ITuner.
    CComQIPtr<ITuner> pTuner(pNetworkProvider);
    if (pTuner) {
        // Submit the tune request to the network provider.
        hr = pTuner->put_TuneRequest(pTuneRequest);
    }
    
    hr = graph->AddFilter(pBdaNetworkTuner,L"BDA Source");
    hr = ConnectFilters(pNetworkProvider,pBdaNetworkTuner);
    CComPtr<IBaseFilter> pBdaReceiver;
    hr = FindDevice(KSCATEGORY_BDA_RECEIVER_COMPONENT, &pBdaReceiver, 0, 0, 0);
    
    hr = graph->AddFilter(pBdaReceiver,L"BDA Receiver");
    hr = ConnectFilters(pBdaNetworkTuner,pBdaReceiver);
    
    CComPtr<IBaseFilter> pMpegDemux;
    hr = pMpegDemux.CoCreateInstance(CLSID_MPEG2Demultiplexer);
    hr = graph->AddFilter(pMpegDemux,L"MPEG Demux");
    hr = ConnectFilters(pBdaReceiver,pMpegDemux);
    

    您正在以不同的顺序做一些事情,但我不确定这是否重要。

    【讨论】:

    • Wimmel,我试过你的方法,但结果完全一样。 :-( 我什至尝试以 Hz 为单位输入 badwidth 频率,尽管根据msdn.microsoft.com/en-us/library/dd693838(VS.85).aspx 它应该以 MHz 为单位。也许像 Windows Media Center 这样的应用程序的做法有所不同。我不会感到惊讶。
    • @natko 对于 DVB-T,我通常使用 -1 作为带宽。对于 DVB-S,我必须使用例如 27500000。所以文档是错误的。在您的示例中,您没有指定 ONID、TSID 和 SID。当我不输入它们时,我也没有得到任何结果。您可以使用 TransEdit (dvbviewer.com/griga/TransEdit%20E/MainWindow.html) 找到它们(onid 可以在 www.dvb.org 找到)。您可以使用graphedit进行实验。您可以完全调整 graphedit。
    • 抱歉,我把事情搞混了。 DVB-S 使用 put_SymbolRate,而不是 put_Bandwidth,所以这是一个不同的函数。
    • 不幸的是,当我在 graphedit 中构建图表时,我什么也没得到。任何过滤器 od 引脚上都没有可用的属性。在这种情况下我应该如何调整graphedit?但是,问题可能出在 ONID、TSID 和 SID 上。我会尝试找出这些值,看看会发生什么。在发布的代码示例中,我对所有三个都使用了 -1。我也会按照你的建议尝试 -1 作为 badwidth 并返回结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2016-10-23
    • 1970-01-01
    • 2019-02-15
    相关资源
    最近更新 更多