CameraX 的四个核心 UseCase(Preview、ImageCapture、ImageAnalysis、VideoCapture)分别用于什么场景?
解读
国内面试中,这道题既考察候选人对 CameraX 架构的理解深度,也验证其是否能把“官方文档”翻译成“业务落地”。
面试官通常会在你回答完“是什么”之后,立刻追问“为什么不用 Camera1/Camera2”“帧率怎么保证”“内存抖动怎么防”“权限异常怎么处理”。
因此,回答必须“场景化 + 量化 + 踩坑点”三位一体,才能体现资深工程师的体感。
知识点
- UseCase 是 CameraX 对 Camera2 CaptureRequest 的面向生命周期、可组合、可绑定的抽象。
- 每个 UseCase 内部持有 SessionConfig、CaptureConfig、Executor、BufferQueue 以及 ResolutionSelector,通过 CameraPipe 在 androidx.camera.core.impl 层完成到 Camera2 的映射。
- 生命周期感知:绑定到 LifecycleOwner 后,UseCase 随组件 DESTROYED 自动解绑,避免服务泄漏——国内厂商 ROM 常把后台摄像头权限收得很紧,这一点是保活关键。
- 并发策略:CameraX 内部以 “独占设备 + 多会话复用” 实现三个 UseCase 同时运行,但 VideoCapture 与 ImageCapture 在高分辨率下会触发 HAL 的 stream-combination 限制,需要降分辨率或降帧率。
- 国内机型兼容:华为、OPPO 部分机型对 YUV_420_888 → JPEG 的硬件缩放单元支持不完整,会导致 ImageAnalysis 回调帧率骤降,需要强制走软件格式转换。
- 权限模型:Android 13 及以上,Google 要求后台访问摄像头必须声明 FOREGROUND_SERVICE 类型 camera,国内商店审核同样卡这一条,需在清单中显式配置。
答案
Preview
场景:实时取景,是 90% 应用都会用到的“取景框”。
量化指标:1080p 下目标 30 fps,延迟 < 60 ms;折叠屏展开后需动态切换 4:3/16:9/Full-Sensor 裁剪。
踩坑:
- 国内 ROM 对 SurfaceView 与 TextureView 的 HWC 合成策略差异大,低端机 TextureView 会触发 GPU 合成导致掉电,优先用 PreviewView + PERFORMANCE 模式。
- 暗黑模式下,部分小米机型自动降低屏幕刷新率到 60 Hz,若相机仍输出 90 fps 会丢帧,需监听 DisplayManager 动态 setTargetFps。
ImageCapture
场景:拍照并保存为 JPEG,用于“一键成像”“扫码结果存档”。
量化指标:单帧捕获到文件落盘 < 700 ms;夜景模式 6400 W 像素输出时内存峰值 < 180 MB。
踩坑:
- 国内应用市场要求 EXIF 里不能带 GPS,否则审核驳回,需在 ImageCapture.Builder 设置 setCaptureOption(Metadata.MUTE_LOCATION)。
- 华为 HAL 对 JPEG 质量 100 支持不完整,会回退软件编码,导致卡顿,建议质量 95。
ImageAnalysis
场景:实时帧回调做算法处理,如人脸识别、二维码扫描、AI 抠图。
量化指标:YUV_420_888 640×480 下稳定 30 fps;单帧处理算法耗时 < 33 ms 才能保证不丢帧。
踩坑:
- 部分 MTK 芯片对 YUV 的 stride 不是 16 对齐,直接送 TensorFlow Lite 会 crash,需要 ImageProxy 转 Bitmap 时手动 copyTo 并补齐 stride。
- 后台扫码场景,Android 13 限制麦克风与摄像头同时访问,需先释放麦克风再绑 ImageAnalysis,否则抛出 SecurityException。
VideoCapture
场景:录制 MP4,用于“短视频拍摄”“证据留存”。
量化指标:1080p 30 fps H.264 平均码率 8 Mbps;暂停续录场景片段数上限 300 段,合成时间 < 1.2× 实录时长。
踩坑:
- 国内 5G 套餐用户上传高清视频可免流,但要求 AVC Profile ≤ High、Level ≤ 4.2,需在 Recorder 显式设置 setVideoEncoderProfile。
- 折叠屏展开后,传感器物理方向与屏幕方向不一致,VideoCapture 默认使用传感器方向,导致录出来视频旋转 90°,需通过 setTargetRotation(Display.getRotation()) 实时纠正。
- 部分 OPPO 机型在 4K 60 fps 场景下,同时绑定 Preview 会触发 HAL 的 stream-combination 拒绝服务,只能降分辨率到 1440p 或帧率到 30 fps。
拓展思考
- 多 UseCase 组合策略:
直播场景需要 Preview + ImageAnalysis(人脸贴纸)+ VideoCapture(推流录制),此时 ImageAnalysis 分辨率降到 720p 以下,VideoCapture 采用 H.265 可节省 30% 码率,缓解 MTK 平台发热。 - 与系统资源博弈:
国内后台清理激进,Service 级别保活已失效,可将录制任务迁移到 WorkManager 加 expedited 工作链,利用前台服务通知栏保活,同时监听 ProcessLifecycleOwner 在应用切后台 30 s 内主动解绑 VideoCapture,防止被系统强行 kill 后视频文件损坏。 - 隐私合规:
工信部 164 号文要求“摄像头调用行为可感知、可溯源、可关闭”,CameraX 1.3 提供 CameraControl.setZslDisabled() 与 setCameraAudioRestriction(),可在用户关闭“麦克风/摄像头”总开关时,主动降级到 ImageCapture 并静音,避免被合规扫描工具判定为“暗调”。