自定义输出分辨率 DuplicateOutput DXGI
Posted
技术标签:
【中文标题】自定义输出分辨率 DuplicateOutput DXGI【英文标题】:Custom output resolution DuplicateOutput DXGI 【发布时间】:2017-11-03 15:35:51 【问题描述】:我正在使用AcquireNextFrame
对我的桌面进行屏幕截图。是否可以在设置中设置我想要的输出图像的尺寸?
我在文档中看到这个函数IDXGIOutput::SetDisplaySurface
可以提供帮助。
这是我的代码:
//Here I init a output texture with less resolution
D3D11_TEXTURE2D_DESC desc;
desc.Width = 1280;
desc.Height = 720;
desc.MipLevels = desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.BindFlags = 0;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
ID3D11Texture2D *pTexture = NULL;
gDevice->CreateTexture2D(&desc, NULL, &pTexture);
IDXGISurface *surface = nullptr;
hr = gDevice->QueryInterface(__uuidof(IDXGISurface), reinterpret_cast<void **>(&pTexture));
if (FAILED(hr))
return;
// Here I should make lDxgiOutput->setDisplaySurface(surface)
hr = lDxgiOutput->GetDesc(&gOutputDesc);
if (FAILED(hr))
return;
IDXGIOutput1 *lDxgiOutput1 = nullptr;
hr = lDxgiOutput->QueryInterface(IID_PPV_ARGS(&lDxgiOutput1));
if (FAILED(hr))
return;
lDxgiOutput->Release();
hr = lDxgiOutput1->DuplicateOutput(gDevice, &gDeskDupl);
if (FAILED(hr))
return;
我的屏幕是 1920x1080,例如,我想获取 1280x720 的图像。
我在queryinterface
函数上遇到错误。
有人能告诉我我错过了什么吗?还是有任何解决方案可以更轻松地自定义分辨率?
谢谢
【问题讨论】:
【参考方案1】:Desktop Duplication API 以最少的开销为您提供桌面副本作为纹理。也就是说,不包括缩放。您可以随意抓取帧并按比例缩小它们,但这不是 Desktop Duplication 所做的或期望为您做的。
这个问题提出了几种方法(这个问题也与桌面复制有关):
Resizing a DXGI Resource or Texture2D in SharpDX此外,您可以使用 Media Foundation 的 Video Processor MFT,如果您不使用 Media Foundation,它有点不灵活,并且可能有不方便的外形尺寸,但使用 Direct3D 11 以有效的方式正确设置比例以提高性能。
另请参阅另一个相关的支持 GPU 缩放的 API:
DXVA Video Processing - Example 7: Stretching and Cropping Video【讨论】:
感谢您的回答!问题是使用 AcquireNextFrame 我得到了 DirtyRect 和 MoveRect。我从桌面初始分辨率中得到它。因此,如果我缩放 texture2D,Dirty & Move Rect 将不会与新缩放的纹理同步……这是个大问题。这就是为什么我要求已经缩放的输出......太糟糕了,微软没有考虑到这一点...... 如果你缩放纹理,你可以分别缩放矩形,不是吗?桌面复制为您提供了足够的输入,您拥有进一步处理数据所需的一切。 是的,这是真的.. 我必须做正确的计算。不是不可能。说实话,我仍然没有成功简单地缩放纹理......我应该使用 SharpDX 吗?没有教程显示正确执行此操作的步骤.. 我曾经使用过 Video Processor MFT,我知道它运行良好。我没有示例代码可以参考。我想 Direct2D 也可以正常工作。我链接了他的问题,该问题解释了 Direct2D 缩放的步骤。 DXVA 链接主要是为了完整性,由于复杂性,我认为您不应该走这条路。以上是关于自定义输出分辨率 DuplicateOutput DXGI的主要内容,如果未能解决你的问题,请参考以下文章
DXGI 1.5 DuplicateOutput1 因 DXGI_ERROR_UNSUPPORTED (0x887a0004) 而失败