安卓应用内屏幕录制以每秒15帧的速度捕捉画面

9

经过长时间的搜索和多日的实验,我没有找到一个直接的解决方案。

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

有没有任何“简单”的方法来捕获应用程序本身的屏幕?

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

似乎有可能,即有一个类似的应用程序可以做到这一点,它被称为“Talking Tom”。


4
你是否必须实际录制屏幕?或者你可以基于记录用户输入/宠物状态来渲染视频,使其看起来与屏幕截图完全相同,而不是实际的屏幕捕获? - Sam Mussmann
2
有没有“简单”的方法来捕获应用程序本身的屏幕?与直接创建所需内容的位图相比,为什么要这样做?当您在像Photoshop这样的图像编辑器中保存图像时,您认为应用程序会截取屏幕并保存吗? - CommonsWare
1
你是否正在使用OpenGL渲染你的宠物?你可以在每一帧后使用glReadPixels()来获取数据,然后随心所欲地处理它。是的,这个建议基本上与你提到的“解决方法”相同。我不认为Android内置了任何神奇的recordScreenToVideoFile(),因此抓取帧并对其进行编码可能是你能得到的最好的选择。 - Nicu Stiurca
1个回答

2
这取决于您如何实现您的“宠物视图”。您是在Canvas上绘制吗?还是OpenGL ES?还是普通的Android视图层次结构?
无论如何,像其中一条评论所说的那样,并没有神奇的“recordScreenToVideo()”。
你需要:
- 获取表示您的“帧”的位图。 这取决于您如何实现您的视图。如果您自己绘制(Canvas或OpenGL),请将原始像素缓冲区保存为帧。 如果您使用普通的视图层次结构,请子类化Android的onDraw并保存您在画布上获得的“帧”。系统调用onDraw的频率不会低于屏幕的实际“帧速率”。如果需要,之后复制帧以提供15fps视频。
- 编码您的帧。看起来您已经有了一个机制来做到这一点,您只需要使其更加高效。
优化编码的方法:
- 缓存您的位图(帧),然后进行编码。这仅适用于您预期的视频相对较短,否则您将耗尽存储空间。 - 仅以应用程序实际生成的帧速率进行记录(取决于您绘制的方式),并使用编码器参数生成15fps视频(而不实际提供每秒15帧)。 - 调整当前设备的质量设置。可以通过在应用程序启动时执行隐藏的CPU循环测试并定义一些阈值来完成。 - 仅编码屏幕上最相关的部分。 - 再次,这取决于您的实现方式 - 如果您可以保存一些“历史数据”,然后将其转换为帧而无需实时执行,那将是最好的。 例如,“移动”,“微笑”,“更改颜色” - 或任何您的业务逻辑,因为您没有详细说明。您的“生成电影”函数将将此历史数据作为帧序列动画化(而不绘制到屏幕),然后进行编码。
希望这有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接