次の方法で共有


ライブ ソース

"プッシュ ソース" とも呼ばれるライブ ソースは、データをリアルタイムで受け取る。たとえば、ビデオ キャプチャやネットワーク ブロードキャストなどが例として挙げられる。一般に、ライブ ソースはデータが到着するレートを制御することはできない。

次のいずれかに該当する場合、フィルタはライブ ソースであると見なされる。

ライブ ソース フィルタがクロックを提供する場合、フィルタ グラフ マネージャは、グラフの基準クロックを選択するときにそのクロックを優先する。詳細については、「基準クロック」を参照すること。

遅延時間

フィルタの遅延時間とは、フィルタがサンプルを処理するのに要する時間である。ライブ ソースの場合、遅延時間はサンプルを保持するためのバッファのサイズによって決まる。たとえば、フィルタ グラフがビデオ ソースをレンダリングする際に 33 ミリ秒 (ms) の遅延時間があり、オーディオ ソースをレンダリングする際に 500 ms の遅延時間があるとする。この場合、各ビデオ フレームは、対応するオーディオ サンプルがオーディオ レンダラに到着する約 470 ms 前にビデオ レンダラに到着する。この差異をグラフで補正しないと、オーディオとビデオは同期しない。

ライブ ソースは、IAMPushSource インターフェイスによって同期できる。アプリケーションが IAMGraphStreams::SyncUsingStreamOffset メソッドを呼び出して同期を有効にしない限り、フィルタ グラフ マネージャはライブ ソースを同期しない。同期が有効にされた場合、フィルタ グラフ マネージャはそれぞれのソース フィルタに対して IAMPushSource を照会する。フィルタが IAMPushSource をサポートしている場合、フィルタ グラフ マネージャは IAMLatency::GetLatency を呼び出してフィルタの予測遅延時間を取得する。IAMPushSource インターフェイスは IAMLatency を継承する。組み合わされた遅延時間の値から、フィルタ グラフ マネージャはグラフ内の最大予測遅延時間を決定する。次に、フィルタ グラフ マネージャは IAMPushSource::SetStreamOffset を呼び出して各ソース フィルタにストリーム オフセットを与える。フィルタは、このストリーム オフセットを生成するタイム スタンプに加える。

この方法は、主にライブ プレビューでの使用を目的としている。ただし、ライブ キャプチャ デバイス (カメラなど) のプレビュー ピンは提供するサンプルにタイム スタンプを設定しないことに、注意する必要がある。したがって、ライブ キャプチャ デバイスでこの方法を使うには、キャプチャ ピンからプレビューする必要がある。詳細については、「DirectShow のビデオ キャプチャ フィルタ」を参照すること。

現時点では、VFW キャプチャ フィルタと Audio Capture フィルタが、IAMPushSource インターフェイスをサポートしている。

レート マッチング

レンダリング フィルタが 1 つの基準クロックを使ってサンプルをスケジュールする一方で、ソース フィルタが異なるクロックを使ってサンプルを生成した場合、再生時に異常が発生することがある。レンダラがソースよりも高速に実行すると、データにギャップが生じる。レンダラがソースよりも低速に実行すると、ある時点でグラフがサンプルをドロップするまで、サンプルが "山積み" になる。通常、ライブ ソースはそのプロダクション レートを制御することができないので、レンダラ側でソースとレートを一致させる。

オーディオ再生における異常はビデオにおけるそれよりも著しいので、現在、オーディオ レンダラだけがレート マッチングを実行する。レート マッチングを実行するために、オーディオ レンダラはレートを一致させる対象を選択する必要がある。オーディオ レンダラは次のようなアルゴリズムを使う。

  • グラフが基準クロックを使っていない場合、オーディオ レンダラはレート マッチングを行わない。グラフに基準クロックがない場合、サンプルは常に到着と同時にレンダリングされる。
  • グラフの基準クロックが存在する場合は、オーディオ レンダラは、既に説明した基準で、アップストリームにライブ ソースがあるかどうかをチェックする。ライブ ソースがない場合、レンダラはレート マッチングを行わない。
  • アップストリームにライブ ソースがある場合で、そのソースが出力ピンで IAMPushSource インターフェイスを公開する場合、オーディオ レンダラは IAMPushSource::GetPushSourceFlags を呼び出す。次のフラグのいずれかを検索する。
    • AM_PUSHSOURCECAPS_INTERNAL_RM。このフラグは、ソース フィルタが独自のレート マッチング メカニズムを持ち、オーディオ レンダラがレート マッチングを行わないことを意味する。
    • AM_PUSHSOURCECAPS_NOT_LIVE。このフラグは、ソース フィルタが IAMPushSource インターフェイスを公開するが、実際にはライブ ソースではないことを意味する。したがって、レンダラはレート マッチングを行わない。
    • AM_PUSHSOURCECAPS_PRIVATE_CLOCK。このフラグは、ソース フィルタがプライベート クロックを使ってタイム スタンプを生成していることを意味する。この場合、オーディオ レンダラは、タイム スタンプとレートを一致させる。ただし、サンプルにタイム スタンプがない場合は、レンダラはこのフラグを無視する。
  • GetPushSourceFlags がフラグを返さない (0) の場合、オーディオ レンダラの動作はグラフ クロックと、サンプルがタイム スタンプを持つかどうかによって異なる。
    • オーディオ レンダラがグラフ クロックではなく、サンプルにタイム スタンプがない場合、オーディオ レンダラはタイム スタンプとレートを一致させる。
    • サンプルにタイム スタンプがない場合、オーディオ レンダラは受信オーディオ データのレートに一致させる。
    • オーディオ レンダラがグラフ クロックである場合、受信データのレートに一致させる。

最後のケースの理由は次のとおりである。オーディオ レンダラが基準クロックであり、ソース フィルタが同じクロックを使ってタイム スタンプを生成する場合、オーディオ レンダラはタイム スタンプとレートを一致させることができない。このレートを一致させると、結果として、レンダラは自分自身とレートを一致させることになり、クロックのずれが発生する。したがって、このような場合、レンダラは受信オーディオ データとレートを一致させる。