c++ - DXGI 桌面重复 : encoding frames to send them over the network

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

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

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

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

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

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

最佳答案

H264编码可以使用IMFTransform接口(interface)。从 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/

相关文章:

swift - AVPlayer 无法正常工作 - Swift

android - 通过 rtsp 将 oculus rift 流式传输到 android

java - 在 windows 平台上优化 ffmpeg 以使用网络摄像头进行处理

c++ - Qt5Widgets.dll 丢失了吗?

audio - FFMPEG 视频到音频的转换结果在不同的持续时间

python-3.x - 在 Windows 上使用 Popen (python) 的 ffmpeg

linux - 检查视频文件是否有字幕

c++ - 如何使用指针 C++ 释放容器

c++ - STM32F103 微 Controller CAN 消息

c++ - 命名通过引用设置参数的函数的样式?