问题标签 [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.
c# - 如何判断 DXVA 解码器是否已退回到软件解码
来自https://msdn.microsoft.com/en-us/library/windows/desktop/dd797815%28v=vs.85%29.aspx
在约束中,您读到“DXVA 加速的最大保证分辨率为 1920 × 1088 像素;在更高的分辨率下,如果底层硬件支持,则使用 DXVA 进行解码,否则使用软件进行解码。”
有没有办法检测解码是在软件中完成的?
在尝试解码 4K H264 视频时,我们遇到了 AMD 图形控制器的问题。
我们知道硬件不支持 4K 解码,理论上它应该回退到软件。然而,我们发现不管它应该做什么,我们都会得到很多损坏或黑帧。
我希望我们可以检测到 DXVA 是否已经退回到 SW 解码,在这种情况下,我们根本不会尝试使用 DXVA,而是使用完整的软件路径。
谢谢
directx - ID3D11VideoDevice::CreateVideoDecoderOutputView 失败
我正在开发一个能够通过 DrectX11 的 ID3D11VideoDecoder 接口(https://msdn.microsoft.com/en-us/library/windows/desktop/hh447766(v=vs.85).aspx)解码 H264 流的应用程序,我得到了卡在 ID3D11VideoDevice::CreateVideoDecoderOutputView 方法,它只是无法返回 E_INVALIDARG。是的,我知道,可能有数百万个原因,但可能有一些异常常见的原因吗?是否有任何可用的示例说明通过 ID3D11VideoDecoder 进行解码(我还没有找到)?我认为最有可能失败的代码部分如下所示:
谢谢
h.264 - 使用 ID3D11VideoDecoder 解码 H264 流
我正在尝试使用 DirectX11 和接口https://msdn.microsoft.com/en-us/library/windows/desktop/hh447766%28v=vs.85%29.aspx解码(和渲染)H264 原始流。不幸的是,我被困在了 DXVA PictureParameters 缓冲区中:即 ID3D11VideoContext::SubmitDecoderBuffers 总是返回 E_FAIL。这非常神秘,是否有使用此接口解码 H264 比特流的示例,因为错误代码 E_FAIL 我可能永远无法断定我做错了什么?这样的例子会很有帮助。
c++ - 运行时不一致 DXVA 硬件视频解码
我目前正在从事一个项目,该项目涉及使用 DXVA API 和 FFmpeg 框架来实现 H264 视频流文件的硬件加速解码。
我对 GPU 解码做了一些研究,并基于 VLC 中的硬件加速实现构建了我的代码。据我了解,在 FFmpeg 中使用 DXVA 涉及初始化 DirectXVideoDecoder 和在 AVCodecContext 中实现几个回调函数。解码过程是使用 FFmpeg 函数avcodec_decode_video2()完成的,并且每一帧都使用av_read_frame()进行解析。解码后的帧存储在图形内存中,并使用 Direct3D 显示。
我尝试使用:GetTickCount()函数对每个进程进行计时,并注意到 1550 帧视频的程序执行时间为 35000 毫秒,其中显示函数占用了 90% 的时间,而解码函数占用了 6% 的时间。
但是,当我尝试注释掉显示过程并执行只解码每一帧的代码时,同一视频的总解码时间却惊人地增加到了 25,000 毫秒,占总时间的 94%。下面是解码功能的代码:
这种奇怪行为的原因可能是什么?我的猜测是,这可能是 :GetTickCount() 的错误使用,或者可能与 DXVA 硬件加速解码过程有关。对不起,很长的帖子。任何意见和建议表示赞赏。提前致谢。
h.264 - 使用 DX11 和 DXVA2
我正在尝试使用 DX11 和 DXVA2 测试解码 h264/h265 视频(只有一个 iframe)。这是在 Windows 7 上,所以我可能必须在 2 个 d3d11 设备之间进行互操作,一个具有 11.1 功能集,另一个具有 9.3。我的问题是,由于严重缺乏加载 h264 文件并使用 DXVA 对其进行解码的样本,我想知道是否有关于如何布局数据以输入 DXVA 进行解码的指南?我已阅读此内容如何在 Directx 11 和 Windows 7 中使用硬件加速视频/H.264 解码?以及https://msdn.microsoft.com/en-us/library/windows/desktop/hh162912(v=vs.85).aspx但都没有关于如何执行上述操作的任何指南。
谢谢
c++ - FFMPEG 和 DXVA2
我用 FFMPEG 制作了一个用于 IP 摄像机(全高清 H264)的播放器,我在 Windows 下使用 Qt 编写代码。我需要尽可能低的延迟,我能得到的最佳结果是:
- 我收到了live555的数据包,
- 用ffmpeg解码
- 用 SDL 显示它。
但是对于“慢” CPU,如果比特率太高或无法处理 1080p,我会有很多延迟。
我真的很想尝试使用 DXVA2 进行硬件加速,看看能否获得更好的性能,尤其是在最慢的 CPU 中。
但我真的不知道如何进行。我必须用 --enable-dxva2 和 --enable-hwaccel=h264_dxva2 构建 FFMPEG 吗?或 Zeranoe 构建我从未使用过 Direct X,我是否需要 Direct X 知识,或者带有 --enable-dxva2 和 --enable-hwaccel=h264_dxva2 的 ffmpeg 照顾一切?
谢谢
编辑 :
您好,我使用这篇文章来帮助我使用 FFMPEG 进行硬件加速 无法执行:0x80070057,当使用 dxva2 通过 ffmpeg 解码视频时
我用
我得到了我的解码帧
我试图转换它
并将缓冲区复制到 Qimage
我得到了我的照片,但有很多人工制品,几秒钟后我遇到了分段错误dxva2_retrieve_data_call(pCodecCtx, pFrame, &gotPic, &packet);
编辑:问题解决了我没有在检索之前检查我是否有照片。但是我的台式计算机(英特尔酷睿 i5 650、4GB RAM、ATI HD5800)的性能很差,它消耗的 CPU 多 5%,内存多 3 倍,而且有很多损坏的帧。在较新的计算机上更好,但软解码器更好。dxva2_retrieve_data_call 和 sws_swale 在启用 hwaccel 时会消耗大量时间...
有没有办法在 Qt 中显示 NV12 图片(没有 sws_scale 转换)并且有办法优化 dxva_retrieve_data_call ?
c++ - IDirectXVideoDecoder 性能
我试图了解 IDirectXVideoDecoder 的一些细微差别。警告:以下结论并非基于 DirectX 文档或任何其他官方来源,而是我自己的观察和理解。那就是说...
在正常使用中,IDirectXVideoDecoder 很容易以任何合理的帧速率处理帧。但是,如果您不基于时间码渲染帧,而是“尽可能快地”进行渲染,那么您最终会在解码器中遇到瓶颈,并且 IDirectXVideoDecoder::BeginFrame 开始返回 E_PENDING。
显然,在任何给定时间,系统只能在解码器中激活 X 帧。尝试提交 X + 1 会出现此错误,直到前一帧完成。在我的(有点旧的)盒子上,X == 4。在我的新盒子上,X == 8。
这让我们想到了我的第一个问题:
Q1:我如何知道一个系统支持多少同时解码操作?什么属性/属性描述了这一点?
然后是遇到此错误时该怎么办的问题。我可以想到 3 种不同的方法,但它们都有缺点:
1)只需循环等待解码器释放:
从好的方面来说,这种方法提供了最快的吞吐量。不利的一面是,这会导致大量 CPU 时间被烧毁,等待解码器释放(>93% 的执行时间都花在了这里)。
2)做一个循环,并添加一个睡眠:
从好的方面来说,这会显着降低 CPU 利用率。但不利的一面是,它最终会减慢总吞吐量。
在试图弄清楚为什么它会减慢速度时,我做了一些观察:
- 在我的系统上处理帧的正常时间约为 4 毫秒。
- Sleep(1) 最多可以休眠 8 毫秒,即使有 CPU 可供运行。
- 发送到解码器的帧不会被添加到队列中并一次解码一个。它实际上同时执行 X 个解码。
所有这一切的结果是,如果您尝试休眠,其中一个解码器经常会闲置。
3) 在提交下一帧进行解码之前,等待前一帧完成:
这也会降低 CPU 使用率,但也会降低吞吐量。可能是因为“表面”的使用时间比“解码器”长,但更有可能是因为将帧(毫无意义地)传输回内存所需的时间。
这就引出了第二个问题:
Q2:这里有什么方法可以最大化吞吐量而不会对 CPU 造成毫无意义的冲击吗?
最后的想法:
- 看来 LockRect 必须在做一个 WaitForSingleObject。如果我可以访问该句柄,那么等待它(同时不复制框架)似乎是最好的解决方案。但我不知道从哪里得到它。我已经尝试过 GetDC、GetPrivateData,甚至查看了 IDirect3DSurface9 的调试数据成员。我没有找到它。
- IDirectXVideoDecoder::EndFrame在名为 的参数中输出句柄
pHandleComplete
。这听起来正是我需要的。不幸的是,它被标记为“保留”并且似乎不起作用。除非有绝招? - 我对 DirectX 很陌生,所以也许我错了?
更新1:
关于 Q1:原来我的两台机器都只支持 4 个解码器(哎呀)。这将使我更难确定我正在寻找的属性。虽然很少有属性(实际上没有)在一台机器上返回 8 而在另一台机器上返回 4,但有几个返回 4。
Re Q2:由于(4)解码器(大概)在应用程序之间共享,因此通过(以某种方式)查询解码器是否空闲来确定解码是否完成的想法是不可行的。
创建表面的调用不会创建句柄(句柄计数在整个调用过程中保持不变)。因此,等待“表面处理”的想法似乎也不会成功。
我剩下的唯一想法是通过使用它进行一些其他调用(除了 LockRect)来查看表面是否可用。到目前为止,我已经尝试在解码器“仍在使用”的表面上调用 StretchRect 和 ColorFill,但它们没有错误地完成,而不是像 LockRect 那样阻塞。
这里可能没有更好的答案。到目前为止,为了获得最佳性能,我应该使用#1。如果 CPU 利用率是一个问题,那么 #2 比 #1 好。如果我无论如何都要将表面读回内存,那么#3是有道理的,否则,坚持使用1或2。
c++ - C++ 中的 Media Foundation 全景(等角)视频播放
我一直在试图弄清楚如何播放等距矩形的视频文件(并添加移动控件。)我使用 SDK 示例获得了播放部分。然而,将视频帧纹理添加到天空盒似乎是完全不可能的。我已经查看了自定义 EVR 和 DX11 渲染器,但似乎无法理解所有这些是如何工作的。有人有想法么?
谢谢。
c++ - 如何使用 DXVA2 和 ffmpeg 解码和获取帧
我已经搜索了一个关于如何在 Windows 中使用 ffmpeg 使用硬件加速解码 H264 流的简单示例,但我找不到任何内容。我知道我应该使用 dxva2 和 ffmpeg 来进行硬件加速。
我可以在 CPU 上使用 ffmpeg 解码 H264,然后将 NV12 格式转换为 RGBA 并将帧保存为 bmp 文件,这要归功于post中提供的示例项目。
我已按照以下帖子中提供的内容获取有关 dxva2 的帮助:发布
我相信我可以用 dxva2 成功解码;但是,当我想获取解码帧并将其转换为 RGBA 格式并将其保存为 bmp 文件时,我收到有关源指针的错误。
我解码和检索帧如下:
并将输出帧馈送到:
我收到此错误:
[swscaler @ 030c5c20] 错误的 src 图像指针
显然有些问题,pFrameYuv->data
但我不知道是什么。
我们如何将使用 DXVA2 解码的 NV12 帧转换为使用 sws_scale 的 RGBA?
video - DirectShow,媒体基金会,DXVA,什么?
我的任务是修改使用 DirectShow 进行视频渲染的应用程序。旧的应用程序工作正常,但它开始显示年龄。
由于我有游戏背景,我想我应该这样处理。在使用不同的技术制作了一堆原型之后,我很确定我可以提取视频到纹理的渲染并使用 DirectX 来满足所有客户的要求。
然而,我现在必须选择一种技术,我不能再迷失了……
- 直接秀
- 媒体基金会
- 媒体会话 (< Windows 8)
- 媒体引擎 (> Windows 8)
- DXVA1
- DXVA2
- DXVA-HD
DirectShow 显然是最古老的,但仍然运行良好,这主要是因为可用的编解码器数量巨大。
Media Foundation 是随 Windows Vista 一起引入的,并且在 Windows 8 之前有一个叫做“Media Session”的东西,之后他们引入了“Media Engine”。如果我是正确的编解码器称为 MFT?实际上有没有像 free-codecs.com 这样的网站?
除了这两种技术之外,还有 DXVA,它允许您将视频解码卸载到 GPU。目前,我遇到了 3 种不同的类型。DXVA1 是自 XP 以来一直存在的实现,DXVA2 是较新的 API。但是什么是 DXVA-HD?它比 DXVA2 更新还是等效名称?
我真的很想转向 Media Foundation,开箱即用的编解码器非常适合客户想要使用的格式。我所关心的是为它获取编解码器是多么容易...... Windows 8+ 默认媒体播放器是否仍然具有 DirectShow 和 MF 渲染路径并即时交换它们,或者微软是否完全淘汰了 DirectShow?
我也不太明白 DXVA 应该如何工作。鉴于我想基本上在游戏中渲染视频,只有让所有渲染实际发生在 GPU 上并将应用程序逻辑保留在 CPU 上才有意义,但我真的找不到任何关于如何使用 Media 来利用它的好例子基础。这主要是因为我不知道 DXVA2 和 DXVA-HD 之间的区别。Windows 7 SDK 附带了所有 3 种实现的示例...
如果有人能用粗体回答我的问题,纠正我的错误信息,并指出一个正确的例子(DirectX + Media Foundation + DXVA-whatever)的方向,我将非常感激!它可以像“结合这 3 个 Windows 7 SDK 示例来获得你想要的东西”一样简单。
整个任务的目标是让应用程序再次以一流的形式出现,我想绝对确定我选择了像 DirectShow 已经拥有的未来十年的技术:P