问题标签 [desktop-duplication]

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 投票
1 回答
412 浏览

c++ - 使用 DXGI 进行窗口捕捉

我有一个使用 DXGI 的桌面捕获工作版本。有没有办法使用同一个管理器捕获一个单独的窗口(HWND)?

0 投票
1 回答
182 浏览

c++ - 链接 Cuda (cudart.lib) 使 DXGI DuplicateOutput1() 失败

由于一个模糊的原因,在我的项目中添加 cudart.lib 后,我对 IDXGIOutput5::DuplicateOutput1() 的调用失败并出现错误 0x887a0004 (DXGI_ERROR_UNSUPPORTED)。

我在 Visual Studio 2019 上工作,我的监视器复制代码是经典的:

我目前唯一尝试对 cuda 做的就是列出 Cuda 设备:

此外,在我尝试使用 DXGI 开始监控复制之后,这段代码被调用了很久。

我的应用程序中的每件事似乎都是正确的:我调用了 SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2),但我没有在离散 GPU 上运行(请参阅 [ https://support.microsoft.com/en-us/help/3019314/error -生成-when-desktop-duplication-api-capable-application-is-ru][1] )

顺便说一句,它曾经工作过,如果我从链接器输入中删除“如此简单”的 Cuda 调用和 cudart.lib ,它就会再次工作!

我真的不明白什么会导致这种奇怪的行为,有什么想法吗?

0 投票
2 回答
248 浏览

c# - 尝试在英特尔 630 HD 上使用 DXGI 和 DirectX11 捕获桌面时出错

尝试使用 DXGI 捕获运行在 Intel 630 HD 上且具有最新驱动程序的笔记本电脑上的内置屏幕时,出现以下错误。当我捕获在我的 GTX 1070 上运行的外部屏幕时,该代码有效。

我的表格中的代码:

出错的代码部分:

它特别在线错误:

使用内部显示器和intel 630时出现错误的原因是什么?

编辑#1:mTextureDescription 创建:

整个桌面复制过程在同一个线程上完成。

更新 #2:在英特尔 630Width = this.mOutputDescription.DesktopBounds.Right,上返回 0,而在我的 1070 上返回 1920。

0 投票
1 回答
309 浏览

directx - 桌面复制 API 返回空帧

我知道已经有一些问题问这个或类似的问题,我深入研究了其中的一些,但没有任何成功。

我尝试使用桌面复制 API 捕获我的显示器的“屏幕截图”并处理它的像素数据。后来我想每秒至少做 30 次,但那是另一种情况。目前,我尝试了microsoft的示例:https ://github.com/microsoftarchive/msdn-code-gallery-microsoft/tree/master/Official%20Windows%20Platform%20Sample/DXGI%20desktop%20duplication%20sample 我成功保存了屏幕图片并使用该代码访问像素数据。

现在我想将示例代码分解为我需要的基本内容。由于我不熟悉 DirectX,我很难做到这一点。我想出了以下代码,它运行时没有错误,但会产生一张空白图片。我在调试模式下检查 hr,我知道这是不好的做法和肮脏的!

谁能给我一个提示,这段代码有什么问题?

编辑:刚刚找到下面的代码片段并将其集成到我的代码中。现在它起作用了!经验教训:-) 实际输出/处理小时!-) AcquireNextFrame 可能在第一次尝试时不起作用(?)

我可能会用更好的代码和功能循环再次更新这篇文章。

0 投票
1 回答
277 浏览

directx - DirectX 11 应用程序在非前台应用程序时显着减慢

我有一个应用程序通过 Direct2D 进行一些绘图并通过桌面复制 API 捕获屏幕内容。它是一个 C# 应用程序,但我有自定义分层窗口来进行显示,并且我通过 Direct2D 进行渲染以绕过 WPF 中的“智能”绘图,该绘图以前导致我的应用程序不能非常积极地竞争图形资源。

如果我将这个应用程序与占用大量图形资源的 DirectX 游戏同时运行,那么我得到的行为如下:

  1. 如果我的应用程序是前台应用程序,它可以正常工作

  2. 如果我的应用程序是可见的,但不是前台应用程序,那么对 Map Subresource 和 Copy Resource 的调用会花费高度可变的时间,有时会阻塞数百毫秒(根据分析器)。我不确定我是否相信数百,但肯定 Map Subresource 平均为 50 毫秒,因此捕获率降至 20FPS 以下。在前台运行时,相同的调用平均需要 4ms。

我已经检查过操纵进程和线程优先级是否可以做任何事情,但它没有。当我不在前台时,DirectX 似乎在限制我的东西,与优先级无关。这是一个问题,因为我的应用程序需要在不处于前台的情况下运行全帧速率。

如果它严格优先考虑来自前台应用程序的 GPU 命令,那么我可以看到我的应用程序可能在通往/来自 GPU 的通道上被饿死,因为这可以解释像这样的停滞。如果我能以某种方式免除此应用程序的此类监管,那将是最佳选择。例如某种清单条目或 DirectX 调用通知驱动程序(或堆栈)不要将我的应用程序视为后台?

我比较了 OBS 的代码(据我所知),我看不出它们有什么不同。即使在流媒体甚至要求苛刻的游戏时,即使它们显然不是前台应用程序,OBS 是如何设法继续复制/捕获的?

[编辑]

有问题的游戏是 DCS,它总是使用所有可用的 GPU 资源,如果你愿意的话,它使用大约 1.5 个内核。当我说它不在前台时开始变慢时,我实际上是在谈论从我的应用程序中单击一个窗口而不是在游戏窗口中单击(甚至不是最小化或任何东西。)当我在前台时,DCS 会随着我消耗资源。如果 DCS 在前台,它会继续以全速渲染并使用所有资源,我的捕获速度会减慢。

