2016-05-19 7 views
2

Я ищу для реализации видеопроигрывателя в игровом движке, эффективно декодируя видеофайл и передавая результат текстуре в DirectX 11. К сожалению, я немного не знаю, как это сделать, но Я нашел класс ID3D11VideoDevice в MSDN, но понятия не имею, как его использовать, и я не могу найти полезные примеры/примеры в Интернете, которые показывают, как он используется.DirectX 11 Воспроизведение видео

Я начал, пытаясь запросить интерфейс ой мой созданный ID3D11Device со следующим кодом:

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

Но я получаю HRESULT E_NOINTERFACE, поэтому я предполагаю, что я создал оригинальное устройство в таким образом, что я не могу преобразовать его в видеоустройство? Либо это, либо это совсем не тот путь. Поэтому мои вопросы будут следующими:

  1. Как я начинаю правильно, и если да, то почему я получаю эту ошибку?
  2. Кто-нибудь знает какую-либо полезную документацию/образцы в Интернете, которые могут объяснить, как это делается?

Просто для справки ниже, как я создаю оригинальный ID3D11Device:

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); 

Спасибо заранее.

+0

Видеоинтерфейсы Direct3D 11 чрезвычайно низкоуровневые, поэтому их использование непосредственно для воспроизведения носителей не рекомендуется. Вместо этого вы должны посмотреть на использование Media Foundation или стороннего видео решения. –

+0

Какую версию Windows вы настраиваете здесь? Windows 10, Windows 8.x, Windows 7? –

+0

@ChuckWalbourn Извините, что он нацелен на Windows 7 с помощью Visual Studio 2013, не является ли Media Foundation столь же низким уровнем? Использование декодеров, потоков и т. Д.? Насколько я понимаю, WMF был частью низкого уровня, а использование DirectX для рендеринга результата для текстуры было частью более высокого уровня? – TheRarebit

ответ

2

С комментарием, говорящим, что вы используете Windows 7, по этой причине у вас нет поддержки видео Direct3D 11.

DirectX 11.1 Runtime может быть установлен в Windows 7 с пакетом обновления 1 (SP1) через KB2670838, но он предоставляет только программные функции за MSDN. Для любой функции, требующей новых аппаратных функций, требуются новые драйверы WDDM v1.2, которые поддерживаются только в Windows 8.0 или новее.

См. DirectX 11.1 and Windows 7 и DirectX 11.1 and Windows 7 Update.

+0

Итак, в основном поддержка ID3D11VideoDevice предназначена только для Windows 8? Мы ограничены в том, какие пакеты обновлений и т. Д. Могут быть установлены на целевом оборудовании. – TheRarebit

+0

Windows 8.0, Windows 8.1 или Windows 10. –

+0

Хорошо, спасибо за разъяснение, так что только мой единственный вариант - использовать Windows Media Foundation для открытия видеопотока и как-то декодирования каждого кадра в 2D-текстуре? Просто хотел уточнить, так как это дорога, с которой я пошел, используя IMFSourceReader, который, кажется, правильно загружает поток, но я просто немного озадачен декодированием на шаг 2D-текстуры и хочу просто убедиться, м, идя по этому правильному пути и не теряя времени. – TheRarebit