Hotdry.

Article

Android后台录像架构:Camera2与MediaRecorder协同及前台服务保活机制

基于FadCam开源项目,解析Android后台录像的前台服务保活、Camera2与MediaRecorder协同、多路视频源管理的技术实现与工程参数。

2026-05-13systems

Android 后台录像功能在行车记录仪、安防监控等场景中需求广泛,但实现过程面临系统限制、资源竞争和生命周期管理等多重挑战。FadCam 作为开源的隐私优先型多媒体录制套件,其后台录像架构为开发者提供了可借鉴的工程实践。

前台服务保活机制

Android 10 + 对后台相机访问施加了严格限制,应用在后台时无法直接访问摄像头。FadCam 采用前台服务 (Foreground Service) 方案解决此问题。在 AndroidManifest.xml 中声明了FOREGROUND_SERVICE_CAMERAFOREGROUND_SERVICE_MICROPHONE等多个前台服务类型权限,确保服务在后台运行时系统不会将其终止。

RecordingService 作为核心服务类,约 7000 行代码负责管理整个录制生命周期。服务启动时调用startForeground()并传入持续通知,这是满足 Android 后台执行限制的必要条件。同时服务持有PARTIAL_WAKE_LOCK唤醒锁,防止 CPU 进入休眠状态导致录制中断。

Camera2 与 MediaRecorder 协同架构

FadCam 采用 Camera2 API 而非传统的 Camera API,以获得更精细的相机控制能力。核心流程如下:首先通过CameraManager枚举可用摄像头并打开目标设备;然后创建CameraCaptureSession,配置预览 Surface 和 MediaRecorder 的输入 Surface;最后通过setRepeatingRequest()启动持续帧捕获,数据流同时送往预览和编码器。

MediaRecorder 的配置需要与 Camera2 参数严格匹配。视频分辨率、帧率、编码格式等参数必须在两个组件间保持一致,否则会导致会话创建失败。FadCam 支持 60/90fps 高帧率录制,并实现了分段录制功能,当文件达到设定大小时自动切换新文件,降低因意外中断导致的数据丢失风险。

双摄像头录制与 Surface 合成

DualCameraRecordingService 实现了前后摄像头同时录制的高级功能。该服务管理两个独立的 CameraDevice 实例,主摄像头输出全分辨率画面,副摄像头以画中画 (PiP) 形式叠加。两路视频流通过 GLRecordingPipeline 进行 OpenGL 合成,最终输出到单一 MediaRecorder。

双摄像头并发受硬件能力限制,部分设备不支持同时打开两个摄像头。FadCam 实现了优雅的降级策略:当检测到不支持并发时,仅使用主摄像头持续录制,副摄像头改为周期性快照模式(每 3 秒捕获一帧),既保留了双画面 UI 效果,又确保了录制连续性。

运行时相机控制实现

FadCam 实现了完整的相机参数实时调整能力。曝光补偿通过CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION设置,支持获取设备实际的 EV 步进值进行精确控制。AE 锁定功能在启用前会等待自动曝光收敛,通过捕获结果回调检测CONTROL_AE_STATE_CONVERGED状态后再执行锁定,避免锁定在不稳定的曝光参数上。

缩放功能通过SCALER_CROP_REGION实现,计算传感器有效区域与目标缩放比例的裁剪矩形。对于 Android 11 + 设备,优先使用CONTROL_ZOOM_RATIOAPI 获得更平滑的缩放体验。点击对焦则通过设置CONTROL_AF_REGIONS和触发CONTROL_AF_TRIGGER_START实现,1 秒后自动恢复之前的 AF 模式。

工程参数与兼容性清单

基于 FadCam 的实现经验,后台录像开发需关注以下参数配置:

  • 前台服务类型:必须声明cameramicrophone类型,Android 14 + 要求精确匹配实际使用的功能
  • HandlerThread 命名:相机操作需在独立线程执行,建议命名为 "CameraBackground" 便于调试追踪
  • 会话配置超时:部分设备相机驱动响应较慢,Surface 配置建议设置 5 秒超时保护
  • 文件描述符模式:Android 10 + 推荐使用 SAF (Storage Access Framework) 获取 ParcelFileDescriptor,避免直接路径访问受限
  • 双摄像头检测:通过CameraManager.getConcurrentCameraIds()查询并发支持能力,失败时自动降级

FadCam 的架构设计展示了如何在 Android 严格的权限和后台限制下,构建稳定可靠的后台录像功能。其开源代码为同类应用开发提供了完整的参考实现。


参考来源

systems

内容声明:本文无广告投放、无付费植入。

如有事实性问题,欢迎发送勘误至 i@hotdrydog.com