【问题标题】:DirectShow API for analog tuning to put a frequency?DirectShow API 用于模拟调谐以放置频率?
【发布时间】:2010-11-30 15:18:28
【问题描述】:

我正在寻找 DirectShow 中仅允许我推送频率的接口。 IAMTVTuner 接口允许您使用put_channel 但这需要预先调整您的卡。我只想指定要调谐的频率。这可以通过模拟调谐实现吗? (不过,您可以使用数字流的接口轻松做到这一点)。

【问题讨论】:

    标签: directshow frequency


    【解决方案1】:

    I think this codeproject link should help you

    代码如下:

    // It is assumed that you have constructed the complete TV tuner Graph 
    // of your Device.And will use this function to set custom frequencies 
    // or to fine tune a tuned TV channel.Please also make sure to set the 
    // appropriate Video standard and contry code before calling this function.
    
    #define INSTANCEDATA_OF_PROPERTY_PTR(x) ((PKSPROPERTY((x))) + 1)
    #define INSTANCEDATA_OF_PROPERTY_SIZE(x) (sizeof((x)) - sizeof(KSPROPERTY))
    
    HRESULT SetFrequency(long Freq)
    { 
        HRESULT hr;
        DWORD dwSupported=0;  
    
        // Query the IKsPropertySet on your Device TV Tuner Filter.
        // m_pTvtuner is IBaseFilter Pointer of your TV Tuner Filter.   
    
        CComPtr m_pKSProp;
        hr = m_pTvtuner->QueryInterface(IID_IKsPropertySet, (void**)&m_pKSProp); 
        if (FAILED(hr))
            return E_FAIL;
    
        KSPROPERTY_TUNER_MODE_CAPS_S ModeCaps;
        KSPROPERTY_TUNER_FREQUENCY_S Frequency;
        memset(&ModeCaps,0,sizeof(KSPROPERTY_TUNER_MODE_CAPS_S));
        memset(&Frequency,0,sizeof(KSPROPERTY_TUNER_FREQUENCY_S));
        ModeCaps.Mode = AMTUNER_MODE_TV; 
    
        // Check either the Property is supported or not by the Tuner drivers 
    
        hr = m_pKSProp->QuerySupported(PROPSETID_TUNER, 
              KSPROPERTY_TUNER_MODE_CAPS,&dwSupported);
        if(SUCCEEDED(hr) && dwSupported&KSPROPERTY_SUPPORT_GET)
        {
            DWORD cbBytes=0;
            hr = m_pKSProp->Get(PROPSETID_TUNER,KSPROPERTY_TUNER_MODE_CAPS,
                INSTANCEDATA_OF_PROPERTY_PTR(&ModeCaps),
                INSTANCEDATA_OF_PROPERTY_SIZE(ModeCaps),
                &ModeCaps,
                sizeof(ModeCaps),
                &cbBytes);  
        }
        else
            return E_FAIL; 
    
        Frequency.Frequency=Freq;
        if(ModeCaps.Strategy==KS_TUNER_STRATEGY_DRIVER_TUNES)
            Frequency.TuningFlags=KS_TUNER_TUNING_FINE;
        else
            Frequency.TuningFlags=KS_TUNER_TUNING_EXACT;
    
        // Here the real magic starts
    
        if(Freq>=ModeCaps.MinFrequency && Freq<=ModeCaps.MaxFrequency)
        {
            hr = m_pKSProp->Set(PROPSETID_TUNER,
                KSPROPERTY_TUNER_FREQUENCY,
                INSTANCEDATA_OF_PROPERTY_PTR(&Frequency),
                INSTANCEDATA_OF_PROPERTY_SIZE(Frequency),
                &Frequency,
                sizeof(Frequency));
            if(FAILED(hr))
                return E_FAIL;  
        }
        else
            return E_FAIL;
    
        return S_OK;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 2021-11-23
      • 2018-02-21
      相关资源
      最近更新 更多