React native: данные камеры в реальном времени без сохранения и предварительного просмотра изображения

Я начал работать над своим первым приложением, не относящимся к демо-версии. Я надеюсь, что это будет приложение для iOS/Android, но на самом деле я сосредоточен только на iOS.

У меня есть одна проблема на самом деле. Как я могу получить данные (base64, массив пикселей, ...) в режиме реального времени с камеры без сохранения в рулон камеры.

Есть этот модуль: https://github.com/lwansbrough/react-native-camera но base64 устарела и для меня бесполезна, потому что я хочу, чтобы обработанное изображение отрисовывалось для пользователя (например, изменение цвета изображения), а не для реального картинка с камеры, как это реагирует на модуль родной камеры.

(Я знаю, как общаться с кодом SWIFT, но я не знаю, какие варианты есть в нативном коде, я пришел сюда из WebDev)

Большое спасибо.

1 ответ

Это не может быть оптимальным, но это то, что я использовал. Если кто-то может дать лучшее решение, я был бы также признателен за вашу помощь!

Моя основная идея состоит в том, чтобы просто зациклить (но не простой цикл for, см. Ниже), делая фотоснимки в формате yuv/rgb с максимальным разрешением, которое является достаточно быстрым (~x0 мс с нормальной продолжительностью экспозиции), и обрабатывать их. В основном вы будете настраивать AVCaptureStillImageOutput, который связывается с вашей камерой (следуя всем учебным пособиям), затем устанавливаете формат kCVPixelFormatType_420YpCbCr8BiPlanarFullRange (если вы хотите YUV) или kCVPixelFormatType_32BGRA(если вы предпочитаете rba)

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 для предварительного просмотра / видео, как я уже говорил в своем вопросе. Я все еще ищу решения, но оставил большую надежду. Изображения JPEG просто слишком медленные.

Другие вопросы по тегам