在开发 RCamera 应用的过程中,我们遇到了一个颇为棘手的问题——耗电量大。
当 RCamera 以摄像机端运行时,一系列操作导致了高能耗:
- Camera 硬件持续运行进行录制
- 后台服务开启 Websocket Server 监听连接
- 渲染线程启动进行实时渲染
- 渲染结果输出到示例画面,或交给 encoder 进行 RTP 发送
这一连串的运行,使得 Camera 硬件发热严重,CPU 耗电也大幅增加。
优化策略:按需启动,按需关闭
为了解决这一问题,我们制定了一套优化策略。核心思路是:在不必要的情况下,关闭 Camera 硬件、停止相关线程以及 Encoder 和 RTP Sender。
那么,如何判断"是否必要"呢?主要基于两点:
- Activity 是否挂起(用户是否能看到画面)
- WebSocket Client 连接数(是否有客户端需要接收视频流)
具体方案
场景一:Activity 挂起 + 无客户端连接
当摄像机端的 Camera Activity 挂起,即用户看不到 Activity 画面时,理论上可以对 Camera 及后续处理流程进行关闭。
但有一个例外:如果此时有 WebSocket Client 连接,为了保证能将视频内容发送过去,Camera 仍需继续录制。
只有当 WebSocket 连接数为 0 且 Activity 挂起 时,我们才会:
- ✅ 关闭 Camera
- ✅ 停止 Render 线程
- ✅ 停止 Encoder 和 RTP Sender
- ✅ 仅保留 Websocket Server 运行,监听连接
这样一来,耗电量将大幅减小。
场景二:远程客户端连接
当远程的 Websocket Client 连接时,系统会触发:
- 🔄 启动 Camera 硬件
- 🔄 启动 Render 线程
- 🔄 启动 Encoder 和 RTP Sender
Camera 采集的视频就能顺利发送到 Websocket Client 端。
场景三:客户端断开连接
当 Websocket Client 断开连接时,系统会检查:
- Camera Activity 是否处于挂起状态
- 是否还有其他 Client 连接
若处于挂起且没有其他连接,就对 Camera 进行关闭处理,后续的 Render 和 RTP Sender 等相关处理也会一并关停。
效果
通过这样的优化处理,RCamera 在以摄像机形式运行时:
Camera 默认处于关闭状态,只有在真正需要使用时才会开启。
这一方案不仅成功解决了发热问题,还显著降低了耗电量,让 RCamera 变得更加高效、节能,为用户带来更好的使用体验。
如果你觉得这篇文章对你有帮助,欢迎分享给更多开发者朋友!