Freigeben über


Standardqualitätskontrolle

[Das dieser Seite zugeordnete Feature DirectShow-ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngineund Audio/Video Capture in Media Foundationersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code MediaPlayer-, IMFMediaEngine und Audio-/Videoaufnahme in Media Foundation anstelle von DirectShow-verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, um die neuen APIs zu verwenden, falls möglich umgeschrieben werden.]

Die DirectShow-Basisklassen einige Standardverhalten für die Videoqualitätskontrolle implementieren.

Qualitätsmeldungen beginnen beim Renderer. Die Basisklasse für Videorenderer ist CBaseVideoRenderer, die das folgende Verhalten hat:

  1. Wenn der Videorenderer ein Beispiel empfängt, vergleicht er den Zeitstempel im Beispiel mit der aktuellen Referenzzeit.
  2. Der Videorenderer generiert eine Qualitätsmeldung. In der Basisklasse ist das Proportion Mitglied der Qualitätsnachricht auf einen Bereich von 500 (50%) bis 2000 (200%) beschränkt. Werte außerhalb dieses Bereichs können zu abrupten Qualitätsänderungen führen.
  3. Standardmäßig sendet der Videorenderer die Qualitätsmeldung an den Upstream-Ausgabepin (der mit seinem Eingabenadel verbundene Pin). Anwendungen können dieses Verhalten überschreiben, indem die SetSink--Methode aufgerufen wird.

Was als Nächstes geschieht, hängt vom Upstreamfilter ab. In der Regel ist dies ein Transformationsfilter. Die Basisklasse für Transformationsfilter ist CTransformFilter-, die die CTransformInputPin- und CTransformOutputPin Klassen verwendet, um Eingabe- und Ausgabe-Pins zu implementieren. Zusammen weisen diese Klassen das folgende Verhalten auf:

  1. Die CTransformOutputPin::Notify-Methode ruft CTransformFilter::AlterQualityauf, eine private Methode für die Filterbasisklasse.
  2. Abgeleitete Filter können AlterQuality- außer Kraft setzen, um die Qualitätsnachricht zu verarbeiten. Standardmäßig ignoriert AlterQuality die Qualitätsmeldung.
  3. Wenn AlterQuality- die Qualitätsnachricht nicht verarbeitet, ruft die Ausgabenadel CBaseInputPin::P assNotifyauf, eine private Methode für den Eingabenadel des Filters.
  4. PassNotify die Qualitätsnachricht an die entsprechende Stelle übergibt – den nächsten upstream-Ausgabe-Pin oder einen benutzerdefinierten Qualitätsmanager.

Vorausgesetzt, dass kein Transformationsfilter die Qualitätsnachricht verarbeitet, erreicht die Nachricht schließlich die Ausgabe-Pin für den Quellfilter. In den Basisklassen gibt CBasePin::Notify E_NOTIMPL zurück. Wie ein bestimmter Quellfilter Qualitätsmeldungen verarbeitet, hängt von der Art der Quelle ab. Einige Quellen, z. B. die Live-Videoaufnahme, können keine sinnvolle Qualitätskontrolle durchführen. Andere Quellen können die Rate anpassen, mit der sie Proben liefern.

Das folgende Diagramm veranschaulicht das Standardverhalten.

Qualitätskontrolle in den Basisklassen

Der Basisvideorenderer implementiert IQualityControl::Notify, was bedeutet, dass Sie Qualitätsmeldungen an den Renderer selbst übergeben können. Wenn Sie den Proportion Member auf einen Wert kleiner als 1000 festlegen, fügt der Videorenderer einen Wartezeitszeitraum zwischen jedem gerenderten Frame ein, wodurch der Renderer verlangsamt wird. (Sie können dies tun, um beispielsweise die Systemnutzung zu reduzieren.) Weitere Informationen finden Sie unter CBaseVideoRenderer::ThrottleWait. Das Festlegen der Proportion Element auf einen Wert größer als 1000 hat keine Auswirkung.

Quality-Control Management-