- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我研究了一整天,但还没有取得多大进展。我在 Windows 7 上,使用 directx 11。(我的最终输出是 DX11 纹理上的视频帧)我想解码一些非常大的 H.264 视频文件,但 CPU(使用 libav)无法处理它。
我已经使用 DXVA2 查看了 libav 的 hwaccel 功能,但是当我需要创建只能使用 D3D9 接口(interface)创建的 IDirectXVideoDecoder 时遇到了障碍。 (我没有使用 DX11)
每当我查找 DXVA 文档时,它都没有引用 DX11,这是在 DX10 或 11 中删除的吗? (找不到任何对此的确认,也没有任何地方说 DXVA2 是多余的,可能它已被 DXVA-HD 取代?)
然后我研究了媒体基础 SDK,因为它看起来像是我应该用于 DX11 的...但是我的 header 中不存在任何类型(文档说只包含
我相信要使用 MF,我需要 Windows 8 SDK,它现在包含所有 directx 库/ header 。
所以这与Windows 7留下了差距...是否有可能获得硬件加速视频解码?如果是这样,我应该使用哪个 API?
编辑:作为另一个后续行动,我的 MediaFoundation(以及 AVF、android、magic Leap 等)实现位于我的开源项目中 https://github.com/NewChromantics/PopH264Edit2:但我不知道它是否支持win7:)
最佳答案
D3D11 具有一个视频 api,它基本上是 DXVA2,上面的界面略有改变。您需要充分了解 h.264 比特流才能继续(真的!)。即确保您手头有一个 h.264 解析器来提取 SPS 和 PPS 结构的字段以及编码帧的所有切片。
1) 从您的 ID3D11Device 获取 ID3D11VideoDevice 实例,并从直接 D3D11 设备上下文获取 ID3D11VideoContext注意:在 Win7 上,您必须创建功能级别为 9_3 的设备才能获得视频支持! (在Win8下就可以了)
2) 创建h.264的ID3D11VideoDecoder实例使用 ID3D11VideoDevice::GetVideoDecoderProfileCount、GetVideoDecoderProfile、CheckVideoDecodeRFormat...迭代所有支持的配置文件,并找到一个 GUID D3D11_DECODER_PROFILE_H264_VLD_NOFGT 的配置文件适用于没有胶片颗粒的 h264。作为 OutputFormat,您最好的选择是 DXGI_FORMAT_NV12。
3) 各个帧的解码参见 Supporting Direct3D 11 Video Decoding in Media Foundation :
缓冲区填充有相应的 DXVA2 结构(参见 dxva2.h)完整的 DXVA2 规范在这里,您需要它来相应地映射 h.264 sps/pps 字段。
参见:
然后:
3) D3D11_VIDEO_DECODER_BUFFER_PICTURE_PARAMETERS 缓冲区还包含所有引用帧/表面的信息- 您需要自己管理它们,即确保表面/纹理可供 GPU 使用!
这很复杂,检查一下 ffmpeg 和 Media Player Classic,它们都有 DXVA2(尽管不是通过 DX11)支持。
4) 从 NV12 转换为 RGB(A),某些 GPU(D3D11 功能级别)允许使用 NV12 作为着色器输入,有些则不允许。如果无法直接使用 NV12,请查看 D3D11VideoProcessor 接口(interface),该接口(interface)可为所有支持 D3D11 的 GPU 提供 NV12/YUV420->RGB 转换功能。
可以通过如下代码执行转换:
// Setup ID3D11Video*
ID3D11VideoProcessor * d3dVideoProc = ...;
ID3D11VideoDevice * d3dVideoDevice = ...;
ID3D11VideoProcessorEnumerator * d3dVideoProcEnum = ...;
ID3D11Texture2D * srcTextureNV12Fmt = ...;
ID3D11Texture2D * dstTextureRGBFmt = ...;
// Use Video Processor
// Create views for VideoProc In/Output
ID3D11VideoProcessorInputView * videoProcInputView;
ID3D11VideoProcessorOutputView * videoProcOutputView;
{
D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC inputViewDesc = { 0 };
inputViewDesc.ViewDimension = D3D11_VPIV_DIMENSION_TEXTURE2D;
inputViewDesc.Texture2D.ArraySlice = arraySliceIdx;
inputViewDesc.Texture2D.MipSlice = 0;
hr = d3dVideoDevice->CreateVideoProcessorInputView(srcTextureNV12Fmt, d3dVideoProcEnum, &inputViewDesc, &videoProcInputView);
}
{
D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC outputViewDesc = { D3D11_VPOV_DIMENSION_TEXTURE2D };
outputViewDesc.Texture2D.MipSlice = 0;
hr = d3dVideoDevice->CreateVideoProcessorOutputView(dstTextureRGBFmt, d3dVideoProcEnum, &outputViewDesc, &videoProcOutputView);
}
// Setup streams
D3D11_VIDEO_PROCESSOR_STREAM streams = { 0 };
streams.Enable = TRUE;
streams.pInputSurface = videoProcInputView.get();
RECT srcRect = { /* source rectangle in pixels*/ };
RECT dstRect = { /* destination rectangle in pixels*/ };
// Perform VideoProc Blit Operation (with color conversion)
hr = videoCtx_->VideoProcessorBlt(d3dVideoProc, videoProcOutputView.get(), 0, 1, &streams);
关于directx - 如何在 directx 11 和 windows 7 中使用硬件加速视频/H.264 解码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19846770/
我想用groupshared DirectX 计算着色器中的内存以减少全局内存带宽并有望提高性能。我的输入数据是 Texture2D我可以像这样使用二维索引来访问它: Input[threadID.x
我一直在查看 MSDN 和 Microsoft.com,但只能找到存档论坛。现在还有 Microsoft Run DirectX 论坛吗? 最佳答案 在这里: http://forums.xna.co
我正在尝试将网格切成两半,或者至少能够实时删除其中的面。我想知道如何去做这件事? 锁定顶点缓冲区,将选定的面或顶点 memset 为 0,对我不起作用。有没有人对此有解决方案或教程,我真的希望在我的程
我想这是一个相当深入的主题,因此任何带有洞察信息的网址也很乐意接受。我一直在使用原生 DirectX,但从未管理过。另一方面,大多数情况下,在开发不需要高级 GPU 渲染的其他类型的应用程序时,我通常
微软的开源DirectX Shader Compiler描述了一种用于 HLSL 着色器的新中间语言 (IL) 的格式,称为 DXIL。 文档引用了从以前的 HLSL IL(称为 DXBC)到新 DX
我需要同时在更大的显示器上全屏显示在我的应用程序中播放的视频。在某些显卡上,这称为影院模式,使用显卡制造商提供的工具进行配置。 我只想用软件来做到这一点。我可以用 DirectX 做到这一点吗? 我的
我问 how to take the screen shot in DirectX并回答了“使用 GetFrontBufferData()”。然而,“这个函数在设计上非常慢,并且不应该在任何性能关键路
这让我感到困惑。 DirectX 绕过所有内容并直接与设备驱动程序对话,因此 GDI 和其他常用方法将不起作用 - 除非 Aero 被禁用(或不可用),否则出现的只是屏幕左上角的黑色矩形。我已经尝试了
我们正在开发一个通过 Direct3D 可视化显示信息的应用程序。迟到的客户端请求是能够通过某些远程桌面解决方案查看此应用程序。 有人做过类似的事情吗?哪些选项可用/不可用?我正在考虑 RDC、VNC
由于D3DPOOL_SCRATCH处理速度较慢,所以我编写了桌面捕获程序以引用网上的报告。然而,结果却是一片漆黑的画面。这是控制台程序的结果还是有其他原因? #include #include #
背景 我正在玩东方系列游戏之一的不朽之夜。射击按钮是“z”,移动较慢是“shift”,方向键移动。对我来说不幸的是,使用 shift-z 重影我的右箭头键,所以我在射击时无法向右移动。这种重影发生在所
我已经阅读了关于 DirectX 光栅化规则的在线文档,但我仍然不明白为什么这段代码没有在屏幕上产生任何可见的东西? target->SetAntialiasMode(D2D1_ANTIALIAS_M
如您所知,当我们想要在 DirectX 中绘制三维对象时,我们应该定义相机。现在我们有一个设备对象,它的名称是“device1”。这是我的问题: device1.View = Matrix.Look.
我正在使用桌面复制 API 从一个 GPU 捕获桌面,并且需要将纹理(位于 GPU 内存中)复制到另一个 GPU。为此,我有一个捕获线程,用于获取桌面图像,然后使用 ID3D11DeviceConte
假设 DX12 被挂接到叠加渲染的场景,看起来挂接的最佳函数是 IDXGISwapChain::Present,与 DX11 的方式相同。将此函数 Hook 后,交换链就可用,并且可以从中检索设备以创
当帧开始时,我会进行逻辑更新并在此之后进行渲染。 在我的渲染代码中,我做通常的事情。我设置了一些状态、缓冲区、纹理,并通过调用 Draw 来结束。 m_deviceContext->Draw(
我使用 DirectX 9.0 制作了一个小型 3D 查看器应用程序。现在我想添加一些编辑功能。假设我想编辑一个大多边形。当用户编辑形状时,顶点将被添加、删除和移动。现在每个多边形都存储为顶点缓冲区。
我编写了一个应用程序,它可以在 OpenGL、DirectX 9 和 DirectX 11 之间切换以进行渲染,而无需重新启动或重新创建窗口。在 OpenGL 和 DirectX 9 以及 Direc
如何在 DirectX 中执行此操作? glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); 不知何故,我似乎无
msdn documentation解释了在 directx 11 中,有多种方法可以通过编程方式填充 directx 11 纹理: (1) 使用默认使用纹理创建纹理并使用内存中的数据对其进行初始化
我是一名优秀的程序员,十分优秀!