在Android上的应用程序内屏幕录制,每秒捕获15帧

Dev*_*evN 9 android screen-capture

经过大量的搜索和几天的实验,我还没有找到一个直接的解决方案.

我正在开发一个应用程序,用户将与屏幕上的宠物进行交互,我想让他将其保存为视频.

是否有任何"简单"的方式来捕获应用程序本身的屏幕?

我找到了一个解决方法(每秒保存一些位图,然后将它们传递给编码器)但它似乎太重了.即使帧速率为15fps,我也会很高兴

这似乎是可能的,即有一个类似的应用程序,这称为"会说话的汤姆"

Sir*_*get 2

这实际上取决于您实现“宠物视图”的方式。你在画布上画画吗?OpenGl ES?正常的Android视图层次结构?

不管怎样,没有像评论之一所说的那样神奇的“recordScreenToVideo()”。

你需要:

  • 获取代表您的“帧”的位图。这取决于你如何实现你的观点。如果您自己绘制(Canvas 或 OpenGL),则将原始像素缓冲区保存为帧。如果您使用普通的视图层次结构,则将 Android 的 onDraw 子类化并保存在画布上获得的“框架”。系统调用onDraw的频率将不低于屏幕的实际“帧率”。如果需要,随后复制帧以提供 15fps 的视频。

  • 对您的帧进行编码。看起来你已经有了一个机制可以做到这一点,你只是需要它变得更有效率。

优化编码的方法:

  • 缓存您的位图(帧)并随后进行编码。仅当您预期的视频相对较短时,此功能才有效,否则您将耗尽存储空间。
  • 仅以应用程序实际生成的帧速率进行录制(取决于您绘制的方式),并使用编码器参数生成 15fps 视频(实际上不提供每秒 15 帧)。
  • 将质量设置调整为当前设备。可以通过在应用程序启动时执行隐藏的 CPU 周期测试并定义一些阈值来完成。
  • 仅对屏幕最相关的部分进行编码。
  • 同样,这实际上取决于您的实现方式 - 如果您可以保存一些“历史数据”,然后将其转换为帧而无需实时执行,那就最好了。例如,“移动”、“微笑”、“改变颜色”——或者任何你的业务逻辑,因为你没有详细说明。您的“生成电影”功能会将这些历史数据动画化为帧序列(不绘制到屏幕上),然后进行编码。

希望有帮助