Benutzerdefinierte Mixer
[Die auf dieser Seite beschriebene Komponente, enhanced Video Renderer, ist ein Legacyfeature. Es wurde durch den simple Video Renderer (SVR) ersetzt, der über die MediaPlayer- und IMFMediaEngine-komponenten verfügbar gemacht wird. 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- oder die untere Ebene IMFMediaEngine-APIs zum Wiedergeben von Videomedien in Windows anstelle des EVR verwendet. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, um die neuen APIs zu verwenden, falls möglich umgeschrieben werden.]
In diesem Thema wird beschrieben, wie Sie einen benutzerdefinierten Mixer für den erweiterten Videorenderer (EVR) schreiben. Sie können einen benutzerdefinierten Mixer entweder mit der Media Foundation EVR-Medienspüle oder dem DirectShow EVR-Filter verwenden. Weitere Informationen zu Mixern und Referenten finden Sie unter Enhanced Video Renderer.
Der Mixer ist eine Media Foundation-Transformation (MFT) mit einem oder mehreren Eingaben (dem Referenzdatenstrom plus den Unterstreams) und einer Ausgabe. Der Eingabedatenstrom empfängt Beispiele von upstream. Der Ausgabedatenstrom liefert Beispiele an den Referenten. Der EVR ist für das Aufrufen IMFTransform::P rocessInput auf dem Mixer verantwortlich, und der Referent ist für das Aufrufen von IMFTransform::P rocessOutputverantwortlich.
Mindestens muss ein EVR-Mischer die folgenden Schnittstellen implementieren:
Schnittstelle | Beschreibung |
---|---|
IMFTransform- | Stellt die Basis-MFT-Funktionalität bereit. |
IMFTopologyServiceLookupClient- | Ermöglicht dem Mixer das Abrufen von Schnittstellen vom EVR. |
IMFVideoDeviceID- | Ermöglicht dem Mixer das Abrufen von Schnittstellen vom EVR. |
IMFAttributes- | Wird verwendet, um das attribut MF_SA_D3D_AWARE dem EVR verfügbar zu machen. |
Optional kann ein MFT eine der folgenden Schnittstellen implementieren:
Schnittstelle | Beschreibung |
---|---|
IEVRTrustedVideoPlugin | Erforderlich für die Wiedergabe geschützter Inhalte. |
IMFGetService- | Macht Schnittstellen wie IMFVideoMixerBitmap und IMFVideoProcessor- für die Anwendung verfügbar. |
IMFQualityAdvise | Ermöglicht dem Qualitätsmanager, die Videoqualität anzupassen. |
IMFVideoMixerBitmap- | Ermöglicht der Anwendung das Kombinieren einer statischen Bitmap auf dem Video. |
IMFVideoPositionMapper | Ordnet Koordinaten für den Ausgabevideoframe zu, um Koordinaten für den Eingabevideoframe zu erstellen. |
IMFVideoProcessor- | Macht einige DXVA-Videoverarbeitungsfeatures für die Anwendung verfügbar. |
Die Formatverhandlung mit dem Mixer funktioniert wie folgt:
Der EVR legt den Medientyp für den Referenzdatenstrom fest.
Die EVR ruft IMFVideoPresenter::P rocessMessage- für den Referenten mit der MFVP_MESSAGE_INVALIDATEMEDIATYPE Nachricht auf.
Der Referenten legt den Medientyp im Ausgabedatenstrom des Mixers fest.
Der EVR legt den Medientyp für die Unterstreams fest.
Wenn sich der Medientyp im Referenzdatenstrom ändert, sind die anderen Medientypen des Mixers nicht mehr gültig. Die IMFTransform::P rocessOutput-Methode des Mixers schlägt dann fehl und gibt MF_E_TRANSFORM_STREAM_CHANGEzurück. Der Referent sollte an diesem Punkt nichts tun. Der EVR initiiert den Formatverhandlungsprozess erneut.
Wenn ein Eingabedatenstrom das Ende des Datenstroms erreicht, ruft die EVR IMFTransform::P rocessMessage auf dem Mixer mit MFT_MESSAGE_NOTIFY_END_OF_STREAMauf.
Der Mixer sendet die folgenden Ereignisse an den EVR unter Verwendung der IMediaEventSink Schnittstelle des EVR. Diese Schnittstelle ist in der DirectShow SDK-Dokumentation dokumentiert.
Ereignis | Beschreibung |
---|---|
EC_SAMPLE_NEEDED | Für den Mixer ist ein neues Eingabebeispiel erforderlich. |
Der EVR ruft möglicherweise ProcessOutput- auf dem Mixer auf, bevor das Streaming gestartet wird. Der Mixer sollte diese Aufrufe nicht fehlschlagen. Stattdessen sollte die Ausgabeoberfläche mit schwarzen Pixeln gefüllt werden. Der Mixer sollte weiterhin farbfüllende Ausgabebeispiele verwenden, bis er eine MFT_MESSAGE_NOTIFY_BEGIN_STREAMING Nachricht empfängt oder die ProcessInput--Methode aufgerufen wird. Wenn der Mixer eine MFT_MESSAGE_NOTIFY_END_STREAMING Nachricht empfängt, sollte er wieder in den Farbfüllmodus wechseln.
Implementieren von IMFVideoDeviceID
Die IMFVideoDeviceID- Schnittstelle enthält eine Methode, GetDeviceID, die eine Geräte-GUID zurückgibt. Die Geräte-GUID stellt sicher, dass der Referent und der Mixer kompatible Technologien verwenden. Wenn die Geräte-GUIDs nicht übereinstimmen, kann der EVR nicht initialisiert werden.
Der Standardmischer und Der Referenten verwenden beide Direct3D 9, wobei die Geräte-GUID gleich IID_IDirect3DDevice9 ist. Wenn Sie den benutzerdefinierten Referenten mit dem Standardmischer verwenden möchten, muss die Geräte-GUID des Referenten IID_IDirect3DDevice9 werden. Wenn Sie beide Komponenten ersetzen, können Sie eine neue Geräte-GUID definieren.
Implementieren von IMFTopologyServiceLookupClient
Der Mixer muss die IMFTopologyServiceLookupClient Schnittstelle implementieren. Bevor das Streaming beginnt, ruft das EVR IMFTopologyServiceLookupClient::InitServicePointers auf und übergibt einen Zeiger an die IMFTopologyServiceLookup Schnittstelle des EVR. Der Mixer verwendet diesen Zeiger, um Schnittstellenzeiger aus dem EVR abzurufen.
Mindestens muss der Mixer die folgende Schnittstelle abfragen:
Wenn der EVR IMFTopologyServiceLookupClient::ReleaseServicePointersaufruft, muss der Mixer alle Zeiger freigeben, die vom Aufruf an InitServicePointersabgerufen werden.
Mixerattribute
Ein Mixer sollte die folgenden Attribute unterstützen.
Attribut | Beschreibung |
---|---|
MF_SA_D3D_AWARE | Gibt an, ob der Mixer DirectX Video Acceleration (DXVA) unterstützt. |
MF_SA_REQUIRED_SAMPLE_COUNT | Die Anzahl der Videobeispiele, die der EVR für jeden Mixerdatenstrom zuordnen sollte. Dieses Attribut gilt für einzelne Datenströme; verwenden Sie den von IMFTransform::GetInputStreamAttributeszurückgegebenen Attributspeicher. |
Festlegen des Mixers auf dem EVR
Rufen Sie zum Festlegen eines benutzerdefinierten Mixers auf dem EVR IMFVideoRenderer::InitializeRendererauf. Sowohl der DirectShow EVR-Filter als auch die EVR-Mediensenke implementieren diese Methode.
EVR Activation Object. Wenn Sie das EVR-Aktivierungsobjekt verwenden, können Sie einen benutzerdefinierten Mixer bereitstellen, indem Sie eines der folgenden Attribute für das EVR-Aktivierungsobjekt festlegen:
Attribut | Beschreibung |
---|---|
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_ACTIVATE | Zeigen Sie auf ein Aktivierungsobjekt für den Mixer. Das Aktivierungsobjekt muss die IMFActivate Schnittstelle implementieren. |
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_CLSID | CLSID des Mixers. |
Verwandte Themen