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

C++ DXGI桌面复制:编码帧以通过网络发送,c++,ffmpeg,video-streaming,ms-media-foundation,dxgi,C++,Ffmpeg,Video Streaming,Ms Media Foundation,Dxgi,我正在尝试编写一个应用程序,它将捕获屏幕上的视频流并将其发送到远程客户端。我发现在Windows上捕获屏幕的最好方法是使用(从Windows 8开始提供)。微软提供了一种简洁的方法,可以将复制的帧流到屏幕上。现在,我一直在想什么是编码这些帧并通过网络发送的最简单但相对较快的方法 这些帧来自一个包含桌面位图和元数据的曲面,其中包含已更新的脏区域和移动区域。在这里,我有两个选择: 从DirectX表面提取位图,然后使用外部库(如ffmpeg)将一系列位图编码到H.264并通过RTSP发送。虽然简单,

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

这些帧来自一个包含桌面位图和元数据的曲面,其中包含已更新的脏区域和移动区域。在这里,我有两个选择:

  • 从DirectX表面提取位图,然后使用外部库(如ffmpeg)将一系列位图编码到H.264并通过RTSP发送。虽然简单,但我担心这个方法会太慢,因为它没有利用任何原生Windows方法。将D3D纹理转换为ffmpeg兼容位图似乎是不必要的工作
  • :将D3D纹理转换为IMFSample,并使用MediaFoundation对帧进行编码。我找到了一种视频编码方法,但我还没有找到一种方法来立即获取编码帧并发送它,而不是将它们全部转储到视频文件中
  • 因为我以前从未做过类似的事情,我在问自己是否朝着正确的方向前进。最后,我希望有一个简单的、最好是低延迟的桌面捕获视频流,我可以从远程设备查看


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

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

    有关编码详细信息,请参阅示例


    一旦你得到编码的IMF样本,你就可以通过网络一个接一个地发送它们。

    你的链接已失效。找到了这个链接对我有用。谢谢你的链接。这应该被标记为这篇文章的答案。