【发布时间】:2016-05-19 14:33:15
【问题描述】:
我正在寻找在游戏引擎中实现视频播放器,有效地解码视频文件并将结果渲染到 DirectX 11 中的纹理。不幸的是,我对如何做到这一点有点无知,但我发现MSDN 上的 ID3D11VideoDevice 类,但不知道如何使用它,我似乎无法在网上找到任何有用的示例/示例来展示它的使用方式。
我首先尝试使用以下代码查询接口哦我创建的 ID3D11Device:
ComPtr<ID3D11VideoDevice> video;
HRESULT hr = device->QueryInterface(__uuidof(ID3D11VideoDevice), &video);
但是我得到了 HRESULT E_NOINTERFACE,所以我猜我已经以无法将其转换为视频设备的方式创建了原始设备?要么这样要么这完全是错误的方法。所以我的问题是:
- 我的开始方式是否正确,如果正确,为什么会出现此错误?
- 是否有人知道任何有用的在线文档/示例可以解释这是如何完成的?
下面是我创建原始 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);
提前致谢。
【问题讨论】:
-
Direct3D 11 Video 接口非常低级,因此不建议直接使用它们来播放媒体。相反,您应该考虑使用 Media Foundation 或 3rd 方视频解决方案。
-
您在此处针对的 Windows 版本是什么? Windows 10、Windows 8.x、Windows 7?
-
@ChuckWalbourn 抱歉,它针对的是使用 Visual Studio 2013 的 Windows 7,Media Foundation 的级别不一样低吗?使用解码器、流等?我的理解是 WMF 是低级部分,使用 DirectX 将结果渲染到纹理是高级部分?
-
Direct3D 11 视频是非常低级的,由 Media Foundation 使用,因此是一个“更高”级别的 API。
-
好的,感谢您的澄清。
标签: windows c++11 directx-11 video-player