问题描述
我想将 RAW 相机数据保存在一个文件中,而不会丢失来自 CameraControllers imagestream 的帧。
任务:检测相机图像流中的人脸并裁剪一些面部标志。
目前我可以使用 Firebase 从 CameraController 检测 imagestream 中的人脸。当我尝试处理这些人脸时,当 imagestream 不断部署图像时,我丢失了很多帧。为了避免这种情况,我想保存原始 YUV402 数据并在录制完成后处理这些数据。如果我只是将录音保存为 MP4 文件,它会变慢,因为我必须将 Imagedata 转换回我的模型的 YUV 数据。我的第一次尝试是将所有 RAW 数据保存在一个列表中,但这会在短时间内炸毁 RAM。另一种方法是将 YUV 数据保存到文件中,并在完成记录后对这些数据进行后处理。我尝试的尝试只是减慢和阻止 Flutter 应用程序中的每个计算。
这是我当前的代码:
首先我启动图像流
controller.startimagestream((image) => processVideoStream(image,cameraDescription));
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 数据发送到隔离区。这解决了我的问题。