Standardqualitätskontrolle
[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]
Die DirectShow-Basisklassen implementieren einige Standardverhaltensweisen für die Videoqualitätskontrolle.
Qualitätsmeldungen beginnen am Renderer. Die Basisklasse für Videorenderer ist CBaseVideoRenderer, die das folgende Verhalten aufweist:
- Wenn der Videorenderer ein Beispiel empfängt, vergleicht er den Zeitstempel für das Beispiel mit der aktuellen Referenzzeit.
- Der Videorenderer generiert eine Qualitätsnachricht. In der Basisklasse ist der Proportion-Member 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.
- Standardmäßig sendet der Videorenderer die Qualitätsmeldung an den Upstream Ausgabenadel (der mit seinem Eingabenadel verbundene Pin). Anwendungen können dieses Verhalten überschreiben, indem sie die SetSink-Methode aufrufen.
Was als Nächstes geschieht, hängt vom Upstream-Filter ab. In der Regel handelt es sich hierbei um einen Transformationsfilter. Die Basisklasse für Transformationsfilter ist CTransformFilter, die die Klassen CTransformInputPin und CTransformOutputPin verwendet, um Eingabe- und Ausgabepins zu implementieren. Zusammen weisen diese Klassen das folgende Verhalten auf:
- Die CTransformOutputPin::Notify-Methode ruft CTransformFilter::AlterQuality auf, eine private Methode für die Filterbasisklasse.
- Abgeleitete Filter können AlterQuality überschreiben, um die Qualitätsmeldung zu verarbeiten. Standardmäßig ignoriert AlterQuality die Qualitätsmeldung.
- Wenn AlterQuality die Qualitätsmeldung nicht verarbeitet, ruft die Ausgabenadel CBaseInputPin::P assNotify auf, eine private Methode für den Eingabenadel des Filters.
- PassNotify übergibt die Qualitätsnachricht an die geeignete Stelle – den nächsten Upstream Ausgabenadel oder einen benutzerdefinierten Qualitätsmanager.
Wenn kein Transformationsfilter die Qualitätsmeldung verarbeitet, erreicht die Nachricht schließlich den Ausgabenadel des Quellfilters. 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. Livevideoaufnahmen, können keine aussagekräftige Qualitätskontrolle durchführen. Andere Quellen können die Rate anpassen, mit der sie Beispiele liefern.
Das folgende Diagramm veranschaulicht das Standardverhalten.
Der Basis-Videorenderer 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 eine Wartezeit zwischen jedem frame ein, den er rendert, was den Renderer verlangsamt. (Sie können dies beispielsweise tun, um die Systemauslastung zu reduzieren.) Weitere Informationen finden Sie unter CBaseVideoRenderer::ThrottleWait. Das Festlegen des Proportion-Elements auf einen Wert größer als 1000 hat keine Auswirkung.
Zugehörige Themen