我发现如果我通过 vsync 将 DCS 限制为 60 FPS,我可以让事情顺利进行,这样它就不能使用所有资源。然后一切正常。显然,这并不能解决问题,但它进一步表明这很可能是一些资源争用。我很好地争夺资源,但它似乎优先考虑 DirectX 中的前台应用程序(或 Nvidia 的驱动程序?)

[/编辑]

0 投票
1 回答
347 浏览

c++ - 桌面复制 API - 屏幕捕获在 1366x768 (opencv) 上不起作用

我正在使用桌面复制 API - 截取屏幕截图 (c++)。这在原则上是有效的,但不是在每一个决议下。

我正在从 D3D11_MAPPED_SUBRESOURCE 创建一个 opencv 垫,然后显示图像。

在 1920x1080 下,它看起来像这样(正确): 在此处输入图像描述

在 1366x768 下它看起来像这样(错误)(而 1360x768 工作正常):还有一些其他分辨率具有相同的效果。

在此处输入图像描述

有谁知道这可能是什么?

这是我截取屏幕截图的完整代码:

DXGIScreenCapture.h 类 DXGIScreenCapture { public: DXGIScreenCapture(); ~DXGIScreenCapture();

DXGIScreenCapture.cpp

截图:

谢谢 :-)

0 投票
0 回答
127 浏览

c# - 是否可以在 gpu 级别裁剪屏幕截图

我的最终目标是尽快在屏幕上获取裁剪区域的屏幕截图。

我正在使用带有sharpdx的桌面复制api根据官方示例从windows中检索完整的屏幕截图:

https://github.com/sharpdx/SharpDX-Samples/blob/master/Desktop/Direct3D11.1/ScreenCapture/Program.cs

我目前在 CPU 级别使用固定内存位图和原始字节上的 Buffer.BlockCopy 进行裁剪,IMO 不能再快得多了。

是否可以在 GPU 级别应用简单的裁剪操作?

0 投票
0 回答
26 浏览

desktop-duplication - Visual Studio 打开时的桌面复制帧速率

C++ 桌面复制和媒体基础

我已经成功编写了一个桌面复制程序,可以将屏幕记录到 MP4 文件中。鼠标指针也画好了。

当我录制一个正在运行的视频时,比如一个 youtube 视频,录制的像素是完美的。但是...当我录制一个用鼠标移动完成的教程时,录制并不流畅。我可以理解,当活动很少或没有活动时,桌面复制不提供样本。

然而[这是我的主要问题],神秘地,当visual studio运行,或者VLC打开,甚至youtube打开时,教程录制变得更加流畅。我对此感到困惑。有什么解释吗?这些程序是否会导致 Windows 10 更频繁地提供屏幕图像?

0 投票
0 回答
31 浏览

c++ - 范围解析运算符内外部结构的 C++ 无法访问的方法

因此,我正在开发一个使用桌面复制 API 的应用程序,但是,当使用该IDXGIDevice界面并尝试访问其getParent方法时,我收到以下错误

类“IDXGIDevice”没有成员“GetParent”

像这样使用头文件和范围解析运算符时

DDAPI.h

DDAPI.cpp

我已经初始化了 ID3D11Device m_Device

但是 ,如果我要像这样在 DDAPI.cpp 文件中创建类,它可以工作并且不会给我一个错误

在第一个示例中,IntelliSense 没有显示所有其他IDXGIDevice具有的方法(仅包含基本 IUnknown 接口方法),但在第二个示例中显示

这可能只是一个 IntelliSense 错误,因为没有构建错误,但如果它显示为错误,我假设这意味着我可以用另一种方式做到这一点

0 投票
1 回答
79 浏览

textures - DXGI/NvEnc YUV44 10bit 格式兼容性

使用 DirectX 11、DXGI DDA 和 NvEnc。我必须支持 YUV420、YUV444、8bit 和 10bit。我的转换适用于 YUV420、YUV444 和 8bit。使用 10 位时,我遇到了 DXGI_FORMAT 与 NV_ENC_BUFFER_FORMATS 的兼容性问题。

我有计算着色器将 DDA 捕获格式(DXGI_FORMAT_B8G8R8A8_UNORM 用于 8 位,DXGI_FORMAT_R16G16B16A16_FLOAT 用于 10 位)转换为 NvEnc 的 YUV 格式。在 NvEnc 中使用内置 RGB 格式似乎不起作用,因为它们都在内部转换为 YUV420(没有 YUV444)并且我无法控制色度坐标(例如 BT.601、BT.709)

DXGI 支持的 YUV444 10bit 格式有:

DXGI_FORMAT_Y410(10 位压缩,2 位 alpha,每像素 32 位)

DXGI_FORMAT_Y416(10 位解压缩为每通道 16 位,16 位 alpha,每像素 64 位)

NvEnc 支持的 YUV444 10bit 格式有:

NV_ENC_BUFFER_FORMAT_YUV444_10BIT(10bit 解压为每通道 16bit,无 alpha,每像素 48bit)

所以这就是问题所在。这里没有兼容的格式。看来我在两者之间转换的唯一选择是结构化缓冲区(并做更多的手动工作),或 DXGI_FORMAT_R16_FLOAT 格式,并使尺寸成为我框架尺寸的 3 倍。它还需要我建立另一个管道。每次转换我已经有 4 个,因为我还必须将鼠标指针(颜色、蒙版颜色或单色)写入图像。这只会让我的系统比现在更令人讨厌和臃肿。

我有更好的选择吗?这些格式有什么我遗漏的吗?除了在定义它们的 NvEncodeApi.h 标头中之外,Nvidia 根本不谈论这些格式。