Flutter iOS端实现200毫秒间隔Burst Mode连拍的方案咨询
单张拍摄耗时1秒的核心原因
通用Camera Plugin封装的takePicture()接口默认走完整拍摄链路:触发3A(自动对焦/自动曝光/自动白平衡)重算、全分辨率图像采样、平台端内置后处理(HDR/美颜/畸变校正)、编码JPEG、写入临时存储、跨线程/跨平台通道返回数据,整套流程空载耗时就在800ms-1200ms区间,本身就不支持高频连拍,不是参数配置错误导致的。
高频连拍实现方案(按落地优先级排序)
- 预览帧截帧方案(性能最高,可稳定实现200ms以内间隔)
完全弃用takePicture()接口,直接复用相机预览链路输出帧:- 启动相机时将预览分辨率设置为你需要的连拍输出分辨率(例如需要1080p成片就把预览尺寸设为1920*1080,不要用默认的低分辨率预览)
- 连拍开始前提前调用接口锁定AE/AF/AWB,避免连拍过程中触发3A重算导致帧间隔波动
- 注册预览帧回调,每收到一帧
Image数据就丢到子线程做格式转换(转JPEG/位图),暂存到内存队列,不要阻塞相机帧输出线程 - 连拍结束后再统一把内存队列里的图片写入本地存储
该方案可稳定跑到30fps(约33ms每帧),完全覆盖200ms间隔的需求。
- 原生连拍API调用方案(画质最优)
如果跨平台插件没有暴露预览帧操作能力,直接通过平台通道调用系统原生相机的连拍能力,避免插件封装带来的额外开销:- Android端:创建
CameraCaptureSession时绑定ImageReader作为输出目标,用setRepeatingRequest发送连续捕获请求,原生层可实现15-30fps的全尺寸图像输出 - iOS端:用
AVCaptureVideoDataOutput做帧输出,关闭高分辨率捕获开关和不必要的后处理,帧输出间隔可稳定压到100ms以内
- Android端:创建
- 原有接口优化方案(改造成本最低,性能上限有限)
如果必须复用现有takePicture()逻辑,可通过以下优化把单张拍摄耗时压到400-500ms,但无法稳定达到200ms间隔要求:- 拍摄前提前锁定3A参数,禁止每次拍摄触发3A重算
- 将拍摄分辨率降到实际业务需要的尺寸,不要使用传感器默认最高输出像素
- 关闭HDR、自动畸变校正、滤镜等所有内置后处理逻辑
- 拍摄回调中不要同步执行文件写入、图像缩放等重操作,先把字节数据暂存内存,拍摄结束后再异步处理
注意事项
所有图像格式转换、缩放、文件写入操作必须放到独立后台线程执行,绝对不能阻塞相机回调线程或者UI线程,否则会出现严重掉帧、卡顿甚至应用崩溃。
连拍过程中如果需要展示实时缩略图,不要直接对全尺寸帧做缩放,单独绑定一个低分辨率的输出Surface给缩略图模块,减少不必要的性能消耗。
内容的提问来源于stack exchange,提问作者JayVDiyk
相关产品推荐
相关产品推荐

