You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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文件:
      1. 在控制器dispose生命周期方法中,手动将_videoRecordingEventSink置为nil,同时清空camerawesome.dispatchqueue中所有待执行任务,停止音频采样、方向监听的回调接收
      2. 所有调用_videoRecordingEventSink的位置增加非空判断,对应崩溃点的代码修改为:
      if (_videoWriter.status == AVAssetWriterStatusFailed) {
          if (_videoRecordingEventSink) {
              _videoRecordingEventSink([NSString stringWithFormat:@"writing video failed : %@", _videoWriter.error]);
          }
      }
      
  • 业务层规避
    1. 初始化相机配置时,显式指定imageFormatGroup: ImageFormatGroup.bgra8888,消除格式不兼容警告,减少额外适配逻辑
    2. 触发录制前先完成相机、麦克风权限校验,权限未授权时不执行录制逻辑,避免AVAssetWriter初始化失败进入错误分支
    3. 退出相机页面前,先主动调用停止录制方法,等待录制状态完全退出后再销毁相机控制器,不要在录制过程中直接关闭页面
    4. 针对 iOS14 及以下的老系统设备,录制配置不要超过1080P/30fps,同时确保Info.plist中相机、麦克风的权限描述字段完整,避免采集流程初始化异常

内容的提问来源于stack exchange,提问作者InnerSeeking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:21:14