捕获窗口应用程序(使用GPU的应用程序)并保存到Python中的视频文件

wi3ka0sx  于 2023-06-20  发布在  Python
关注(0)|答案(1)|浏览(87)

我正在尝试用Python创建一个应用程序,它需要捕获使用GPU生成图像的窗口应用程序的内容。
我最初尝试使用ffmpeg和gdigrab来捕获窗口内容,但结果是灰色屏幕,经过一些研究,我认为这是因为ffmpeg无法从使用GPU加速的窗口捕获内容。
然后我尝试在Python中使用mss库,虽然我可以捕获整个屏幕或指定区域而没有问题,但捕获与其他窗口重叠的特定应用程序窗口的内容会导致捕获所有重叠的窗口,而不仅仅是目标应用程序。
有趣的是,OBS Studio在“捕获方法”设置为“Windows 10(1903及更新版本)”时可以正确捕获窗口内容,但在设置为“BitBlt(Windows 7及更新版本)”时则不能。然而,OBS并没有为Python提供一个本地API,可以轻松地与其他应用程序集成。
有没有一种方法可以在Python中使用ffmpeg或其他库,应用程序来捕获使用GPU加速的窗口内容?
任何建议或指导将不胜感激。

**编辑:**我发现了一个直接从应用程序窗口获取图像的选项:https://stackoverflow.com/a/76399855/14861684

我尝试在我的应用程序中使用capture_win_alt()函数来实现这个解决方案。它的输出重定向到ffmpeg,ffmpeg从接收到的帧中创建记录。不幸的是,录制的质量并不令人满意-也就是说,例如,应该具有60 s和60 fps的录制(其给出每个录制的总共360帧),实际上只有大约5秒,并且看起来非常过度压缩。
在我看来,这就好像我们想以20 FPS录制10秒,但每秒只下载一帧,这给了我们总共下载了10帧(而不是200帧),记录被转换为20 FPS,这给了10/20 = 0.5s的记录,而不是10 s。通过这个动作,记录被显著缩短并且看起来非常加速。
我目前的解决方案/实施似乎非常低效。如何将帧率与录制中的FPS数量同步?如何保护丢失帧的情况下-插入黑屏或/某种方式来动态FPS?
PS:我关心非常好的记录准确性,因为我的应用程序同时跟踪各种数据,并用时间戳记录它-以便将事件的发生与记录的时刻(匹配)联系起来。

yduiuuwa

yduiuuwa1#

有一种使用python捕获屏幕的方法,比如pyautogui。然而,它不适用于硬件加速的应用程序(使用GPU),因为它们直接渲染到屏幕,绕过pyautogui能够捕获的典型帧缓冲区。
要捕获此类应用程序,您通常需要使用更高级的方法,例如使用游戏捕获软件或使用DirectX或Vulkan等API,这些方法可能要复杂得多,并且通常无法在Python中完成。

相关问题