Share via


既定の品質管理

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

DirectShow 基本クラスは、ビデオ品質コントロールの既定の動作をいくつか実装します。

品質メッセージはレンダラーから開始されます。 ビデオ レンダラーの基本クラスは CBaseVideoRenderer であり、次の動作があります。

  1. ビデオ レンダラーは、サンプルを受け取ると、サンプルのタイム スタンプと現在の参照時刻を比較します。
  2. ビデオ レンダラーは品質メッセージを生成します。 基底クラスでは、品質メッセージの 比率 メンバーは 500 (50%) から 2000 (200%) の範囲に制限されます。 この範囲外の値を指定すると、品質が急激に変化する可能性があります。
  3. 既定では、ビデオ レンダラーはアップストリーム出力ピン (入力ピンに接続されているピン) に品質メッセージを送信します。 アプリケーションは 、SetSink メソッドを呼び出すことによって、この動作をオーバーライドできます。

次に何が起こるかは、アップストリーム フィルターによって異なります。 通常、これは変換フィルターです。 変換フィルターの基本クラスは CTransformFilter であり、 CTransformInputPin クラスと CTransformOutputPin クラスを使用して入力ピンと出力ピンを実装します。 これらのクラスは一緒に次の動作をします。

  1. CTransformOutputPin::Notify メソッドは、フィルター基底クラスのプライベート メソッドである CTransformFilter::AlterQuality を呼び出します。
  2. 派生フィルターは 、AlterQuality をオーバーライドして品質メッセージを処理できます。 既定では、 AlterQuality は品質メッセージを無視します。
  3. AlterQuality が品質メッセージを処理しない場合、出力ピンは、フィルターの入力ピンのプライベート メソッドである CBaseInputPin::P assNotify を呼び出します。
  4. PassNotify は、品質メッセージを適切な場所 (次のアップストリーム出力ピン、またはカスタム品質マネージャー) に渡します。

変換フィルターが品質メッセージを処理しない場合、メッセージは最終的にソース フィルターの出力ピンに到達します。 基底クラスでは、 CBasePin::Notify は E_NOTIMPLを返します。 特定のソース フィルターが品質メッセージを処理する方法は、ソースの性質によって異なります。 ライブ ビデオ キャプチャなどの一部のソースでは、意味のある品質管理を実行できません。 他のソースでは、サンプルを配信する速度を調整できます。

次の図は、既定の動作を示しています。

基本クラスの品質管理

基本ビデオ レンダラーは IQualityControl::Notify を実装します。つまり、レンダラー自体に高品質のメッセージを渡すことができます。 比率メンバーを 1000 未満の値に設定すると、ビデオ レンダラーはレンダリングする各フレームの間に待機時間を挿入します。その結果、レンダラーの速度が低下します。 (たとえば、システムの使用量を減らすためにこれを行う場合があります)。詳細については、「 CBaseVideoRenderer::ThrottleWait」を参照してください。 比率メンバーを 1000 より大きい値に設定しても、効果はありません。

品質管理管理