收集Fine-Tuning信息

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

虽然电缆频率一般预期准确,但广播站可以调整广播频率上下几 kHz,以减少对相邻通道的潜在干扰。

当电视调谐器筛选器调谐到频道时,它会扫描最精确的信号。 若要将此信息保存在注册表中以供后续优化操作使用,请执行以下操作:

  1. 调用 IAMTuner::ChannelMinMax 以确定当前频率表中的频率条目的范围。
  2. 为范围中的每个频率索引调用 IAMTuner::p ut_Channel 方法一次。
  3. 调用 IAMTVTuner::StoreAutoTune 将微调信息保存在注册表中。 信息存储在当前优化空间的注册表项下。

以下代码演示了这些步骤:

long lMin = 0, lMax = 0;
hr = pTuner->ChannelMinMax(&lMin, &lMax);
if (SUCCEEDED(hr))
{
    for (long i = lMin; i <= lMax; i++)
    {
        pTuner->put_Channel(i, AMTUNER_SUBCHAN_DEFAULT,
            AMTUNER_SUBCHAN_DEFAULT)
    }
    pTuner->StoreAutoTune();
}

对于早期版本的电视调谐器筛选器,建议使用 IAMTVTuner::AutoTune 方法进行微调。 但是,此方法会忽略任何频率替代,因此不建议再使用它。 以下代码等效于 AutoTune 方法,但可以正确使用频率替代:

HRESULT MyAutoTune(IAMTVTuner *pTuner, long lIndex, long *plFoundSignal)
{
    long SignalStrength = AMTUNER_NOSIGNAL;
    HRESULT hr;
    hr = pTuner->put_Channel(lIndex, AMTUNER_SUBCHAN_DEFAULT, AMTUNER_SUBCHAN_DEFAULT);
    if (NOERROR == hr)
        pTuner->SignalPresent(&SignalStrength);
    *plFoundSignal = (SignalStrength != AMTUNER_NOSIGNAL);
        return hr;
}

使用广播接收时,虽然图片是可见的,但并不总是可以获取水平锁。 在这些情况下,调谐器硬件将具有频率锁,但解码器将没有水平锁。 使用 put_ChannelAutoTune 时,可以通过检查返回代码来检测此情况。

说明
S_OK 优化操作成功,并且调谐器获得了频率锁。
S_FALSE 在优化操作期间没有错误,但调谐器无法获取频率锁。 此操作极不可能有一个可查看的通道。

 

任何其他返回代码都指示发生了某些错误。

返回值S_OK不保证解码器具有水平锁。 AutoTune 方法更新 FoundSignal 参数以指示是否已实现水平锁。 IAMTuner::SignalPresent 方法返回相同的信息。

但是,当返回值S_OK时,应用程序可以选择忽略 FoundSignal 参数,因为调谐器报告频率锁。 可能会对噪声进行频率锁定,但这种可能性应与跳过可查看通道的可能性进行权衡。

注册表转换

为了支持频率替代,保存微调信息的注册表项的内部格式已更改。 仍支持原始格式以实现后向兼容性,但它不支持频率替代。

每当调用 IAMTVTuner::StoreAutoTune 方法时,旧注册表格式将转换为新格式。 如果应用程序添加频率替代,它应调用 StoreAutoTune 方法以转换为新的注册表格式。 在调用 StoreAutoTune 之前,无需收集任何微调信息。

国际模拟电视优化