【问题标题】:Encoding Desktop Duplication API ID3D11Texture2D frame using NvPipe使用 NvPipe 编码桌面复制 API ID3D11Texture2D 帧
【发布时间】:2019-05-30 10:06:46
【问题描述】:

我正在尝试使用 Desktop Duplication API 捕获桌面帧,并立即使用 NvPipe 对其进行编码,而无需通过 CPU 访问像素。

有没有什么方法可以将 ID3D11Texture2D 数据作为 NvPipe 的输入,或者其他一些有效的方法?我正在开发一种要求尽可能低延迟的 VR 解决方案,因此即使节省 1 毫秒也是一件大事。

编辑:在遵循@Soonts 的建议后,我最终得到了这个似乎不起作用的代码:

    cudaArray *array;
    m_DeviceContext->CopySubresourceRegion(CopyBuffer, 0, 0, 0, 0, m_SharedSurf, 0, Box);
    cudaError_t err = cudaGraphicsD3D11RegisterResource(&_cudaResource, CopyBuffer, cudaGraphicsRegisterFlagsNone);
    err = cudaGraphicsResourceSetMapFlags(_cudaResource, cudaGraphicsMapFlagsReadOnly);
    cudaStream_t cuda_stream;
    cudaStreamCreate(&cuda_stream);
    err = cudaGraphicsMapResources(1, &_cudaResource, cuda_stream);
    err = cudaGraphicsSubResourceGetMappedArray(&array, _cudaResource, 0, 0);
    uint64_t compressedSize = NvPipe_Encode(encoder, array, dataPitch, buffer.data(), buffer.size(), width, height, false);

NvPipe_Encode 导致内存访问冲突并且不执行任何操作。我不知道我搞砸了哪一步,因为我似乎无法在网上找到任何关于任何函数或变量/结构的文档,并且将手表放在变量上除了它们在内存中的地址之外没有显示任何有价值的信息。

【问题讨论】:

    标签: c++ encoding nvidia desktop-duplication


    【解决方案1】:

    我没有尝试过,但我认为应该可以使用 CUDA 互操作。

    调用 cudaGraphicsD3D11RegisterResource 为 CUDA 互操作注册纹理。不确定是否可以注册从 DD 获得的 DWM 拥有的纹理。如果不能,再创建一个(在默认池中),注册那个,并使用 ID3D11DeviceContext::CopyResource 更新每一帧。

    调用 cudaGraphicsResourceSetMapFlags 指定您希望从互操作的 CUDA 端进行只读访问。

    调用cudaGraphicsMapResources 以允许CUDA 访问纹理。

    致电cudaGraphicsSubResourceGetMappedArray。现在您有了一个设备指针,其中包含可以提供给 NvPipe 的帧数据。

    附:其他选项是使用媒体基础而不是 NvPipe。不仅适用于 nVidia,适用于所有 GPU,在大多数系统上,MF 还使用硬件编码器。我不确定延迟,从未将 MF 用于对其过于敏感的任何事情,也从未使用过 NvPipe,不知道它们如何比较。

    【讨论】:

    • 这是非常好的信息,立即尝试。似乎它会成功,我也会尝试媒体基金会,“适用于所有 GPU”似乎很有吸引力。将向您更新进度。谢谢!
    • @Hey'Youssef 无论编码 API 是什么,流的 FPS 都很难正确处理。 DD 不会给你 60Hz 的帧,它只会在 Windows 渲染任何东西时给你新的帧。一种方法是将旧帧保留在 VRAM 中,并尝试以固定速率将帧提交给编码器。
    • 我根据进度编辑了我的问题,如果你能看一下,我将非常感激。
    猜你喜欢
    • 1970-01-01
    • 2016-04-18
    • 2017-11-08
    • 2017-09-21
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 2012-11-09
    • 2016-09-17
    相关资源
    最近更新 更多