既定の品質管理
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
DirectShow 基本クラスは、ビデオ品質コントロールの既定の動作をいくつか実装します。
品質メッセージはレンダラーから開始されます。 ビデオ レンダラーの基本クラスは CBaseVideoRenderer であり、次の動作があります。
- ビデオ レンダラーは、サンプルを受け取ると、サンプルのタイム スタンプと現在の参照時刻を比較します。
- ビデオ レンダラーは品質メッセージを生成します。 基底クラスでは、品質メッセージの 比率 メンバーは 500 (50%) から 2000 (200%) の範囲に制限されます。 この範囲外の値を指定すると、品質が急激に変化する可能性があります。
- 既定では、ビデオ レンダラーはアップストリーム出力ピン (入力ピンに接続されているピン) に品質メッセージを送信します。 アプリケーションは 、SetSink メソッドを呼び出すことによって、この動作をオーバーライドできます。
次に何が起こるかは、アップストリーム フィルターによって異なります。 通常、これは変換フィルターです。 変換フィルターの基本クラスは CTransformFilter であり、 CTransformInputPin クラスと CTransformOutputPin クラスを使用して入力ピンと出力ピンを実装します。 これらのクラスは一緒に次の動作をします。
- CTransformOutputPin::Notify メソッドは、フィルター基底クラスのプライベート メソッドである CTransformFilter::AlterQuality を呼び出します。
- 派生フィルターは 、AlterQuality をオーバーライドして品質メッセージを処理できます。 既定では、 AlterQuality は品質メッセージを無視します。
- AlterQuality が品質メッセージを処理しない場合、出力ピンは、フィルターの入力ピンのプライベート メソッドである CBaseInputPin::P assNotify を呼び出します。
- PassNotify は、品質メッセージを適切な場所 (次のアップストリーム出力ピン、またはカスタム品質マネージャー) に渡します。
変換フィルターが品質メッセージを処理しない場合、メッセージは最終的にソース フィルターの出力ピンに到達します。 基底クラスでは、 CBasePin::Notify は E_NOTIMPLを返します。 特定のソース フィルターが品質メッセージを処理する方法は、ソースの性質によって異なります。 ライブ ビデオ キャプチャなどの一部のソースでは、意味のある品質管理を実行できません。 他のソースでは、サンプルを配信する速度を調整できます。
次の図は、既定の動作を示しています。
基本ビデオ レンダラーは IQualityControl::Notify を実装します。つまり、レンダラー自体に高品質のメッセージを渡すことができます。 比率メンバーを 1000 未満の値に設定すると、ビデオ レンダラーはレンダリングする各フレームの間に待機時間を挿入します。その結果、レンダラーの速度が低下します。 (たとえば、システムの使用量を減らすためにこれを行う場合があります)。詳細については、「 CBaseVideoRenderer::ThrottleWait」を参照してください。 比率メンバーを 1000 より大きい値に設定しても、効果はありません。
関連トピック