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

Flutter应用同页面按指定时间间隔控制摄像头启停实现问题求助

Flutter摄像头按间隔启停实现方案

核心问题原因

CameraController 调用 dispose() 后实例会被永久释放,无法再调用 initialize() 复用,每次重启摄像头都需要重新创建全新的 CameraController 实例。

实现步骤

  • 把摄像头初始化、销毁逻辑分别封装成独立可复用的方法,避免重复代码
  • 单独用定时器控制启停逻辑,不要把启停逻辑写在图像流回调中,避免帧处理阻塞导致时序异常
  • 销毁摄像头时按固定顺序执行:先停止图像流 → 再销毁控制器实例 → 把控制器变量置空
  • 重启摄像头时直接调用初始化方法创建新的控制器实例即可

完整示例代码

import 'dart:async';
import 'package:camera/camera.dart';

// 全局变量定义
CameraController? _camera;
Timer? _cameraControlTimer;
final Stopwatch _baseStopwatch = Stopwatch();
CameraLensDirection _direction = CameraLensDirection.back;

// 摄像头初始化方法
Future<void> _initCamera() async {
  // 先清理旧的控制器资源
  await _disposeCamera();
  // 创建新的控制器实例
  CameraDescription description = await getCamera(_direction);
  ImageRotation rotation = rotationIntToImageRotation(
    description.sensorOrientation,
  );
  _camera = CameraController(description, ResolutionPreset.low, enableAudio: false);
  await _camera?.initialize();
  // 启动图像流并处理帧
  _camera?.startImageStream((CameraImage image) {
    // 你的帧处理逻辑写在此处
  });
  _baseStopwatch.reset();
  _baseStopwatch.start();
}

// 摄像头销毁方法
Future<void> _disposeCamera() async {
  if (_camera != null) {
    await _camera?.stopImageStream();
    await _camera?.dispose();
    _camera = null;
  }
}

// 页面初始化时启动定时器
@override
void initState() {
  super.initState();
  // 首次初始化摄像头
  _initCamera();
  // 按间隔控制启停,示例为运行10秒关闭,休眠5秒后重启,可自行调整时长
  _cameraControlTimer = Timer.periodic(const Duration(seconds: 15), (timer) async {
    await _disposeCamera();
    Future.delayed(const Duration(seconds: 5), () {
      _initCamera();
    });
  });
}

// 页面销毁时清理所有资源
@override
void dispose() {
  _cameraControlTimer?.cancel();
  _disposeCamera();
  _baseStopwatch.stop();
  super.dispose();
}

注意事项

  • 所有摄像头相关操作都要加await等待执行完成,避免前一步资源未释放就执行后续操作出现占用报错
  • 后台长时间运行需要配置对应平台的后台运行权限,否则系统会自动回收摄像头资源
  • 可根据实际业务需求调整分辨率、启停间隔参数,分辨率越低发热控制效果越好

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:45:02