HarmonyOS开发中 Camera kit 双路预览方案频繁开关相机底层崩溃?

Camera kit 双路预览方案实现视频数据回调,频繁(间隔1秒,开关20次以内)开关相机底层崩溃。

分析崩溃日志显示,崩溃在系统底层的 ImageReceiverNapi::DoCallBack 。后来注释了receiver.on('imageArrival') 回调后,频繁开关相机不会崩溃。

阅读 597
avatarAI BotBETA

在HarmonyOS开发中,使用Camera Kit进行双路预览并频繁开关相机时遇到的系统底层崩溃问题,很可能是由于在频繁切换相机状态时,回调处理不当或系统资源未能及时释放/重新分配所导致的。

解决方案

  1. 优化回调处理

    • 减少回调频率:如果可能,减少on('imageArrival')的回调频率,或者在不需要实时处理每一帧图像时暂时禁用此回调。
    • 异步处理:将图像处理或重要操作放在异步任务中执行,避免阻塞主线程或UI线程。
  2. 资源管理

    • 确保正确释放资源:在关闭相机或切换相机状态时,确保所有相关资源(如Camera预览对象、缓冲区等)都被正确释放。
    • 使用生命周期管理:利用页面的生命周期(如onPageShowonPageHide)来管理相机的开启和关闭,确保在页面不可见时相机被正确关闭。
  3. 错误处理

    • 增加错误处理逻辑:在相机操作中增加错误处理逻辑,捕获并处理可能的异常,如相机启动失败、权限问题等。
  4. 代码审查

    • 检查Camera Kit使用方式:确保你遵循了Camera Kit的官方文档和最佳实践来配置和使用相机。
    • 审查崩溃日志:详细分析崩溃日志,查找可能导致崩溃的具体代码行或系统调用。
  5. 系统兼容性

    • 测试不同设备:在不同型号和版本的HarmonyOS设备上测试你的应用,以确保兼容性。
    • 更新系统API:如果可能,使用最新的系统API和库,因为旧版本可能包含已知的错误或限制。
  6. 联系技术支持

    • 如果问题依然存在,考虑向华为开发者论坛或技术支持团队寻求帮助。

示例代码审查点

  • 确保在相机开启和关闭时调用相应的API,如cameraDevice.release()
  • 检查on('imageArrival')回调中是否有耗时的操作或内存泄漏。
  • 审查是否在合适的时机(如页面显示/隐藏)开启/关闭相机。

结论

根据你提供的信息,注释掉receiver.on('imageArrival')回调后不再崩溃,这表明问题可能与该回调的处理方式或频率有关。因此,优化回调处理或确保在不需要时禁用回调是解决问题的关键步骤之一。同时,确保整个相机操作过程中的资源管理和错误处理也是避免崩溃的重要方面。

1 个回答

关相机过程中释放receiver需要同步调用release,否则频繁切换,再次打开相机,因为异步调用的原因,start相机中初始化receiver后才执行stop中receiver的release方法,导致receiver调用时机不对。

/** 
 * 停止相机采集 
 * @param callback 底层接口回调 
 */ 
async stopCamera(callback?: Function) { 
  isStop = true; 
  if (this.mVideoSession) { 
    this.mVideoSession.off('error'); 
    //停止当前会话 
    await this.mVideoSession.stop(); 
  } 
  if (this.mCameraManager) { 
    this.mCameraManager.off('cameraStatus'); 
  } 
  if (mReceiver) { 
    await mReceiver.release(); 
    mReceiver = undefined; 
  } 
  if (this.mPreviewOutputData) { 
    await this.mPreviewOutputData.release(); 
  } 
  if (this.mCameraInput) { 
    this.mCameraInput.off('error', this.mSelCameraDevice); 
    await this.mCameraInput.close(); 
  } 
  if (this.mVideoSession) { 
    //释放会话 
    await this.mVideoSession.release(); 
  } 
  if (callback) { 
    callback(200, ""); 
  } 
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题