【发布时间】:2010-05-11 22:21:06
【问题描述】:
我想用一个自制的应用程序实时生成一部电影,该应用程序通过正在运行的 3D 应用程序占用部分屏幕进行快速截屏。
我知道为此已经存在多个应用程序(例如 FRAPS 或 Taksi),甚至专用的 DirectShow 过滤器(例如 UScreenCapture),但我确实需要使用我自己的外部应用程序来实现。
如果设置正确(UScreenCapture + ffdshow),捕获压缩全屏不会像您预期的那样消耗 CPU(大约 15%),并且不会影响 3D 应用的性能。
从外部应用程序进行捕获的问题是 3D 应用程序失去了它的 Vsync 并创建了一个毛茸茸的、难以使用的 3D 应用程序(3D 应用程序只呈现在屏幕的一小部分,其余的是 GDI, DirectX)
FRAPS 通过允许您一次只捕获一个应用程序(具有焦点的应用程序)解决了这个问题。根据所使用的技术(OpenGl、DirectX、GDI),它会挂接 Vsync 并进行捕获(使用 glReadPixels,...),而不会干扰它。 这样做并不能解决我的问题,因为我想要完整的合成屏幕图像(包括 3D 和其余部分)和流畅的 3D 应用程序。
UScreenCapture 似乎使用快速 DirectX 调用来捕获整个屏幕,但 openGL 3D 应用程序仍然不同步。
执行 BitBlt 太慢并且 CPU 消耗以进行实时 30 fps 采集(至少在 windows XP 下,在 7 下不确定)
我的问题是,是否有办法使用 Windows 7 实现我的目标,它是全新的 DirectX 合成引擎?
Windows 7 成功地显示每个应用程序的实时 VSync 重复预览(在任务栏中),因此必须有一种方法可以访问当前显示的屏幕缓冲区,而不会干扰 3D OpenGL 应用程序的渲染?
任何其他建议,技术? 谢谢
【问题讨论】:
-
你是如何使用 ffmpeg 的?
标签: windows-7 directshow screenshot capture vsync