【发布时间】: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