【问题标题】:Fast screen capture and video recording快速截屏和视频录制
【发布时间】:2009-09-01 08:13:35
【问题描述】:

有没有人致力于将屏幕捕获到视频流(存储在本地文件或发送到网络)?

我了解如何做到这一点,并且有几个测试解决方案可以工作 - 但我们很难实现良好的性能。我们需要在 CPU 已经被大量使用的计算机上捕获大约 4 兆像素的不断变化的文本和矢量图形屏幕空间。

通过将未压缩的 BMP 帧发送到网络可以实现可接受(尽管远非预期)的性能,但由于许多原因,至少一些现场压缩很重要。

关于如何使用尽可能少的处理能力进行编码的任何建议:可能是一个非常快的编解码器?或者一些避免在内存中复制图像的技巧?使用 DirectX 捕获屏幕(大部分屏幕都在 WPF 中)值得吗?

【问题讨论】:

  • 为什么不发送 jpeg 或 png? jpeg 的编码对 CPU 来说是否过多?
  • 是的,运动 jpeg 是一种可能性。但是我希望更好 - 它仍然比我认为的要多。毕竟,现代摄影相机使用其微型电池供电的编码器来管理帧间编码,我用 5% 的 CPU 无法实现同样的效果似乎很奇怪。
  • 您需要捕获整个屏幕,还是只捕获特定(尽管可能是全屏)窗口的内容?
  • 几个显示器上的几个大窗口。

标签: wpf video screenshot codec


【解决方案1】:

好吧……这是一个疯狂的猜测,因为我从未尝试过……但这似乎是合理的。我认为你应该使用 Nvidia CUDA。例如:

我在想你可以从图像(在内存中)创建纹理,然后再压缩它。在 CUDA SDK 中有一个sample for DirectX Texture Compressor (DXTC):

使用 CUDA 的高质量 DXT 压缩。该示例展示了如何在 GPU 上并行实现现有的计算密集型 CPU 压缩算法,并获得数量级的性能提升。

您可以在内存中存储一​​些纹理(取决于视频内存的数量)并将它们写入另一个线程上的磁盘/套接字。

这只是一个建议...我认为最好的方法是使用 CUDA 实现编码算法(参见TMPGEnc)将负载从 CPU 转移到 GPU,但这很棘手并且需要大量工作.

【讨论】:

  • 这可能行得通,尽管为此目的编写一次性编解码器肯定不切实际。有 GPU 加速的 H.264 编码器,我应该试试看。
  • 是的...但我不知道这些是否免费和开源:P
【解决方案2】:

我在搜索 CUDA 和屏幕截图时遇到了这个问题,并认为我应该添加我的经验。我过去使用 VNC 和 FFMPEG 创建了一个解决方案。如果您查看 VNC 协议,您会发现它基于具有新图像的增量窗口进行传输。基本上,上一个屏幕 + 更改 = 新屏幕。唯一需要传输的是更改。您会发现许多技巧来最小化传输成本和许多不同的有效负载扩展来传输数据,即使您决定利用所获得的知识自行开发,它也是一个很好的资源。一旦我们使用 VNC 移动像素数据,我们发现原始像素数据对我们的 cpu 来说比 jpeg 数据更昂贵,因为缓冲区副本比压缩更昂贵。

【讨论】:

  • VNC(嗯,几乎所有的远程桌面系统,VNC 既不是第一也不是最好的)方法本质上是帧间编码思想的简单实现。它适用于具有矩形非透明窗口的桌面,但当图像变得更复杂时会迅速降级。通用帧间代码的作用相同,但采用更复杂和通用的方式。还有 JPEG……您是否真的将这种解决方案与 WMV、MPEG 的“轻”层和其他替代方案进行了比较?
【解决方案3】:

许多软件都使用 xvidcap 或 camstudio 等图形界面来实现这一点,但 ffmpeg 可能对你有一个很好的解决方案......

【讨论】:

  • “第一篇文章”?这个问题不仅仅是标题
【解决方案4】:

对我来说,使用 ffmpeg+directshow 截屏device + huffyyuv 使用的 CPU 很少。但是大量的磁盘/带宽:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2015-12-14
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多