自定义输出分辨率 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) 而失败

Android中某些相机分辨率的不同捕获输出大小

coredrawl输出图像像素与分辨率设置的问题

unity游戏自定义分辨率 教你如何自定义

unity发布自定义分辨率

Ubuntu如何自定义分辨率