ライブ ソース
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
ライブ ソース ( プッシュ ソースとも呼ばれます) は、リアルタイムでデータを受信します。 たとえば、ビデオ キャプチャやネットワーク ブロードキャストなどがあります。 一般に、ライブ ソースはデータの到着率を制御できません。
次のいずれかが当てはまる場合、フィルターはライブ ソースと見なされます。
- このフィルターは IAMFilterMiscFlags::GetMiscFlags メソッドからAM_FILTER_MISC_FLAGS_IS_SOURCE フラグを返し、その出力ピンの少なくとも 1 つは IAMPushSource インターフェイスを公開します。
- フィルターは IKsPropertySet インターフェイスを公開し、キャプチャ ピン (PIN_CATEGORY_CAPTURE) を持っています。 詳細については、「 Pin プロパティ セット 」を参照してください。
ライブ ソース フィルターでクロックが提供される場合、フィルター グラフ マネージャーは、グラフ参照クロックを選択するときにそのクロックを優先します。 詳細については、「 リファレンス クロック」 を参照してください。
待機時間
フィルターの待機時間は、フィルターがサンプルを処理するのにかかる時間です。 ライブ ソースの場合、待機時間はサンプルを保持するために使用されるバッファーのサイズによって決まります。 たとえば、フィルター グラフに、待機時間が 33 ミリ秒 (ミリ秒) のビデオ ソースと、待機時間が 500 ミリ秒のオーディオ ソースがあるとします。 各ビデオ フレームは、一致するオーディオ サンプルがオーディオ レンダラーに到達する前に、約 470 ミリ秒のビデオ レンダラーに到着します。 グラフが違いを補正しない限り、オーディオとビデオは同期されません。
ライブ ソースは、 IAMPushSource インターフェイスを介して同期できます。 Filter Graph Manager は、 アプリケーションが IAMGraphStreams::SyncUsingStreamOffset メソッドを呼び出して同期を有効にしない限り、ライブ ソースを同期しません。 同期が有効になっている場合、Filter Graph Manager は IAMPushSource の各ソース フィルターに対してクエリを実行します。 フィルターで IAMPushSource がサポートされている場合、フィルター Graph Manager は IAMLatency::GetLatency を呼び出して、フィルターの予想される待機時間を取得します。 ( IAMPushSource インターフェイスは IAMLatency を継承します)。フィルター グラフ マネージャーは、結合された待機時間の値から、グラフ内で予想される最大待機時間を決定します。 その後、 IAMPushSource::SetStreamOffset を呼び出して、各ソース フィルターにストリーム オフセットを与えます。このストリーム オフセットは、そのフィルターによって生成されるタイム スタンプに追加されます。
この方法は、主にライブ プレビューを対象としています。 ただし、ライブ キャプチャ デバイス (カメラなど) のプレビュー ピンでは、配信されるサンプルにタイム スタンプは設定されないことに注意してください。 そのため、ライブ キャプチャ デバイスでこの方法を使用するには、キャプチャ ピンからプレビューする必要があります。 詳細については、「 DirectShow ビデオ キャプチャ フィルター」を参照してください。
現在、 IAMPushSource インターフェイスは 、VFW キャプチャ フィルターと オーディオ キャプチャ フィルターでサポートされています。
レートマッチング
レンダラー フィルターが 1 つの参照クロックを使用してサンプルをスケジュールするが、ソース フィルターによって別のクロックを使用してサンプルが生成された場合、再生中にグリッチが発生する可能性があります。 レンダラーはソースよりも高速に実行され、データにギャップが生じる可能性があります。 または、ソースよりも遅く実行され、ある時点でグラフがサンプルをドロップするまで、サンプルが "束になる" 可能性があります。 通常、ライブ ソースはその運用レートを制御できないため、代わりにレンダラーはソースとレートを一致させる必要があります。
現在、オーディオ再生の不具合はビデオのグリッチよりも顕著であるため、レートマッチングを実行するのはオーディオレンダラーだけです。 レート照合を実行するには、オーディオ レンダラーでレートと一致するものを選択する必要があります。 次のアルゴリズムを使用します。
- グラフが基準クロックを使用していない場合、オーディオ レンダラーはレートの一致を試みません。 (グラフに参照クロックがない場合は常に、サンプルが到着するとすぐにレンダリングされます)。
- それ以外の場合、グラフの参照クロックがある場合、オーディオ レンダラーは、前に説明した条件を使用して、ライブ ソースがアップストリームにあるかどうかを確認します。 そうでない場合、オーディオ レンダラーはレートと一致しません。
- アップストリームにライブ ソースがあり、そのソースが出力ピンで IAMPushSource インターフェイスを公開している場合、オーディオ レンダラーは IAMPushSource::GetPushSourceFlags を呼び出します。 次のいずれかのフラグを探します。
- AM_PUSHSOURCECAPS_INTERNAL_RM。 このフラグは、ソース フィルターに独自のレート一致メカニズムがあるため、オーディオ レンダラーがレートと一致しないことを意味します。
- AM_PUSHSOURCECAPS_NOT_LIVE。 このフラグは、 IAMPushSource インターフェイスを公開している場合でも、ソース フィルターが実際にはライブ ソースではないことを意味します。 そのため、オーディオ レンダラーはレートと一致しません。
- AM_PUSHSOURCECAPS_PRIVATE_CLOCK。 このフラグは、ソース フィルターがプライベート クロックを使用してタイム スタンプを生成することを意味します。 この場合、オーディオ レンダラーはタイム スタンプに対してレートを照合します。 (ただし、サンプルにタイム スタンプがない場合、レンダラーはこのフラグを無視します)。
-
GetPushSourceFlags がフラグ (ゼロ) を返さない場合、オーディオ レンダラーの動作は、グラフクロックとサンプルにタイムスタンプがあるかどうかによって異なります。
- オーディオ レンダラーがグラフ クロックではなく、サンプルにタイム スタンプがある場合、オーディオ レンダラーはタイム スタンプとレートを照合します。
- サンプルにタイムスタンプがない場合、オーディオ レンダラーは受信オーディオ データのレートと一致しようとします。
- オーディオ レンダラーがグラフ クロックの場合は、受信データ レートとの一致が試みられます。
最後のケースの理由は次のとおりです。オーディオ レンダラーが参照クロックで、ソース フィルターが同じクロックを使用してタイムスタンプを生成している場合、オーディオ レンダラーはタイム スタンプに対してレートを照合できません。 その場合、実際にはレートをそれ自体と一致させようとするため、クロックがドリフトする可能性があります。 そのため、この場合、レンダラーは受信オーディオ データのレートと一致します。
関連トピック