2016-05-19 21 views
2

Ich bin auf der Suche nach einem Videoplayer innerhalb einer Game-Engine zu implementieren, effektiv eine Videodatei dekodieren und das Ergebnis zu einer Textur in DirectX 11 Rendern. Leider bin ich ein bisschen ratlos, wie das geht Ich habe die ID3D11VideoDevice-Klasse auf MSDN gefunden, aber ich habe keine Ahnung, wie man sie benutzt, und ich kann anscheinend keine brauchbaren Beispiele/Beispiele online finden, die zeigen, wie sie benutzt werden.DirectX 11 Videowiedergabe

Ich habe durch den Versuch abzufragen, um die Schnittstelle oh mein erstellt ID3D11Device mit dem folgenden Code gestartet:

ComPtr<ID3D11VideoDevice> video; 
HRESULT hr = device->QueryInterface(__uuidof(ID3D11VideoDevice), &video); 

Aber ich den HRESULT E_NOINTERFACE bekommen, so vermute ich, ich das ursprüngliche Gerät erstellt haben in so dass ich es nicht in ein Videogerät umwandeln kann? Entweder das oder das ist völlig falsch. Also meine Fragen wären:

  1. Wie ich richtig angefangen habe und wenn ja, warum bekomme ich diesen Fehler?
  2. Kennt irgendjemand irgendeine nützliche Dokumentation/Beispiele online, die erklären können, wie das gemacht wird?

Gerade als Referenz unten ist, wie ich das Original ID3D11Device bin zu schaffen:

std::vector<D3D_FEATURE_LEVEL> feature_levels = { 
    D3D_FEATURE_LEVEL_11_1, 
    D3D_FEATURE_LEVEL_11_0, 
    D3D_FEATURE_LEVEL_10_1, 
    D3D_FEATURE_LEVEL_10_0, 
    D3D_FEATURE_LEVEL_9_3, 
    D3D_FEATURE_LEVEL_9_2, 
    D3D_FEATURE_LEVEL_9_1 
}; 

UINT flags = 0; 
#if defined(DEBUG) || defined(_DEBUG) 
    flags |= D3D11_CREATE_DEVICE_DEBUG; 
#endif 

// Create D3D device 
HRESULT hr = D3D11CreateDevice(nullptr, 
    D3D_DRIVER_TYPE_HARDWARE, 
    0, 
    flags, 
    &feature_levels[0], 
    feature_levels.size(), 
    D3D11_SDK_VERSION, 
    &m_device, 
    &m_featureLevel, 
    &m_deviceContext); 

Vielen Dank im Voraus.

+0

Die Direct3D 11-Videoschnittstellen sind extrem low-level, daher wird die direkte Wiedergabe von Medien nicht empfohlen. Stattdessen sollten Sie Media Foundation oder eine Videolösung von Drittanbietern verwenden. –

+0

Auf welche Windows-Version zielen Sie hier? Windows 10, Windows 8.x, Windows 7? –

+0

@ChuckWalbourn Entschuldigung, es zielt auf Windows 7 mit Visual Studio 2013, ist Media Foundation nicht so niedrig? Verwenden von Decodern, Streams usw.? Mein Verständnis war WMF war der Low-Level-Teil und mit DirectX, um das Ergebnis zu einer Textur zu machen war der höhere Teil? – TheRarebit

Antwort

2

Mit dem Hinweis, dass Sie Windows 7 verwenden, haben Sie keinen Direct3D 11-Video-Support.

Die DirectX 11.1 Runtime kann unter Windows 7 Service Pack 1 über KB2670838 installiert werden, bietet jedoch nur die Softwarefunktionen per MSDN. Für jede Funktion, für die neue Hardwarefunktionen erforderlich sind, sind neue Treiber WDDM v1.2 erforderlich, die nur unter Windows 8.0 oder höher unterstützt werden.

Siehe DirectX 11.1 and Windows 7 und DirectX 11.1 and Windows 7 Update.

+0

Also im Grunde ID3D11VideoDevice Unterstützung ist nur für Windows 8? Wir sind in Service Packs usw. eingeschränkt, die auf der Zielhardware installiert werden können. – TheRarebit

+0

Windows 8.0, Windows 8.1 oder Windows 10. –

+0

OK großartig, danke für die Klarstellung, so effektiv scheint meine einzige Option zu sein, Windows Media Foundation zu verwenden, um einen Video-Stream zu öffnen und jeden Frame irgendwie in eine 2D-Textur zu dekodieren? Ich wollte nur klarstellen, da dies die Straße ist, die ich mit einem IMFSourceReader runtergefahren habe, der den Stream korrekt zu laden scheint, aber ich bin nur ein bisschen ratlos bei der Decodierung zu einem 2D-Texturschritt und will nur sichergehen Ich gehe den richtigen Weg und verschwende nicht meine Zeit. – TheRarebit