как преобразовать CVImageBufferRef в UIImage

Я пытаюсь записать видео от камеры. я добрался captureOutput:didOutputSampleBuffer: обратный вызов для инициирования и это дает мне демонстрационный буфер, который я затем преобразовываю в a CVImageBufferRef. я затем пытаюсь преобразовать то изображение в a UIImage то, что я могу затем просмотреть в своем приложении.

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
    /*Lock the image buffer*/
    CVPixelBufferLockBaseAddress(imageBuffer,0); 
    /*Get information about the image*/
    uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer); 
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
    size_t width = CVPixelBufferGetWidth(imageBuffer); 
    size_t height = CVPixelBufferGetHeight(imageBuffer); 

    /*We unlock the  image buffer*/
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);

    /*Create a CGImageRef from the CVImageBufferRef*/
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 
    CGImageRef newImage = CGBitmapContextCreateImage(newContext); 

    /*We release some components*/
    CGContextRelease(newContext); 
     CGColorSpaceRelease(colorSpace);

     /*We display the result on the custom layer*/
    /*self.customLayer.contents = (id) newImage;*/

    /*We display the result on the image view (We need to change the orientation of the image so that the video is displayed correctly)*/
    UIImage *image= [UIImage imageWithCGImage:newImage scale:1.0 orientation:UIImageOrientationRight];
    self.capturedView.image = image;

    /*We relase the CGImageRef*/
    CGImageRelease(newImage);
}

код, кажется, хорошо работает вплоть до вызова к CGBitmapContextCreate. это всегда возвращает a NULL указатель. таким образом, следовательно, ни одна из остальной части функциональных работ. независимо от того, что я, кажется, передаю его функциональный пустой указатель возвратов. я понятия не имею почему.

23
задан daurnimator 22 September 2015 в 05:25
поделиться

1 ответ

То, как вы передаете baseAddress, предполагает, что данные изображения имеют форму

ACCC

( где C - некоторый компонент цвета, R || G || B).

Если вы настроили свой AVCaptureSession на захват видеокадров в родном формате, более чем вероятно, что вы получите видеоданные обратно в плоском формате YUV420. (см.: текст ссылки ) Для того чтобы сделать то, что вы пытаетесь сделать здесь, вероятно, проще всего указать, что вы хотите получить видеокадры в формате kCVPixelFormatType_32RGBA. Apple рекомендует захватывать видеокадры в kCVPixelFormatType_32BGRA, если вы вообще захватываете их в непланарном формате, причина этого не указана, но я могу предположить, что это связано с соображениями производительности.

Оговорка: я не делал этого и предполагаю, что доступ к содержимому CVPixelBufferRef таким образом является разумным способом построения изображения. Я не могу поручиться, что это действительно работает, но я /могу/ сказать вам, что способ, которым вы делаете это сейчас, надежно не будет работать из-за пиксельного формата, в котором вы (вероятно) захватываете видеокадры.

20
ответ дан 29 November 2019 в 02:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: