グラフ クロックの設定
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
フィルター グラフを作成すると、フィルター グラフ マネージャーによってグラフの参照クロックが自動的に選択されます。 グラフ内のすべてのフィルターは、基準クロックに同期されます。 特に、レンダラー フィルターは参照クロックを使用して、各サンプルの表示時間を決定します。
通常、アプリケーションがフィルター グラフ マネージャーの選択した参照クロックをオーバーライドする理由はありません。 ただし、これを行うには、フィルター グラフ マネージャーで IMediaFilter::SetSyncSource メソッドを呼び出します。 このメソッドは、クロックの IReferenceClock インターフェイスへのポインターを受け取ります。 グラフが停止している間に メソッドを呼び出します。
フィルターがクロックを提供する場合は、フィルターで QueryInterface を呼び出すことで IReferenceClock ポインターを取得できます。 または、外部クロックが IReferenceClock を実装している限り、フィルターによって提供されない外部参照クロックを実装することもできます。 次の例は、クロックを指定する方法を示しています。
IGraphBuilder *pGraph = 0;
IReferenceClock *pClock = 0;
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
// Build the graph.
pGraph->RenderFile(L"C:\\Example.avi", 0);
// Create your clock.
hr = CreateMyPrivateClock(&pClock);
if (SUCCEEDED(hr))
{
// Set the graph clock.
IMediaFilter *pMediaFilter = 0;
pGraph->QueryInterface(IID_IMediaFilter, (void**)&pMediaFilter);
pMediaFilter->SetSyncSource(pClock);
pClock->Release();
pMediaFilter->Release();
}
この例では、CreateMyPrivateClock がクロックを作成し、 IReferenceClock ポインターを返すアプリケーション定義関数であることを前提としています。
値 NULL で SetSyncSource を呼び出すことで、クロックなしで実行されるようにフィルター グラフを設定することもできます。 クロックがない場合、グラフはできるだけ早く実行されます。 クロックがない場合、レンダラー フィルターはサンプルのプレゼンテーション時間を待機しません。 代わりに、各サンプルが到着するとすぐにレンダリングされます。 グラフを時計なしで実行するように設定すると、リアルタイムでプレビューするのではなく、データをすばやく処理する場合に便利です。
関連トピック