Benutzerdefinierte Mixer

Die auf dieser Seite beschriebene Komponente, Erweiterter Videorenderer, 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.]

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-Mediensenke 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 vom Upstream. Der Ausgabedatenstrom liefert Beispiele an den Referenten. Der EVR ist für das Aufrufen von IMFTransform::ProcessInput auf dem Mixer verantwortlich und der Referent ist für das Aufrufen von IMFTransform::ProcessOutput verantwortlich.

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 MF_SA_D3D_AWARE-Attribut für das 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 des 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:

  1. Der EVR legt den Medientyp für den Referenzdatenstrom fest.

  2. Der EVR ruft IMFVideoPresenter::ProcessMessage für den Moderator mit der Nachricht MFVP_MESSAGE_INVALIDATEMEDIATYPE auf.

  3. Der Referent legt den Medientyp im Ausgabedatenstrom des Mixers fest.

  4. 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::ProcessOutput-Methode des Mixers schlägt dann fehl und gibt MF_E_TRANSFORM_STREAM_CHANGE zurück. Der Referent sollte an diesem Punkt nichts tun. Der EVR initiiert den Formatverhandlungsprozess erneut.

Wenn ein Eingabedatenstrom das Ende des Datenstroms erreicht, ruft der EVR IMFTransform::ProcessMessage auf dem Mixer mit MFT_MESSAGE_NOTIFY_END_OF_STREAM auf.

Der Mixer sendet die folgenden Ereignisse mithilfe der IMediaEventSink-Schnittstelle des EVR an den 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 ProcessOutput möglicherweise 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üllbeispiele 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.

Sowohl der Standardmixer als auch der Referenten verwenden Direct3D 9, wobei die Geräte-GUID gleich IID_IDirect3DDevice9 ist. Wenn Sie den benutzerdefinierten Referenten mit dem Standardmixer verwenden möchten, muss die Geräte-GUID des Referenten IID_IDirect3DDevice9 lauten. 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 der 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::ReleaseServicePointers aufruft, muss der Mixer alle Zeiger freigeben, die vom Aufruf an InitServicePointers abgerufen werden.

Mixerattribute

Ein Mixer sollte die folgenden Attribute unterstützen.

attribute 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

Um einen benutzerdefinierten Mixer für den EVR festzulegen, rufen Sie IMFVideoRenderer::InitializeRenderer auf. Sowohl der DirectShow EVR-Filter als auch die EVR-Mediensenke implementieren diese Methode.

EVR-Aktivierungsobjekt. 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:

attribute 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.

 

Verbesserter Videorenderer