我正在尝试编写一个将捕获屏幕视频流并将其发送到远程客户端的应用程序。我发现,在Windows上捕获屏幕的最佳方法是使用DXGI Desktop Duplication API(从Windows 8开始可用)。微软提供了一个简洁的sample,它将重复的帧流式传输到屏幕上。现在,我一直在想什么是最简单但仍相对快速的编码这些帧并通过网络发送它们的方法。

框架来自 AcquireNextFrame ,其表面包含桌面位图,而元数据包含已更新的脏区和移动区。从这里,我有两个选择:

  • 从DirectX曲面提取位图,然后使用 ffmpeg 之类的外部库将一系列位图编码为H.264,并通过RTSP发送。虽然简单明了,但我担心此方法会太慢,因为它没有利用任何 native Windows方法。将D3D纹理转换为ffmpeg兼容的位图似乎是不必要的工作。
  • From this answer:将D3D纹理转换为IMFSample并使用MediaFoundation的SinkWriter对帧进行编码。我找到了视频编码的this tutorial,但是我还没有找到一种方法来立即获取编码的帧并将其发送,而不是将其全部转储到视频文件中。

  • 由于我之前没有做过这样的事情,所以我要问我是否朝着正确的方向前进。最后,我希望有一个简单的,最好是低延迟的桌面捕获视频流,我可以从远程设备上观看它。

    另外,我想知道是否可以利用桌面复制提供的脏区和移动区。无需对帧进行编码,而是可以通过网络发送它们并在客户端进行处理,但这意味着我的客户端必须具有DirectX 11.1或更高版本,如果要流式传输到移动平台,这是不可能的。

    最佳答案

    您可以将 IMFTransform 接口(interface)用于H264编码。从 ID3D11Texture2D 获得IMFSample后,只需将其传递到 IMFTransform::ProcessInput ,然后从 IMFTransform::ProcessOutput 获取编码的IMFSample。

    有关编码的详细信息,请参见this示例。

    一旦获得了编码的IMFSamples,就可以通过网络将其一一发送。

    关于c++ - DXGI桌面复制: encoding frames to send them over the network,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34767280/

    10-13 03:26