React native:实时相机数据,无图像保存和预览

时间:2016-11-07 15:24:22

标签: ios swift camera react-native

我开始研究我的第一个非演示反应原生应用。我希望它会成为iOS / Android应用程序,但实际上我只专注于iOS。

我实际上有一个问题。如何在不保存到相机胶卷的情况下从相机实时获取数据(base64,像素数组......)。

有这个模块:https://github.com/lwansbrough/react-native-camera但不推荐使用base64,对我来说没用,因为我想要一个渲染处理过的图像给用户(更改图片颜色,例如。),而不是来自相机的真实图片,就像它一样react-native-camera模块。

(我知道如何与SWIFT代码进行通信,但我不知道本机代码中的选项是什么,我来自WebDev)

非常感谢。

1 个答案:

答案 0 :(得分:0)

这可能不是最佳的,但却是我一直在使用的。如果有人能提供更好的解决方案,我也非常感谢你的帮助!

我的基本想法是循环(但不是简单的for循环,见下文)以最大分辨率拍摄yuv / rgb格式的静态图片,这是相当快的(~x0ms,具有正常的曝光持续时间)并处理它们。基本上你会设置AVCaptureStillImageOutput链接到你的相机(跟随教程无处不在)然后将格式设置为kCVPixelFormatType_420YpCbCr8BiPlanarFullRange(如果你想要YUV)或kCVPixelFormatType_32BGRA(如果你喜欢rgba)像

bool usingYUVFormat = true;
NSDictionary *outputFormat = [NSDictionary dictionaryWithObject:
                [NSNumber numberWithInt:usingYUVFormat?kCVPixelFormatType_420YpCbCr8BiPlanarFullRange:kCVPixelFormatType_32BGRA]
                                           forKey:(id)kCVPixelBufferPixelFormatTypeKey];
[yourAVCaptureStillImageOutput setOutputSettings:outputFormat];

准备好后,您可以开始致电

AVCaptureConnection *captureConnection=[yourAVCaptureStillImageOutput connectionWithMediaType:AVMediaTypeVideo];
[yourAVCaptureStillImageOutput captureStillImageAsynchronouslyFromConnection:captureConnection  completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {
    if(imageDataSampleBuffer){
        CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(imageDataSampleBuffer);
        CVPixelBufferLockBaseAddress(imageBuffer, 0);
        // do your magic with the data buffer imageBuffer
        // use CVPixelBufferGetBaseAddressOfPlane(imageBuffer,0/1/2); to get each plane
        // use CVPixelBufferGetWidth/CVPixelBufferGetHeight to get dimensions
        // if you want more, please google
    }
}];

此外,使用NSNotificationCenter注册您的拍照操作并在处理完每个帧后发布通知(可能会有一些延迟,以限制吞吐量并降低功耗),因此循环将继续。

快速预防措施:Android对手更令人头疼。很少有硬件制造商为最大分辨率的未压缩照片实现api,但只有1080p用于预览/视频,正如我在my question中提出的那样。我仍在寻找解决方案,但放弃了最大的希望。 JPEG图像太慢了。