【问题标题】:DirectX 11 Video PlaybackDirectX 11 视频播放
【发布时间】:2016-05-19 14:33:15
【问题描述】:

我正在寻找在游戏引擎中实现视频播放器,有效地解码视频文件并将结果渲染到 DirectX 11 中的纹理。不幸的是,我对如何做到这一点有点无知,但我发现MSDN 上的 ID3D11VideoDevice 类,但不知道如何使用它,我似乎无法在网上找到任何有用的示例/示例来展示它的使用方式。

我首先尝试使用以下代码查询接口哦我创建的 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);

提前致谢。

【问题讨论】:

  • 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


【解决方案1】:

评论中提到您使用的是 Windows 7,这就是您没有 Direct3D 11 视频支持的原因。

DirectX 11.1 Runtime 可以通过KB2670838 安装在 Windows 7 Service Pack 1 上,但它仅提供MSDN 的软件功能。任何需要新硬件功能的功能都需要新的WDDM v1.2 驱动程序,该驱动程序仅在 Windows 8.0 或更高版本上受支持。

参见DirectX 11.1 and Windows 7DirectX 11.1 and Windows 7 Update

【讨论】:

  • 所以基本上 ID3D11VideoDevice 支持仅适用于 Windows 8?我们受限于可以安装在目标硬件上的服务包等。
  • Windows 8.0、Windows 8.1 或 Windows 10。
  • 好的,谢谢您的澄清,所以实际上我唯一的选择似乎是使用 Windows Media Foundation 打开视频流并以某种方式将每一帧解码为 2D 纹理?只是想澄清一下,因为这是我使用 IMFSourceReader 所走的路,它似乎可以正确加载流,但我只是有点难过解码到 2D 纹理步骤,只是想确保我要去关于这个正确的方式,而不是浪费我的时间。
  • 这个walkthrough 应该会有所帮助。它有一些 Windows 运行时代码,但主要是使用 Media Foundation 和 Direct3D 11。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 2018-04-14
相关资源
最近更新 更多