Verwenden der Videomixer-Steuerelemente
[Die auf der Seite Erweiterter Videorenderer beschriebene Komponente ist ein Legacyfeature. Sie wurde durch den Simple Video Renderer (SVR) abgelöst, der über die Komponenten MediaPlayer und IMFMediaEngine verfügbar gemacht wurde. Um Videoinhalte wiederzugeben, sollten Sie Daten an eine dieser Komponenten senden und es ihnen ermöglichen, den neuen Videorenderer zu instanziieren. Diese Komponenten wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code MediaPlayer-APIs oder die IMFMediaEngine-APIs auf niedrigerer Ebene verwendet, um Videomedien in Windows anstelle des EVR wiederzugeben. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, wenn möglich umgeschrieben wird, um die neuen APIs zu verwenden.]
Der EVR-Mixer bietet mehrere Schnittstellen, mit denen eine Anwendung steuern kann, wie der Mixer Video verarbeitet. Diese Schnittstellen können entweder in DirectShow oder Media Foundation verwendet werden.
Schnittstelle | Beschreibung |
---|---|
IMFVideoMixerBitmap-Schnittstelle | Alpha blendet ein statisches Bitmapbild in das Video ein. |
IMFVideoMixerControl-Schnittstelle | Steuert, wie der EVR Videounterstreams mischt. |
IMFVideoProcessor-Schnittstelle | Steuert die Farbanpassung, Bildfilter und andere Videoverarbeitungsfunktionen. Diese Schnittstelle bietet Zugriff auf vom Grafiktreiber implementierte Funktionalität, sodass die genauen Funktionen vom Grafiktreiber des Benutzers abhängen. |
Die richtige Methode zum Abrufen von Zeigern auf diese Schnittstellen hängt davon ab, ob Sie die DirectShow-Version des EVR oder der Media Foundation-Version verwenden. Beim Media Foundation EVR hängt es auch davon ab, ob Sie das EVR direkt oder über die Mediensitzung verwenden. (In der Regel verwendet eine Anwendung das EVR über die Mediensitzung und nicht direkt).
Gehen Sie wie folgt vor, um einen Zeiger auf eine dieser Schnittstellen zu erhalten:
Rufen Sie einen Zeiger auf die IMFGetService-Schnittstelle auf dem EVR ab.
Wenn Sie den DirectShow EVR-Filter verwenden, rufen Sie QueryInterface für den Filter auf.
Wenn Sie die EVR-Mediensenke direkt verwenden, rufen Sie QueryInterface auf der Mediensenke auf.
Wenn Sie die Mediensitzung verwenden, rufen Sie QueryInterface in der Mediensitzung auf.
Wenn Sie die Mediensitzung verwenden, warten Sie, bis die Mediensitzung das MESessionTopologyStatus-Ereignis mit dem Statuswert MF_TOPOSTATUS_READY sendet. (Überspringen Sie diesen Schritt, wenn Sie die Mediensitzung nicht verwenden.)
Rufen Sie IMFGetService::GetService auf, um die Mixerschnittstelle abzurufen. Verwenden Sie den Dienstbezeichner MR_VIDEO_MIXER_SERVICE.
Alphablending einer Bitmap auf dem Video
Sie können die IMFVideoMixerBitmap-Schnittstelle verwenden, um während der Wiedergabe eine statische Bitmap auf das Video zu mischen. Sie können die Bitmap in einer Direct3D-Oberfläche speichern, die als IDirect3DSurface9-Zeiger angegeben ist, oder eine GDI-Bitmap verwenden.
Wenn Sie eine Direct3D-Oberfläche für die Bitmap verwenden, kann die Oberfläche Alphadaten pro Pixel enthalten, die verwendet werden, wenn der Mixer ein Alphablending des Bildes durchführt. Alternativ können Sie einen Farbschlüssel definieren, d. h. eine einzelne Farbe, die transparent ist, unabhängig davon, wo sie in der Bitmap angezeigt wird. Außerdem können Sie einen Alphawert angeben, der auf das gesamte Bild angewendet wird. Sie können auch ein Quellrechteck festlegen, um die Bitmap zuzuschneiden, und ein Zielrechteck, um die Bitmap innerhalb des Videoframes zu positionieren.
Rufen Sie zum Festlegen der Bitmap IMFVideoMixerBitmap::SetAlphaBitmap auf. Diese Methode verwendet einen Zeiger auf eine MFVideoAlphaBitmap-Struktur, die die Bitmap und die Alphablending-Parameter angibt. Beispielcode finden Sie im Referenzthema für die SetAlphaBitmap-Methode.
Nachdem Sie die Bitmap festgelegt haben, können Sie die Blendingparameter einschließlich der Quell- und Zielrechtecke aktualisieren, indem Sie IMFVideoMixerBitmap::UpdateAlphaBitmapParameters aufrufen. Die Aktualisierung wird beim nächsten Videoframe wirksam. Das Video muss wiedergegeben werden, damit das Update ausgeführt wird. Mit dieser Methode können Sie einfache Animationen für die Bitmap ausführen. (Wenn Sie anspruchsvollere Effekte benötigen, sollten Sie einen benutzerdefinierten EVR-Mixer schreiben.)
Rufen Sie zum Löschen der Bitmap IMFVideoMixerBitmap::ClearAlphaBitmap auf.
Steuern von Unterstreams
Das EVR kann einen oder mehrere Videounterstreams in den primären Videostream mischen. Verwenden Sie zum Steuern des Substreammischens die IMFVideoMixerControl-Schnittstelle.
Rufen Sie IMFVideoMixerControl::SetStreamOutputRect auf, um die Position eines Unterstreams innerhalb des zusammengesetzten Videoframes festzulegen.
Rufen Sie IMFVideoMixerControl::SetStreamZOrder auf, um die Z-Reihenfolge für die Unterstreams festzulegen. Das EVR zeichnet die Videodatenströme in der Reihenfolge ihrer Z-Reihenfolge, beginnend mit Null. Der primäre Videostream ist immer zuerst in der Z-Reihenfolge.
Videoprozessoreinstellungen
Der EVR-Mixer verwendet DirectX Video Acceleration (DXVA), um die Videoverarbeitung für die Eingabedatenströme durchzuführen. Die genauen Verarbeitungsfunktionen hängen vom Grafiktreiber ab. Videoverarbeitungsfunktionen werden mithilfe der DXVA2_VideoProcessorCaps-Struktur beschrieben. Eine bestimmte Gruppe von Funktionen wird als Videoverarbeitungsmodus bezeichnet, wobei jeder Modus durch eine GUID identifiziert wird. Eine Liste vordefinierter GUIDs finden Sie unter IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids. Der Treiber definiert möglicherweise zusätzliche herstellerspezifische GUIDs, die unterschiedliche Kombinationen von Funktionen darstellen.
Gehen Sie wie folgt vor, um die unterstützten Modi und die Funktionen der einzelnen Modi zu finden:
Rufen Sie IMFGetService::GetService auf, um einen Zeiger auf die IMFVideoProcessor-Schnittstelle des Mixers abzurufen.
Rufen Sie IMFVideoProcessor::GetAvailableVideoProcessorModes auf. Diese Methode gibt ein Array von GUIDs zurück, die die verfügbaren Videoprozessormodi identifizieren. Die Liste wird in absteigender Qualität zurückgegeben, wobei der Modus mit der höchsten Qualität zuerst in der Liste angezeigt wird. Die Liste kann je nach Format des Videos geändert werden.
Rufen Sie für jede GUID in der Liste IMFVideoProcessor::GetVideoProcessorCaps auf, um die Funktionen des entsprechenden Videoprozessormodus zu finden. Die Methode füllt eine DXVA2_VideoProcessorCaps-Struktur mit einer Beschreibung der Funktionen.
Um einen Modus auszuwählen, rufen Sie IMFVideoProcessor::SetVideoProcessorMode auf. Andernfalls wählt das EVR automatisch einen Modus aus, wenn das Streaming beginnt. In diesem Fall können Sie IMFVideoProcessor::GetVideoProcessorMode aufrufen, um zu suchen, welcher Modus ausgewählt wurde.
Die meisten Felder in der DXVA2_VideoProcessorCaps-Struktur beschreiben das Verhalten von Treibern auf niedriger Ebene und sind für eine typische Anwendung nicht von Interesse. Die folgenden Felder sind wahrscheinlich von Interesse:
DeviceCaps. Dieses Feld gibt an, ob die Videoverarbeitung in Hardware oder Software ausgeführt wird und ob der Grafiktreiber ein älterer DXVA 1.0-Treiber ist.
DeinterlaceTechnology. Dieses Feld enthält einige Hinweise darauf, welchen Grad der Deinterlacingqualität Sie erwarten können, wenn das Quellvideo interlaced ist.
ProcAmpControlCaps. Dieses Feld gibt an, welche Farbanpassungssteuerelemente verfügbar sind. Eine Liste der möglichen Farbanpassungen finden Sie unter ProcAmp-Einstellungen. Wenn der Treiber keine Farbanpassung durchführen kann, ist dieses Feld null.
VideoProcessorOperations. Dieses Feld enthält Flags, die verschiedene Videoverarbeitungsfunktionen beschreiben. Zwei Kennzeichen von besonderer Bedeutung sind DXVA2_VideoProcess_SubStreams und DXVA2_VideoProcess_SubStreams. Mindestens eines dieser Kennzeichen muss vorhanden sein, damit das EVR Teilstreams in den Referenzvideostream mischen kann. Wenn kein Kennzeichen vorhanden ist, ist das EVR auf einen Videostream beschränkt.
NoiseFilterTechnology. Dieses Feld gibt an, welche Rauschfilter vom Grafiktreiber unterstützt werden. Wenn der Treiber die Rauschfilterung nicht unterstützt, ist der Wert DXVA2_NoiseFilterTech_Unsupported.
DetailFilterTechnology. Dieses Feld gibt an, welche Rauschfilter vom Grafiktreiber unterstützt werden. Wenn der Treiber die Rauschfilterung nicht unterstützt, ist der Wert DXVA2_NoiseFilterTech_Unsupported.
Farbanpassung und Bildfilterung
Der Grafiktreiber unterstützt möglicherweise die Farbanpassung (auch als Prozessverstärkung oder einfach ProcAmp bezeichnet) und Bildfilterung. Wenn die GPU ausgeführt wird, können Farbanpassungen und Bildfilterung in Echtzeit ohne CPU-Aufwand durchgeführt werden.
Führen Sie die folgenden Schritte aus, um diese Features zu verwenden:
Wählen Sie einen Videoverarbeitungsmodus aus, wie im vorherigen Abschnitt beschrieben.
Rufen Sie IMFVideoProcessor::GetVideoProcessorCaps auf, um die Videoverarbeitungsfunktionen zu finden, wie im vorherigen Abschnitt beschrieben. Die Methode füllt eine DXVA2_VideoProcessorCaps-Struktur aus, die die Funktionen beschreibt, einschließlich der Unterstützung der Farbanpassung und des Bildfilters vom Treiber.
Rufen Sie für jede Farbanpassung, die vom Treiber unterstützt wird, IMFVideoProcessor::GetProcAmpRange auf, um den möglichen Wertbereich für diese Einstellung zu finden. Diese Methode gibt auch den Standardwert für die Einstellung zurück. Rufen Sie IMFVideoProcessor::GetProcAmpValues auf, um den aktuellen Wert der Einstellungen zu finden. Die Werte haben keine angegebenen Einheiten. Der Treiber definiert den Wertebereich.
Rufen Sie IMFVideoProcessor::SetFilteringValue auf, um einen Farbanpassungswert festzulegen.
Wenn der Treiber die Bildfilterung unterstützt, unterstützt jeder Filtertyp (Rauschen und Details) drei Einstellungen – Ebene, Radius und Schwellenwert – sowohl in Chroma als auch Luma. (Siehe DXVA-Bildfiltereinstellungen.) Rufen Sie für jede Einstellung IMFVideoProcessor::GetFilteringRange auf, um den Bereich möglicher Werte abzurufen und IMFVideoProcessor::GetFilteringValue, um den aktuellen Wert abzurufen.
Rufen Sie zum Ändern einer Bildfiltereinstellung IMFVideoProcessor::SetFilteringValue auf.
Zugehörige Themen