Flutter Camerawesome插件iOS端录制视频失败 报图像格式不支持错误
Flutter CamerAwesome 插件 iOS 14.3 设备录制视频崩溃排查方案
问题场景
- 实现方案:基于 Flutter CamerAwesome 插件完成基础相机功能开发
- 测试环境:搭载 iOS 14.3 系统的 iPhone 7 设备
- 触发条件:调用
videoController.recordVideo方法录制普通视频时直接崩溃,设备断开连接
报错信息
The selected imageFormatGroup is not supported by iOS. Defaulting to brga8888 thread Orientation notifier being called after the activity is disposed #32, queue = 'camerawesome.dispatchqueue', stop reason = EXC_BAD_ACCESS (code=1, address=0x10) frame #0: 0x000000010045a834 camerawesome`-[VideoController newAudioSample:](self=0x00000002801d6890, _cmd="newAudioSample:", sampleBuffer=0x000000014be540e0) at VideoController.m:129:13 126 - (void)newAudioSample:(CMSampleBufferRef)sampleBuffer { 127 if (_videoWriter.status != AVAssetWriterStatusWriting) { 128 if (_videoWriter.status == AVAssetWriterStatusFailed) { -> 129 _videoRecordingEventSink([NSString stringWithFormat:@"writing video failed : %@", _videoWriter.error]); ^ 130 } 131 return; 132 } Target 0: (Runner) stopped. Lost connection to device.
根因分析
- 第一条格式不兼容的日志是普通警告,不是崩溃诱因:iOS 端不支持当前配置的图像格式组时会自动回退到
bgra8888,该流程不会触发内存访问错误 - 崩溃类型为
EXC_BAD_ACCESS野指针访问,结合日志里Orientation notifier being called after the activity is disposed的提示,核心原因是插件生命周期管理存在缺陷:相机/录制控制器被销毁后,插件内部的串行队列、音频采集回调、方向监听回调没有被同步取消,仍在尝试执行任务 - 崩溃点对应逻辑:音频采样回调触发时,
AVAssetWriter已经处于失败状态,代码尝试调用_videoRecordingEventSink向Flutter层发送错误事件,但此时_videoRecordingEventSink已经随控制器销毁被释放,直接调用已释放的内存块触发崩溃
解决方案
- 插件层修复
- 优先升级 CamerAwesome 到修复了该生命周期问题的稳定版本,旧版本未在控制器销毁时清空回调引用、取消队列待执行任务,是该问题的核心诱因
- 无法升级插件时,手动修改本地iOS端插件的
VideoController.m文件:- 在控制器
dispose生命周期方法中,手动将_videoRecordingEventSink置为nil,同时清空camerawesome.dispatchqueue中所有待执行任务,停止音频采样、方向监听的回调接收 - 所有调用
_videoRecordingEventSink的位置增加非空判断,对应崩溃点的代码修改为:
if (_videoWriter.status == AVAssetWriterStatusFailed) { if (_videoRecordingEventSink) { _videoRecordingEventSink([NSString stringWithFormat:@"writing video failed : %@", _videoWriter.error]); } } - 在控制器
- 业务层规避
- 初始化相机配置时,显式指定
imageFormatGroup: ImageFormatGroup.bgra8888,消除格式不兼容警告,减少额外适配逻辑 - 触发录制前先完成相机、麦克风权限校验,权限未授权时不执行录制逻辑,避免
AVAssetWriter初始化失败进入错误分支 - 退出相机页面前,先主动调用停止录制方法,等待录制状态完全退出后再销毁相机控制器,不要在录制过程中直接关闭页面
- 针对 iOS14 及以下的老系统设备,录制配置不要超过1080P/30fps,同时确保
Info.plist中相机、麦克风的权限描述字段完整,避免采集流程初始化异常
- 初始化相机配置时,显式指定
内容的提问来源于stack exchange,提问作者InnerSeeking
相关产品推荐
相关产品推荐

