DXGI桌面复制:编码帧以通过网络发送它们

pra*_*ber 7 c++ ffmpeg video-streaming dxgi ms-media-foundation

我正在尝试编写一个应用程序,它将捕获屏幕的视频流并将其发送到远程客户端.我发现在Windows上捕获屏幕的最佳方法是使用DXGI桌面复制API(从Windows 8开始提供).Microsoft提供了一个简洁的示例,它将重复的帧流式传输到屏幕上.现在,我一直想知道对这些帧进行编码并通过网络发送它们的最简单但又相对快速的方法是什么.

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

  1. 从DirectX表面提取位图,然后使用外部库(如ffmpeg)将一系列位图编码为H.264并通过RTSP发送.虽然直截了当,但我担心这种方法太慢,因为它没有利用任何本机Windows方法.将D3D纹理转换为ffmpeg兼容的位图似乎是不必要的工作.
  2. 从这个答案:将D3D纹理转换为IMFSample并使用MediaFoundation的SinkWriter对帧进行编码.我找到了这个视频编码教程,但我还没有找到一种方法来立即获取编码帧并发送它而不是将它们全部转储到视频文件中.

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

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

小智 5

您可以使用IMFTransform接口进行H264编码.从ID3D11Texture2D获取IMFSample后,只需将其传递给IMFTransform :: ProcessInput,并从IMFTransform :: ProcessOutput获取编码的IMFSample .

请参阅示例以获取编码细节.

获得编码的IMFSamples后,您可以通过网络逐个发送它们.