问题标签 [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.

0 投票
3 回答
4099 浏览

c++ - GPU 去隔行扫描

我有一个使用 OpenGL 进行视频处理(例如颜色变换、缩放和翻译)的应用程序。我主要使用 BGRA (1xGL_BGRA) 或 YUVA (4xGL_R) 视频,即包括 alpha。

现在我还想做一些高质量的去隔行。我注意到 Nvidia 通过其“PureVideo”功能支持高质量的硬件加速去隔行扫描。基本上我想做的是发送一个带有 x 个颜色通道的交错 OpenGL 纹理,并得到两个渐进纹理。

我的问题是如何最简单、最有效地访问此功能(可能与 OpenGL 互操作)?

我一直在研究 DXVA 和 OpenMax,但两者似乎都更专注于播放(不是去隔行处理,即需要设置帧速率等不相关的选项等)和无 alpha 格式......

0 投票
0 回答
2810 浏览

windows - 使用 DXVA2 加速通过 ffmpeg 在应用程序中播放 H.264 视频

我正在尝试在 Windows 应用程序中输出 H.264 视频。我对 FFMPEG 比较熟悉,并且我已经成功地让它在 SDL 窗口中播放 H.264 没有问题。不过,我真的会从使用硬件加速中受益(可能通过 DXVA2)

我正在阅读原始 H264 视频,没有容器,没有音频……只有原始视频(没有 B 帧,只有 I 和 P)。此外,我知道将使用此应用程序的所有系统都具有至少支持 VP3 的 Nvidia GPU。考虑到这组假设,我希望能走捷径,让它变得简单而不是笼统,让它适用于我的特定场景。

到目前为止,我知道我需要通过调用 ff_find_hwaccel 填充 hwaccel 成员来在编解码器上下文中设置硬件加速。我的计划是看看 Media Player Classic Home Cinema,它在解码 H.264 时使用 FFMPEG 支持 DXVA2 方面做得很好。但是,代码很大,我不确定在哪里看。我可以在 h264.c 中找到调用 ff_find_hwaccel 的地方,但我想知道我应该在哪里看。

更具体地说,我想知道为了让 DXVA2 通过 FFMPEG 工作而必须编写的最少步骤集是什么?

编辑:如果有人知道我在哪里可以找到“重要”的代码片段,我愿意查看 VLC 或其他任何东西。我刚刚提到了 MPC-HC,因为我认为它是最容易在 Windows 中编译的。

0 投票
1 回答
2221 浏览

ffmpeg - 将原始 H264 NALU 流包装到 MP4 等容器中

我有一个应用程序,它使用 x264 x264_encoder_encode 即时发送编码生成的原始 h264 NALU。我通过普通的 TCP 获取它们,所以我不会丢失任何帧。我需要能够使用 Windows 中的硬件加速 (DXVA2) 在客户端中解码这样的流。我一直在努力寻找一种使用 FFMPEG 使其工作的方法。也许尝试 Media Foundation 或 DirectShow 可能更容易,但它们不会采用原始​​ H264。我要么需要:

  1. 更改服务器应用程序的代码以返回 mp4 流。我对x264没有那么有经验。我可以通过调用 x264_encoder_encode 来获取原始 H264,方法是遵循以下问题的答案:如何使用 x264 C API 将一系列图像编码为 H264?我怎样才能从这个转到 MP4 中包装的东西,同时仍然能够实时流式传输它

  2. 我可以在接收器处用 mp4 头文件将其包装起来,然后将其输入到可以使用 DXVA 播放的东西中。我不知道该怎么做

  3. 我可以找到另一种方法来使用带有 FFMPEG 的 DXVA 或其他以原始格式获取它的东西来加速它。

一个重要的限制是我需要能够在显示每个解码帧之前对其进行预处理。任何一步完成解码和显示的解决方案都不适合我

两种解决方案我都可以

0 投票
2 回答
3182 浏览

performance - 具有 7 个后台缓冲区的 DirectX 11 交换链

我有一个以桌面模式在 Windows 8 上运行的专有媒体播放器。运行时 DirectX 版本是 11,但原生图形驱动程序支持 DirectX 9。
在一些具有完全相同设置的计算机上,我看到实际交换链的后台缓冲区计数为 2,性能非常好,而在其他一些计算机上则相反缓冲区计数为 7,并且有丢帧。
我没有该播放器的源代码,想知道在运行时确定不同的后台缓冲区计数的原因可能是什么。
有人可以解释为什么这样的后缓冲计数会导致性能发生这种变化吗?或者只是将我指向解释后缓冲区编号含义的相关文档?

(更多调试信息:使用 GPUView 我看到当后备缓冲区计数为 2 时,硬件以同步模式工作,即每秒 VSync 中硬件队列中的一个数据包(剪辑帧速率为 30fps),当 7 个后备缓冲区的工作是一起完成 5-7 帧,然后是一些空的 VSync,然后再次 5-7 帧,依此类推)。

先感谢您!

0 投票
1 回答
2023 浏览

c++ - 如何使用 Direct3D 设备管理器?

我想在我的 Direct3D 应用程序中的多个线程和对象之间共享一个 Direct3D 设备。我遇到了 Direct3D 设备管理器,它看起来像我想要的,虽然我没有做任何视频处理或视频加速:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa965267( v=vs.85).aspx

在我的代码中,我正在执行以下操作:

我的问题是,一旦我创建了 Direct3D 设备管理器,如何在不传递指向设备管理器的指针的情况下与其他对象共享 direct3d 设备管理器?微软明确表示要执行以下操作,但我不知道以下内容的真正含义是什么:

设备所有者必须为其他对象提供一种方法来获取指向 IDirect3DDeviceManager9 接口的指针。标准机制是实现 IMFGetService 接口。服务 GUID 是 MR_VIDEO_ACCELERATION_SERVICE。

有人可以告诉我如何使用 IMFGetService 接口共享设备管理器吗?

0 投票
0 回答
2495 浏览

windows - 使用 dxva 解码 h264 视频

我正在开发一个需要使用 dxva2.0 解码 h264 视频的项目。我根据文档http://msdn.microsoft.com/en-us/library/windows/desktop/aa965245%28v=vs.85%29.aspx编写代码. 也就是说,我创建了一个IDirectXVideoDecoder的接口,然后调用dxva api“BeginFrame”、“Execute”和“EndFrame”。然后问题就出来了。当我在 Intel Core i5 CPU(GPU 是 CPU 内的 Intel 高清显卡)上执行我的程序时,一切正常。但是当我在英特尔 ATOM 处理器(使用英特尔 GMA3000 系列图形硬件)上执行它时,我无法得到正确的结果:一些视频帧被正确解码,而另一些则完全一团糟。我使用的数据是从另一台电脑发送过来的,数​​据可以直接填充到dxva的缓冲区中。在 h264 中,缓冲区是 DXVA2_PictureParameter、DXVA2_Bitstream、DXVA2_InverseQuantization 和 DXVA2_SliceControl。所以没有必要使用ffmpeg或ffdshow(而且ffdshow是gpl,我不能使用它)。这 ”

0 投票
0 回答
163 浏览

windows-phone-8 - 是否可以在 windows phone 8 上使用 directx 视频加速?

我按照 MSDN 上 DXVA 的说明在 windows phone 8 上尝试,但由于 WP8 SDK 文件夹中没有 Dxva2.lib,我无法构建我的代码。没有lib我不能做DXVA,所以我想知道WP8是支持DXVA开发还是只有桌面版D3D支持?

0 投票
3 回答
18080 浏览

directx - 如何在 Directx 11 和 Windows 7 中使用硬件加速视频/H.264 解码?

我一直在研究一整天,并没有走得太远。我在windows 7上,使用directx 11。(我的最终输出是DX11纹理上的一帧视频)我想解码一些非常大的H.264视频文件,而CPU(使用libav)没有剪了它。

我已经查看了使用 DXVA2 的 libav 的 hwaccel 功能,但是当我需要创建只能使用 D3D9 接口创建的 IDirectXVideoDecoder 时遇到了障碍。(我没有使用 DX11)

每当我查看 DXVA 文档时,它都没有引用 DX11,这是在 DX10 或 11 中删除的吗?(找不到任何确认,也没有任何地方说 DXVA2 是多余的,可能它已被 DXVA-HD 取代?)

然后我查看了媒体基础 SDK,因为它看起来像我应该用于 DX11 ......但是我的标题中不存在任何类型(文档说只包含 <d3d11.h>,但是这个什么都没有产生)。他们还指定了最少的 Windows 8 来使用它。

我相信要使用 MF,我需要 windows 8 SDK,它现在包含所有的 directx 库/头文件。

所以这与 Windows 7 存在差距......是否有可能获得硬件加速视频解码?如果是这样,我应该使用哪个 API?

编辑:作为另一个跟进,我的 MediaFoundation(和 AVF、android、magic jump 等)实现在我的开源项目中 https://github.com/NewChromantics/POPH264 Edit2:但我不知道它是否支持赢7 :)

0 投票
1 回答
628 浏览

directx - 是否可以共享 DXVA 表面?

我正在使用 DXVA 视频解码器。它工作正常,但我想与另一个 IDirect3D9 设备对象共享解压缩的表面。

我阅读了这个文档,我正在调用IDirectXVideoDecoderService::CreateSurface()方法来创建表面,并且我尝试传递一个指向 NULL 的非 NULL HANDLE*作为该方法的最后一个参数。但是该方法失败,结果为 0x8876086c ( D3DERR_INVALIDCALL )。我还尝试分配一个 HANDLE 数组并将每个元素设置为 NULL,然后将该数组作为参数传递,但仍然得到相同的错误。

有没有办法在 IDirect3D9 设备之间共享 DXVA 表面?

0 投票
2 回答
2578 浏览

c++ - 使用 DirectX 视频加速 (DXVA) 实施媒体基础转换 (MFT)

目的是为视频处理和与外部应用程序同步实现自定义 MFT。的细节并不重要。作为第一步,我想要实现的是使用 DXVA 视频处理或 DXVA-HD 启动和运行 MFT。我无法这样做。

这是我所做的:我开始使用源输入节点(我的网络摄像头)、MFT(MFT_Grayscale 示例)和 EVR 构建拓扑。我将它包含在一个小型应用程序中。拓扑有效,我可以看到来自相机的单色流。现在我想更改 MF_Grayscale 示例的代码,使其支持 DXVA 视频处理并可以使用 VideoProcessBlt 方法提供的硬件加速。Microsoft 文档提供了一些信息,但我无法实现正在运行的 MFT。

到目前为止我做了什么:

pStreamInfo->dwFlags = MFT_OUTPUT_STREAM_PROVIDES_SAMPLES | MFT_OUTPUT_STREAM_WHOLE_SAMPLES | MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER | MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE;

直到这里,一切似乎都很好。现在我的问题(对不起,我不能更具体):

  • 我必须调整GetOutputAvailableType/SetOutputType方法吗?

  • ProcessInput方法中,我得到IMFSample并提取一个IMFMediaBuffer. IDirect3DSurface9根据我的函数调用,缓冲区没有管理 a 。我是否必须将缓冲区的数据存储到 Direct3D 表面?

  • ProcessOutput创建起点的方法中,我想将传入的帧转发到输出。VideoProcessBlt应该从输入到输出进行 1:1 blit。文档说:

    获取当前未使用的可用表面。

如何确定某个表面是否在使用中?

  • 我应该如何输出表面?我应该使用MFCreateVideoSampleFromSurfaceorMFCreateDXSurfaceBuffer吗?

  • 不幸的是,我真的迷路了,无法使用文档取得任何进展。

现在的情况是我看不到任何视频输出(窗口具有其默认的窗口背景颜色)并且网络摄像头在第一帧之后停止捕获帧(LED 关闭)。除此之外什么也没有发生——应用程序只是继续运行而不显示任何东西)。

我希望有人能帮助我。如果有人可以指导我使用 DXVA 视频处理或 DXVA-HD 为 MFT 示例代码,我也将不胜感激。我找不到任何东西...

谢谢