基準クロック
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
フィルター グラフ マネージャーの 1 つの機能は、グラフ内のすべてのフィルターを、 参照クロックと呼ばれる同じクロックに同期することです。
IReferenceClock インターフェイスを公開するすべてのオブジェクトは、参照クロックとして機能できます。 参照クロックは、DirectShow フィルター (通常はハードウェア タイマーにアクセスできるオーディオ レンダラー) によって提供される場合があります。 フォールバックとして、Filter Graph Manager はシステム時刻を使用できます。
通常、基準クロックは 100 ナノ秒間隔で時間を測定しますが、クロックの実際の精度は低い場合があります。 クロックの現在の時刻を取得するには、 IReferenceClock::GetTime メソッドを 呼び出します。 クロックのベースライン (カウント開始時刻) は実装によって異なるため、 GetTime によって返される値は本質的に意味がありません。 重要なのは、グラフの実行が開始されたときの差分です。
参照クロックの精度は異なる場合がありますが、 GetTime メソッドによって返される時間は、単調に増加することが保証されます。 言い換えると、時計の時刻が逆になることはありません。 参照クロックがハードウェア ソースからクロック時間を生成していて、ハードウェア クロックが後方にジャンプする場合 (たとえば、クロックに調整がある場合)、 GetTime メソッドは、ハードウェア クロックが追いつくまで、最後に報告された時刻を返し続ける必要があります。 詳細については、「 CBaseReferenceClock クラス」を参照してください。
既定の基準クロック
フィルター グラフ マネージャーは、グラフの実行時に参照クロックを自動的に選択します。 次のアルゴリズムを使用してクロックを選択します。
- アプリケーションでクロックが選択されている場合 (下記参照)、そのクロックを使用します。
- グラフに IReferenceClock をサポートするライブ ソース フィルターが含まれている場合は、そのフィルターを使用します。 ライブ ソースの定義については、「ライブ ソース」を参照してください。
- グラフにライブ ソース フィルターが含まれていない場合は、レンダラーから開始し、アップストリームで動作する IReferenceClock をサポートするフィルターをグラフ内で使用します。 接続されていないフィルターよりも接続されたフィルターを優先します。 (グラフがオーディオ ストリームをレンダリングしている場合、アルゴリズムのこの手順では通常、オーディオ レンダラー フィルターが選択されます)。
- 適切なクロックを提供するフィルターがない場合は、システム時間に基づく システム参照クロックを使用します。
基準クロックの設定
アプリケーションでは、フィルター グラフ マネージャーで IMediaFilter::SetSyncSource メソッドを呼び出すことで、クロックを選択できます。 これは、別のクロックを優先する特定の理由がある場合にのみ行う必要があります。
値 NULL を指定して SetSyncSource を呼び出すことで、フィルター グラフ マネージャーに参照クロックを使用しないように指示できます。 たとえば、可能な限り迅速にサンプルを処理するためにこれを行うことができます。 既定の参照クロックを復元するには、フィルター グラフ マネージャーで IFilterGraph::SetDefaultSyncSource メソッドを呼び出します。
参照クロックが変更されるたびに、フィルター グラフ マネージャーは IMediaFilter::SetSyncSource メソッドを呼び出して各フィルターに通知します。 アプリケーションでは、フィルターでこのメソッドを呼び出さないでください。
関連トピック