Share via


Verwenden der Videoanzeigesteuerelemente

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

Die IMFVideoDisplayControl-Schnittstelle steuert, wie der erweiterte Videorenderer (EVR) Video in einem Anwendungsfenster anzeigt. Diese Schnittstelle kann entweder in DirectShow oder Media Foundation verwendet werden. Intern werden die Videoanzeigesteuerelemente vom Standardreferenten des EVR bereitgestellt. Wenn Sie einen benutzerdefinierten Referenten schreiben, können Sie dieselbe Schnittstelle bereitstellen oder eine benutzerdefinierte Schnittstelle definieren.

Die richtige Methode zum Abrufen eines Zeigers auf die IMFVideoDisplayControl-Schnittstelle hängt davon ab, ob Sie die DirectShow-Version des EVR oder der Media Foundation-Version verwenden. Für den Media Foundation EVR hängt es auch davon ab, ob Sie den EVR direkt oder über die Mediensitzung verwenden (was üblicher ist).

Gehen Sie wie folgt vor, um einen Zeiger auf die IMFVideoDisplayControl-Schnittstelle abzurufen:

  1. Rufen Sie einen Zeiger auf die IMFGetService-Schnittstelle 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.

  2. Wenn Sie die Mediensitzung verwenden, warten Sie, bis die Mediensitzung das MESessionTopologyStatus-Ereignis mit dem Statuswert MF_TOPOSTATUS_READY sendet. (Überspringen Sie diesen Schritt andernfalls.)

  3. Rufen Sie IMFGetService::GetService auf, um die IMFVideoDisplayControl-Schnittstelle abzurufen. Der Dienstbezeichner ist MR_VIDEO_RENDER_SERVICE.

Sie können die IMFVideoDisplayControl-Schnittstelle verwenden, um die folgenden Aufgaben auszuführen:

  • Legen Sie das Clippingfenster fest.

  • Legen Sie die Quell- und Zielrechtecke fest.

  • Aktualisieren Sie das Videofenster als Reaktion auf Fenstermeldungen.

  • Aktivieren oder Deaktivieren des Vollbildmodus.

Clippingfenster

Die Anwendung muss ein Fenster bereitstellen, in dem der EVR das Video anzeigt. Um das Clippingfenster festzulegen, rufen Sie IMFVideoDisplayControl::SetVideoWindow mit einem Handle für das Anwendungsfenster auf.

Wenn Sie die EVR-Mediensenke durch das Aktivierungsobjekt erstellen, ist dieser Schritt nicht erforderlich. Das Aktivierungsobjekt ruft automatisch SetVideoWindow auf, wobei das Fensterhandle verwendet wird, das Sie in der Funktion MFCreateVideoRendererActivate bereitgestellt haben.

Quell- und Zielrechtecke

Während der Wiedergabe übernimmt der Referent einen Teil des zusammengesetzten Videobilds und zeichnet es auf einen Bereich des Videofensters. Der Teil des zusammengesetzten Bilds ist das Quellrechteck und der Bereich des Videofensters ist das Zielrechteck.

Das Quellrechteck wird mithilfe normalisierter Koordinaten definiert, wobei der Punkt (0,0 / 0,0) der oberen linken Ecke des Videos entspricht und (1,0 / 1,0) der unteren rechten Ecke des Videos entspricht. Das Quellrechteck kann ein beliebiger Bereich innerhalb dieses Rechtecks sein. Das Zielrechteck wird in Pixeln relativ zum Clientbereich des Fensters angegeben. Das Standardquellrechteck ist das gesamte Bild und das Standardzielrechteck ist ein leeres Rechteck.

Um die Quell- und Zielrechtecke festzulegen, rufen Sie IMFVideoDisplayControl::SetVideoPosition auf.

Wenn Sie die EVR-Mediensenke durch das Aktivierungsobjekt erstellen, ist dieser Schritt nicht erforderlich. Das Aktivierungsobjekt legt das Zielrechteck automatisch auf den gesamten Clientbereich des Fensters fest. Sie sollten jedoch SetVideoPosition aufrufen, wenn Sie das Quellrechteck ändern oder ein anderes Zielrechteck festlegen möchten.

Fenstermeldungen

Während der Wiedergabe sollte Ihre Anwendung wie folgt auf bestimmte Fenstermeldungen reagieren:

  • WM_PAINT: Rufen Sie IMFVideoDisplayControl::RepaintVideo auf, um das Video neu zu aktualisieren. Vermeiden Sie außerdem das Zeichnen über das Zielrechteck, während das Video wiedergegeben wird, da dies zu Flimmern führen kann.

  • WM_SIZE: Möglicherweise müssen Sie SetVideoPosition aufrufen, um die Größe des Zielrechtecks zu ändern.

Im Gegensatz zum VMR-Filter (Video Mixing Renderer) in DirectShow müssen Sie den EVR nicht benachrichtigen, wenn Sie eine WM_DISPLAYCHANGE Nachricht erhalten.

Verbesserter Videorenderer