Bereitstellen eines benutzerdefinierten Allocator-Presenter für VMR-9

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

Führen Sie die folgenden Schritte aus, um einen benutzerdefinierten Zuweisungs-Presenter mit dem Filter Video Mixing Renderer 9 (VMR-9) zu verwenden:

  1. Implementieren Sie eine Klasse, die die Schnittstellen IVMRSurfaceAllocator9 und IVMRImagePresenter9 unterstützt.

  2. Rufen Sie QueryInterface für den VMR-9-Filter für die IVMRFilterConfig9-Schnittstelle auf.

  3. Rufen Sie die IVMRFilterConfig9::SetRenderingMode-Methode auf, und übergeben Sie das flag VMR9Mode_Renderless .

  4. QueryInterface für den VMR-9-Filter für die IVMRSurfaceAllocatorNotify9-Schnittstelle .

  5. Rufen Sie die IVMRSurfaceAllocatorNotify9::AdviseSurfaceAllocator-Methode auf, und übergeben Sie einen Zeiger an die IVMRSurfaceAllocator9-Methode Ihres Allocator-Presenters.

  6. Rufen Sie die IVMRSurfaceAllocator9::AdviseNotify-Methode Ihres Allocator-presenters auf, und übergeben Sie einen Zeiger auf die IVMRSurfaceAllocatorNotify9-Schnittstelle des VMR-9-Filters.

  7. Rufen Sie in Ihrer Implementierung von IVMRSurfaceAllocator9::AdviseNotifyIVMRSurfaceAllocatorNotify9::SetD3DDevice Pass in einem Zeiger auf das Direct3D-Gerät und einem Handle auf den Monitor auf, in dem das Video angezeigt wird.

  8. Erstellen Sie in Ihrer Implementierung der IVMRSurfaceAllocator9::InitializeDevice-Methode Direct3D-Oberflächen, die den Parametern entsprechen, die in der InitializeDevice-Methode angegeben sind. Optional können Sie die IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper-Methode des VMR-9-Filters verwenden, um diese Oberflächen zuzuordnen. Speichern Sie die Oberflächenzeiger in einem Array.

    Hinweis

    Wenn VMR-9 die Videoframes auf eine Texturoberfläche zeichnen soll, fügen Sie der VMR9AllocationInfo-Struktur das flag VMR9AllocFlag_TextureSurface hinzu. Wenn das Gerät Texturen im nativen Videoformat nicht unterstützt, müssen Sie möglicherweise eine separate Texturoberfläche erstellen und dann die Videoframes von der Videooberfläche in die Textur kopieren.

     

  9. Während des Streamings ruft VMR-9 Oberflächen vom Allocator-Presenter ab, indem die IVMRSurfaceAllocator9::GetSurface-Methode aufgerufen wird. VMR-9 gibt die Oberfläche durch ihren Index innerhalb des Oberflächenarrays an (Schritt 8).

  10. Zeigen Sie das Image an, wenn VMR-9 die IVMRImagePresenter9::P resentImage-Methode aufruft . Die Parameter enthalten einen Zeiger auf die Direct3D-Oberfläche, die das Videobild enthält.

  11. Wenn das Direct3D-Gerät zu einem beliebigen Zeitpunkt verloren geht, muss der Zuweisungs-Referenten das Gerät wiederherstellen und die Oberflächen neu erstellen. Beispielsweise kann das Gerät verloren gehen, wenn sich der Anzeigemodus ändert oder der Benutzer das Fenster auf einen anderen Monitor verschiebt. Wenn sich das Direct3D-Gerät ändert, rufen Sie die IVMRSurfaceAllocatorNotify9::ChangeD3DDevice-Methode des VMR-9-Filters auf.

  12. Wenn das Streaming beendet wird, ruft VMR-9 die IVMRSurfaceAllocator9::TerminateDevice-Methode auf. Der Zuteilungs-Referenten sollte alle Direct3D-Ressourcen freigeben.

Es gibt einige Unterschiede zwischen VMR-7 und VMR-9 in der Art und Weise, wie benutzerdefinierte Zuteilungs-Referenten verwaltet werden:

  • Die AllocateSurfaceHelper-Methode des VMR-9-Filters ist für den Allocator-Presenter verfügbar, um beim Zuweisen von Oberflächen zu verwenden. Diese Methode macht es für einen benutzerdefinierten Zuteilungs-Referenten nicht erforderlich, alle Aufrufe an den Standardzuteilungs-Presenter weiterzuleiten. Aus diesem Grund wird die CLSID des Standardzuweisungs-Presenters des VMR-9-Filters nicht veröffentlicht.
  • Im Gegensatz zu VMR-7 bietet die VMR-9 keinen speziellen DirectDraw-Exklusivmodus-Zuteilungs-Presenter. Die IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper-Methode macht dieses Objekt überflüssig.
  • Bei Interlaced-Videos wird das Video von VMR-9 immer unterbrochen, bevor das Bild angezeigt wird. Der Zuteilungs-Referenten ist nicht mehr dafür verantwortlich, das Bild vor der Anzeige zu entflechten.

RENDERLOSER VMR-Wiedergabemodus (Benutzerdefinierte Zuteilungs-Referenten)