【问题标题】:DXGI Desktop Duplication: encoding frames to send them over the networkDXGI 桌面复制:编码帧以通过网络发送它们
【发布时间】:2016-04-18 11:05:36
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c++ ffmpeg video-streaming ms-media-foundation dxgi


    【解决方案1】:

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

    有关编码详情,请参阅this 示例。

    获得编码的 IMFSamples 后,您可以通过网络一一发送。

    【讨论】:

    • 您的链接已失效
    • 找到链接here
    • 这对我有用。感谢您的链接。这应该被标记为这篇文章的答案。
    猜你喜欢
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    相关资源
    最近更新 更多