问题标签 [dxva]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
video-capture - 媒体基础:强制捕获设备在拓扑中提供 DirectX 表面
语境
我写了一个使用 DXVA 的 MFT。它要求输入样本有一个IDirect3DSurface9
表面。
我在 3 个节点的拓扑中使用此 MFT:
- 包装从捕获设备激活器创建的媒体源的源节点,
- 一个包含我的 MFT 实例的转换节点,
- 包含 EVR 的输出节点。
我在拓扑上设置MF_TOPOLOGY_DXVA_MODE
属性 toMFTOPOLOGY_DXVA_FULL
和MF_TOPOLOGY_HARDWARE_MODE
to MFTOPOLOGY_HWMODE_USE_HARDWARE
,当我启动媒体会话时,我从 MFT 内部收到一个 D3DDeviceManager。
问题
当输入样本从拓扑内部到达 MFT 时,它们没有附加 D3D 表面(MFGetService
失败MR_BUFFER_SERVICE
)。
如果我根本不使用拓扑,并从具有有效 的相同媒体源创建 Source Reader MF_SOURCE_READER_D3D_MANAGER
,则 Source Reader 提供的示例具有 D3D 表面。
问题
是否可以使拓扑中的源节点/捕获媒体源产生具有 D3D 表面的样本?
directx - 在 WPF 上渲染多个视频的最佳方式
我是与 DirectX、渲染视频、渲染图像等相关的所有东西的新手。所以我需要你的帮助:
我有一个 WPF 应用程序。此应用程序需要渲染大量视频(至少并行 10 个视频),并且这些视频必须在 GPU 上渲染,而不是在 CPU 上。我已经尝试过使用 WPF-MediaKit,但它会消耗大量内存(RAM)和 CPU。我还尝试了 WPF MediaElement,它也消耗了大量内存(RAM)。
所以,我的问题是: 1 - 你如何构建一个应用程序,以尽可能少的内存在 GPU 上同时渲染大量视频?你会使用什么技术?
注意:如果您建议需要协同工作的不止一种技术/工具,您能解释一下它们是如何协同工作的吗(就像我很笨一样)?!例如:要渲染视频并将其显示在屏幕上,您需要将 EVR 与 DXVA 一起使用,... 因为 ....或者如果您能给我一些应用示例,我非常感激.. :) (对不起,但工作在低级别对我来说仍然有点困难,我需要对此进行一些指导)
c++ - LibVLC DXVA2 Windows C++ 硬件加速
我想使用 DXVA2 加速解码器解码 h264 RTSP 流。在 VLC 中它确实有效,但在我的代码中具有以下输出:
这是NV12转换的问题吗?有没有办法强制DXVA2?
谢谢
代码:
完整日志:
wmp - Windows Media Player 中的 DXVA2 解码器 MFT 与多显示器显示
当 Windows Media Player 的中心被拖到(或启动)辅助监视器时,我的 DXVA2 解码器“空白”。移回主要视频时,视频会重新出现。注意我没有设置 D3DPRESENTFLAG_DEVICECLIP。
尽管我更希望找到一种无需处理即可工作的方法,但我确实通过返回 DXVA2_E_NEW_VIDEO_DEVICE 的 IDirect3DDeviceManager9::TestDevice() 收到了有关此问题的通知。
IDirect3DDeviceManager9::CloseDeviceHandle / OpenDeviceHandle 没有削减它(尽管 MSDN 指出了所有必需的)所以我的重置处理程序类似于:
所以我尝试创建一个新的 dx 设备(使用桌面作为 hwnd)然后
但在 IDirect3DDevice9::Reset() 上仍然没有乐趣。
我也尝试使用 DXVA2CreateDirect3DDeviceManager9 创建一个新的 IDirect3DDeviceManager9 但无济于事。
顺便说一句,我使用 IDirect3DDevice9::Reset() 在我的初始化中没有问题,并且稍后使用相同的 D3DPRESENT_PARAMETERS 所以不要认为这些是问题,但它们在这里(调用后)
任何缺失都归零。
win8和win10也有同样的问题。
任何帮助/指针表示赞赏。
c++ - 使用着色器修改 IDirect3DSurface9*
我从 DXVA2 视频解码器获得了 IDirect3DSurface9 *。我想用着色器修改那个表面。我可以通过在后台缓冲区中“绘制”表面来渲染没有着色器的视频帧。我使用以下代码在没有着色器的情况下渲染帧:
直到这里,一切正常。我会修改 Draw 函数以使用以下着色器渲染视频帧:
其中 TexRGB 是与视频帧关联的纹理,而 TexAlpha 是另一个包含 alpha 值的纹理。如何将解码的表面传递给着色器?我从来没有使用过 Directx9,所以一个例子很受欢迎,可以帮助我解决问题。
更新 1: 我创建了 InitEffect 函数来从文件加载效果
并将渲染功能更改为:
但它仍然不起作用。
更新 2 我按照 Asesh 共享的代码修改了代码。在 InitEffect 函数中,我添加了以下几行来创建渲染目标表面:
绘图功能是:
通过hwctx->d3d9device->StretchRect(ctx->surfRGB, NULL, backbuffer, NULL, D3DTEXF_NONE) 在后台缓冲区中绘制;即使 ctx->surfRGB 与传递给着色器的纹理相关联,视频帧也会显示在屏幕上,但不会应用 alpha 混合。如果我删除hwctx->d3d9device->StretchRect(ctx->surfRGB, NULL, backbuffer, NULL, D3DTEXF_NONE); 即使 ctx->surfRGB 不为空,也不会显示视频帧。
c# - 如何在 WPF-Mediakit 中使用 ffdshow
默认情况下 LAV 解码器,但我想使用带有硬件加速的 ffdshow 进行解码。我在文件ClassId.cs中看到了这些行
使用的解码器在MediaUriPlayer中定义
所以问题是,如何启用 FFDShowVideoDXVA?解码器的正确名称是什么,或者我在这里完全走错了路?
如果我设法启用 FFDShowVideoDXVA,是否默认启用硬件加速(如果没有,我如何以编程方式启用它?
非常感谢帮助。
windows - dxva2 时编译 ffmpeg 错误
配置ffmpeg:
发生错误:
我的系统是win10,ffmpeg是最新的。
c++ - C++ DXVA 库“操作失败,因为 DDC/CI 消息在其命令字段中具有无效值。”
我正在尝试创建一个 C++ 控制台应用程序,它将根据屏幕上显示的像素的平均亮度自动调整显示器的亮度。不幸的是,在我进入第二部分之前,我什至在使用 DXVA 库时遇到了麻烦。
这是我当前的代码(我从这里获取了一些代码:如何使用 GetMonitorCapabilities 和 GetMonitorBrightness 函数):
我得到的亮度/能力功能的错误是这样的:An operation failed because a DDC/CI message had an invalid value in its command field.
我已经在谷歌上搜索了几个小时,但我还没有找到解决我问题的方法。我有一张 AMD 显卡,我正在使用内置驱动程序(Google Lenovo e545 AMD 驱动程序),其中包括 Catalyst 版本15.7.1
、Direct3D9.14.10.01128
和驱动程序版本15.20.1062.1004-150803a1-187674C
。
对于这个混乱的问题和我缺乏经验,我深表歉意。
directx - DX11VideoRenderer 中的 ProcessFrameUsingD3D11() 与 ProcessFrameUsingXVP()?
我正在尝试使用 Microsoft 示例DX11VideoRenderer渲染视频,该示例位于:https ://github.com/Microsoft/Windows-classic-samples/tree/master/Samples/DX11VideoRenderer 从我的广泛研究看来,将 DirectX 11 与硬件加速是最新的方法(最不可能被弃用)并提供最佳性能解决方案。
Presenter.cpp中有 2 个类似的函数可以处理帧,但我不知道它们之间有什么区别。ProcessFrameUsingD3D11()
用于VideoProcessorBlt()
实际进行渲染。奥秘在于ProcessFrameUsingXVP()
它不使用这个函数,那么它实际上是如何进行渲染的呢?还是它完全在做其他事情?此外,我的实现似乎是基于默认设置为“1”ProcessFrameUsingXVP()
的变量值使用的。m_useXVP
这是代码示例:
设置的原因对m_useXVP
我来说也是一个谜,我在研究中找不到答案。它使用我的特定 Windows10 PC 上不存在的注册表项,因此不会修改该值。
因此,由于我的 PC 没有此密钥,因此代码默认使用ProcessFrameUsingXVP()
. 这是定义:
这是 的定义ProcessFrameUsingD3D11()
:
最后一点,文档指出:
具体来说,此示例展示了如何:
- 使用 Media Foundation API解码视频
- 使用 DirectX 11 API 渲染解码的视频
- 将视频流输出到多显示器
除非通过一些我还没有偶然发现的 MF 魔法圣歌短语,否则我找不到任何可以解码的东西。但这不是什么大问题,因为我可以在前面放一个 H.264 解码器 MFT 没问题。我只想澄清文档。
任何帮助将非常感激。谢谢!
directx - DX11VideoRenderer 线程安全吗?
我正在使用 Microsoft 示例DX11VideoRenderer在 Windows 10 中渲染实时视频。当我只运行一个流时,视频看起来很棒。但是,当我运行超过 4 或 5 个流时,它们各自窗口中的一些视频开始间歇性地消隐。效果可以只覆盖每个视频窗口的一部分或全部。
此外,我的日志文件中的此函数调用也出现了一些间歇性错误:
返回的错误是:E_INVALIDARG 一个或多个参数无效 0x80070057
我只在我的代码中使用了DX11VideoRenderer的Presenter.cpp和display.cpp模块。源码位于: DirectX 视频渲染示例
在这个阶段我最初的怀疑是 DXVideoRenderer 可能不是线程安全的。我找到了有关多线程的信息:Direct3D 11 中的多线程简介,其中指出:
虽然设备上下文 (ID3D11DeviceContext) 的使用不是线程安全的,但 Direct3D 11 设备 (ID3D11Device) 的使用是线程安全的。
但似乎由于我为每个窗口使用CPresenter类的单独实例,因此ID3D11DeviceContext不是线程安全的应该没有问题,因为每个窗口都应该有它自己的ID3D11DeviceContext实例。
是否有人对此 DX11VideoRenderer 软件示例有任何经验或想法,以及可能导致此问题的原因是什么?
谢谢!
-更新-
我已经能够仅用一个窗口复制该问题,因此它不再是线程问题。如果我多次手动调整窗口大小,有时我会使窗口中的视频闪烁。发生这种情况时,我在日志中看到相同的函数调用VideoProcessorBlt()
失败并返回相同的代码E_INVALIDARG。