java - 从屏幕截图生成视频提要的替代方法

标签 java screenshot video-capture video-encoding

我在远程管理玩具项目中工作。现在,我可以使用 Robot 类捕获屏幕截图并控制鼠标。屏幕截图是 BufferedImage 实例。

首先是我的要求: - 只有一个服务器和一个客户端。 - 性能很重要,因为客户端可能是 Android 应用。

我考虑过打开两个套接字连接,一个用于鼠标和系统命令,第二个用于视频输入。

如何将屏幕截图转换为视频流?我应该将它们转换为已知的视频格式,还是只发送一系列序列化图像就可以了?

压缩是另一个问题。根据我的初步测试,以全分辨率发送屏幕截图会导致低帧率。我想我至少需要 24 fps 才能感知运动,所以我必须缩小和压缩。我可以将 BufferedImages 转换为 jpg 文件,然后设置压缩率,但我不想将文件存储在磁盘上,它们应该只存在于 RAM 中。另一种可能性是将实例(表示未压缩的屏幕截图)序列化为 GZipOutputStream。正确的做法是什么?

总结:

  • 如果您推荐“图像系列”方法,您将如何将它们序列化到套接字 OutputStream
  • 如果您的提议是转换为已知的视频格式,可以使用哪些类或库?

提前致谢。

更新:我的测试、客户端和服务器在同一台机器上
-全屏序列化 BufferedImages(仅维度、类型和 int[]),无压缩:1.9 fps。
- 通过 GZip 流的全屏图像:2.6 fps。
-缩小图像(640 宽度)和 GZip 流:6.56 fps。
-全屏图像和 RLE 编码:4.14 fps。
-缩小图像和 RLE 编码:7.29 fps。

最佳答案

如果它只是屏幕截图,我不会使用视频压缩方案来压缩它们,很可能您不希望有损压缩(小文本中的细节模糊等是最常见的缺陷)。 要获得可行的“远程桌面”感觉,请记住之前发送的屏幕截图并仅发送差异 以转到下一个屏幕截图。如果帧之间没有(或很少)变化,这是非常有效的。 然而,它在某些情况下效果不佳,例如播放视频、游戏或在文档中滚动很多。

压缩两个 BufferedImage 之间的差异可以通过或多或少复杂的方法来完成,一个非常简单但相当有效的方法是简单地将一个图像从另一个图像中减去(导致它们相同的地方都为零)并压缩结果简单的 RLE(游程编码)。

降低颜色精度可用于进一步减少数据量(根据用例,您可以省略每个颜色 channel 的最低有效 N 位,对于大多数 GUI 应用程序,如果您将颜色从 24 位减少,看起来差别不大位到 15 位)。

关于java - 从屏幕截图生成视频提要的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9031434/

相关文章:

java - JFreeChart : Remove comma in X label axis

java - 如何通过类型签名搜索 Java API 方法?

iPhone/iPad问题如何显示对话框+如何制作屏幕截图?

c# - Hololens - 访问相机框架

python - 如何使VideoCapture返回错误而不是警告?

java - 即使使用所有注释和组件扫描后也会出现 NoSuchBeanDefinitionException

java - Visual Cobol 2010 和 eclipse

android - 拍摄 Android 手机的打印屏幕?

android - 在android中以编程方式获取设备快照

c# - 使用 Accord.net (AForge) 录制视频