플러터 Camera 플러그인에서 ImageStream 재시작시, 이전 프레임이 남아있고 그 프레임부터 시작되는 이슈

 

Camera Plugin

https://pub.dev/packages/camera

 

camera | Flutter package

A Flutter plugin for controlling the camera. Supports previewing the camera feed, capturing images and video, and streaming image buffers to Dart.

pub.dev

환경

flutter: 3.32.7

camera: ^0.10.0+1

android: 10 ~ 15

 

문제

controller.startImageStream -> stopImageStream -> startImageStream 할 때,

start 시점에 최신 프레임이 아니라 stop 이전의 프레임이 하나 남아있다.

 

해결

https://github.com/flutter/flutter/issues/115925?utm_source=chatgpt.com

 

[camera] StartImageStream after stopImageStream returns old imageData. · Issue #115925 · flutter/flutter

Description ImageStream returns old imageData when imageStream is started after stopImageStream call. This is causing barcode scanner to find the same barcode twice even though user is not pointing...

github.com

이전 프레임이 하나 남아있는 것도 그렇고,

해당 이슈 논의를 보면, 프레임 버퍼와 브로커 사이 타이밍에 빈틈이 있는 듯 하다.

 

그래서 근본적인 해결은 아니고,

Lexical Closure 특성으로 Wrapper 함수 내에서 skipped 변수를 유지하며,

startImageStream 이후 몇 프레임을 건너뛰는 방식으로 해결한다.

  Future<void> startSkipImageStream({
    required CameraController controller,
    required void Function(CameraImage image) listener,
    int skipFrameCount = 1,
  }) async {
    int skipped = 0;

    await controller.startImageStream((image) {
      if (skipped < skipFrameCount) {
        skipped++;
        return;
      }

      listener(image);
    });
  }