如何保存 RAW(YUV402) 相机数据以在 Flutter 中进行后期处理

问题描述

我想将 RAW 相机数据保存在一个文件中,而不会丢失来自 CameraControllers imagestream 的帧。

任务:检测相机图像流中的人脸并裁剪一些面部标志。

目前我可以使用 Firebase 从 CameraController 检测 imagestream 中的人脸。当我尝试处理这些人脸时,当 imagestream 不断部署图像时,我丢失了很多帧。为了避免这种情况,我想保存原始 YUV402 数据并在录制完成后处理这些数据。如果我只是将录音保存为 MP4 文件,它会变慢,因为我必须将 Imagedata 转换回我的模型的 YUV 数据。我的第一次尝试是将所有 RAW 数据保存在一个列表中,但这会在短时间内炸毁 RAM。另一种方法是将 YUV 数据保存到文件中,并在完成记录后对这些数据进行后处理。我尝试的尝试只是减慢和阻止 Flutter 应用程序中的每个计算。

这是我当前的代码

首先我启动图像流

controller.startimagestream((image) => processVideoStream(image,cameraDescription));

然后我想将 YUV 数据写入文件并检测图像中的人脸

void processVideoStream(Cameraimage image,description){
  writerawDataToFile(image);
  if (_isDetecting)return;
    _isDetecting = true;
  ScannerUtils.detect(image,description.sensorOrientation)
    .whenComplete(() => _isDetecting = false);
}

Future<void> writerawDataToFile(Cameraimage image) async{   
  List<int> data = new List<int>();
  int index = 0;
  for (Plane p in image.planes){
    for(int i= 0; i < p.bytes.lengthInBytes; i++)
      data.add(p.bytes[i]);
  }
  return _yuvFile.writeAsBytes(data,mode: FileMode.append);

}

我相信我将需要某种缓冲区,我可以在其中写入数据并将其写入其他线程中的文件,但我无法这样做。也许有人已经遇到过这样的问题。

解决方法

经过一些实验,我能够将 YUV 数据发送到隔离区。这解决了我的问题。