Wie benutze ich die Hardware-beschleunigte video - /H. 264 decoding mit directx 11 und windows 7?
Ich habe forschen den ganzen Tag und nicht bekommen, sehr weit. Ich bin auf windows 7 mit directx 11. (Meine Letzte Ausgabe ist um ein frame des Videos auf eine DX11-textur)
Ich entschlüsseln will, einige sehr große H. 264-video-Dateien, und die CPU (mit libav) nicht schneiden Sie es.
Habe ich mir angeschaut, die hwaccel Fähigkeiten von libav mit DXVA2, traf aber eine Straße zu blockieren, wenn ich Sie brauche zum erstellen einer IDirectXVideoDecoder, die können nur erstellt werden, mit D3D9-Schnittstelle. (die habe ich nicht mit DX11)
Immer wenn ich geschaut habe, bis DXVA-Dokumentation, die es nicht auf DX11, wurde dieses entfernt, in DX10 oder 11? (Finde keine Bestätigung dafür, noch irgendwo, der sagt, DXVA2 ist überflüssig, vielleicht, dass es schon superceeded durch DXVA-HD?)
Dann hab ich blickte in das media foundation SDK, wie das aussieht, was soll ich verwenden für DX11... Aber keiner von den Typen existieren in meinem Header (Die docs sagen, nur gehört , aber das bringt nichts). Sie geben außerdem ein minimum von windows 8 zu verwenden.
Ich glaube, MF-brauche ich das SDK für windows 8, die jetzt enthält alle directx-libs/Header.
Also dies hinterlässt eine Lücke, die mit windows 7... Ist es möglich, hardware-beschleunigte video-Decodierung? und wenn ja, welche API soll ich verwenden?
InformationsquelleAutor der Frage Soylent Graham | 2013-11-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
D3D11 features, die ein video-api, die im Grunde ist DXVA2 mit einer leicht veränderten Oberfläche vor.
Sie brauchen ein gutes Verständnis von h.264 bitstreams zu fahren (wirklich!). also stellen Sie sicher, Sie haben ein h ist.264 parser an die hand zu extrahieren Bereichen der SPS-und PPS-Strukturen und alle Scheiben kodierter Rahmen.
1) Erhalten ID3D11VideoDevice Instanz von Ihrem ID3D11Device, und ID3D11VideoContext aus Ihrer unmittelbaren D3D11 Gerät Kontext
HINWEIS: Auf Win7, die Sie haben, um Ihr Gerät mit feature level 9_3 um video-Unterstützung! (In Win8 funktioniert es einfach)
2) Erstellen Sie eine ID3D11VideoDecoder Instanz für h.264
Verwenden ID3D11VideoDevice::GetVideoDecoderProfileCount, GetVideoDecoderProfile, CheckVideoDecodeRFormat...
Durchlaufen alle unterstützten profile und finden, mit GUID D3D11_DECODER_PROFILE_H264_VLD_NOFGT
für h264 ohne filmgrain. Als OutputFormat Ihre beste Wette ist, DXGI_FORMAT_NV12.
3) Dekodieren der einzelnen frames sehen Unterstützung der Direct3D-11-Video-Decodierung in Media Foundation:
Die Puffer gefüllt sind mit den entsprechenden DXVA2 Strukturen (siehe dxva2.h)
Die full-DXVA2-spec ist hier, du wirst es brauchen, um die Karte h.264 sps/pps-Felder entsprechend.
Finden Sie unter:
Dann:
3) D3D11_VIDEO_DECODER_BUFFER_PICTURE_PARAMETERS Puffer enthält auch Informationen über alle Referenzen frames/Oberfläche
- Sie brauchen, um Sie zu verwalten sich selbst, D. H. sicherstellen, dass die Oberflächen/Texturen sind verfügbar auf der GPU!
Es ist ziemlich kompliziert, check ffmpeg und Media Player Classic haben Sie beide DXVA2 (wenn auch nicht über DX11) unterstützen.
4) Konvertieren von NV12, RGB(Ein), einige GPUs (D3D11 feature Level) zu verwenden NV12 als shader-input, einige nicht. Im Fall ist es nicht möglich, NV12 direkt an, haben Sie einen Blick auf die D3D11VideoProcessor-Schnittstellen, die Funktion NV12/YUV420->RGB-Konvertierung für alle GPUs mit D3D11 unterstützen.
Die Umwandlung kann durchgeführt werden im code wie folgt:
InformationsquelleAutor der Antwort youaresoomean
Als follow-up, ich bin derzeit mit MediaFoundation mit windows 7,8 und 10, die mit directx(oder nur Windows SDK bei 8+)
Unterstützt es weit weniger Formate (oder vielmehr Auflösungen/Profil-Stufen) und derzeit ich bin mir nicht ganz sicher, ob es hardware-Beschleunigung verwenden oder nicht...
Aber dieser API kompatibel ist, welches die ursprüngliche Abfrage
InformationsquelleAutor der Antwort Soylent Graham
Können Sie nicht.
ID3D11VideoDevice ist nur verfügbar für windows 8 ID3D11VideoDevice.
ID3D11VideoDecoder ist nur verfügbar für windows 8 ID3D11VideoDecoder.
Auf windows 7, die Sie gerade verwenden können, directx 9 für die hardwarebeschleunigte video/H. 264. Dank Microsoft. Das gute neue, IDirect3D9Ex funktioniert... ja...
Die andere gute Nachricht, die GPU-decoding-performance ist sehr gut mit DirectX9 auf Windows 7.
Hier ist ein source-code für windows 7 und DirectX 9 : mofo7777unter H264Dxva2Decoder Projekt.
InformationsquelleAutor der Antwort mofo77