アナログテレビのチューニング
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
チューニングは、 IAMTVTuner インターフェイスを介して TV チューナー フィルターによって制御されます。 IAMTVTuner インターフェイスは IAMTuner を継承します。 インターフェイスへのポインターを取得するには、 次のように ICaptureGraphBuilder2::FindInterface メソッドを呼び出します。
IAMTVTuner *pTuner = NULL;
hr = pBuild->FindInterface(
&LOOK_UPSTREAM_ONLY, // Look upstream from pCap.
NULL, // No particular media type.
pCap, // Pointer to the capture filter.
IID_IAMTVTuner, (void**)&pTuner);
if (SUCCEEDED(hr))
{
// Use pTuner ...
pTuner->Release();
}
最初のパラメーターは、キャプチャ フィルターからアップストリームを検索することを示します。
頻度テーブル
内部的には、TVチューナーフィルタは周波数テーブルのリストを保持します。 各周波数テーブルは、特定の国/地域のブロードキャストまたはケーブル周波数に対応しています。 一般的な "Unicable" 頻度テーブルもあります。これは、国/地域に標準の頻度の割り当てセットがない場合に使用されます。
各周波数テーブルには、チューニング周波数の一覧が含まれています。 一部の国/地域では、テーブル内のインデックスはチャネル番号に直接対応します。つまり、チャネル n の頻度は、テーブル内の n 番目のエントリです。 ただし、一部の国/地域では、チャネル番号と周波数の間に直接の対応はありません。 その場合、アプリケーションでは、チャネル番号 (通常はユーザーが選択) を頻度テーブル エントリにマップするリストを保持する必要があります。 たとえば、ユーザーが "チャネル 5" と見なしているのは、頻度テーブルのエントリ番号 12 です。
詳細については、「 International Analog TV Tuning」を参照してください。
基本的なチューニング操作
チューナーがテレビや FM ラジオなどの複数の受信モードをサポートしている場合は、 IAMTuner::p ut_Mode を呼び出してモードを選択します。 IAMTuner::GetAvailableModes メソッドは、チューナーでサポートされているすべてのモードを返します。 たとえば、次のコードでは、チューナーが FM ラジオをサポートしているかどうかを確認し、サポートされている場合は、そのモードに切り替えます。
// Check whether the mode is supported.
long lModes = 0;
hr = m_pTuner->GetAvailableModes(&lModes);
if (SUCCEEDED(hr) && (lModes & AMTUNER_MODE_FM_RADIO))
{
// Set the mode.
hr = pTuner->put_Mode(AMTUNER_MODE_FM_RADIO);
}
国/地域を設定するには、 IAMTuner::p ut_CountryCode メソッドを呼び出します。 チューナーは、この値を使用して適切な周波数テーブルを選択します。 詳細については、「 国/地域の割り当て 」を参照してください。
チャネルを設定するには、 IAMTuner::p ut_Channel メソッドを 呼び出します。 このメソッドの引数は、実際にはチャネル番号ではなく、現在の頻度テーブルへのインデックスです。 前に説明したように、インデックス番号はチャネル番号に対応する場合と対応しない場合があります。 IAMTuner::ChannelMinMax メソッドは、現在の頻度テーブルの最小インデックス値と最大インデックス値を返します。
頻度エントリのオーバーライド
頻度テーブルの一部のエントリが正しくないか、古くなっている可能性があります。 そのため、レジストリ キーを使用して個々のエントリをオーバーライドするためのメカニズムが提供されます。
詳細については、「 International Analog TV Tuning」のトピックで説明されています。 各レジストリ キーは、1 つ以上のサブキーを含む "チューニング 領域" を定義します。 各サブキーは、1 つの頻度エントリをオーバーライドします。 現在のチューニング領域を設定するには、 IAMTuner::p ut_TuningSpace メソッドを使用します。 チューニング・スペースをアクティブ化すると、現在の周波数表の周波数項目がオーバーライドされます。 そのため、チューニング スペースと国/地域の対応を維持するのはアプリケーションにかかっています。 最適な方法は、単にチューニングスペースの名前として国/地域識別子を使用することです。
頻度エントリの微調整
ブロードキャスト周波数は、近隣チャネルとの潜在的な干渉を減らすために、ブロードキャスト 局によって数 kHz の上下に調整できます。 公称周波数を考えると、チューナーカードは正確な周波数をスキャンできます。 TVチューナーフィルタは、レジストリ内の調整された周波数を保存するためのメカニズムを備えています。
frequency テーブル内の各エントリについて、put_Channel メソッドを呼び出して、その頻度に合わせて調整します。 チューナーは、最も正確な周波数をスキャンします。 チューナーが水平ロックを達成したかどうかをチェックするには、IAMTuner::SignalPresent を呼び出します。 TVチューナーフィルタは、内部的に結果を格納します。
すべての頻度をスキャンした後、 IAMTVTuner::StoreAutoTune メソッドを呼び出して、更新された値をレジストリに書き込みます。 更新された値は、現在のチューニング領域のレジストリ エントリの下に格納されます。
関連トピック