2016-01-13 29 views
6

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

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

  1. 从一个DirectX表面提取的位图,然后使用一个外部库像的ffmpeg编码系列的位图到H.264和发送过来RTSP。虽然直截了当,但我担心这种方法会太慢,因为它没有利用任何本地Windows方法。将D3D纹理转换为ffmpeg兼容位图看起来像是不必要的工作。
  2. From this answer:将D3D纹理转换为IMFSample并使用MediaFoundation的SinkWriter对帧进行编码。我发现了视频编码的this tutorial,但我还没有找到立即获取编码帧并发送它的方式,而不是将它们全部转储到视频文件。

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

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

回答

4

您可以使用IMFTransform接口进行H264编码。一旦你从ID3D11Texture2D获得IMFSample,只需将其传递到IMFTransform :: ProcessInput并从获得编码的IMFSample IMFTransform :: ProcessOutput

请参阅this示例编码细节。

一旦你得到了编码的IMFSamples,你可以通过网络逐一发送它们。

+0

Your link is dead –

+1

找到链接[here](https://github.com/ashumeow/webrtc4all/blob/master/gotham/MFT_WebRTC4All/test/test.cc) –