CIImage, созданный из CVPixelBufferRef, рисует повернутые и сжатые в GLKView - PullRequest
3 голосов
/ 16 декабря 2011

Я пытаюсь захватить видео с помощью AVCaptureSession, обработать видео в обратном вызове (в конце концов), а затем отобразить результаты в моем GLKView. Приведенный ниже код работает, но изображение в моем GLKView поворачивается на 90 градусов и сжимается на 50%.

glContext создается с помощью [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2];

Мой coreImageContext создается с помощью [CIContext contextWithEAGLContext: glContext];

- (void)captureOutput:(AVCaptureOutput *)captureOutput 
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
       fromConnection:(AVCaptureConnection *)connection
{
    // process the image
    CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer);
    CIImage *image = [CIImage imageWithCVPixelBuffer:pixelBuffer];

    // display it (using main thread)
    dispatch_async( dispatch_get_main_queue(), ^{
        // running synchronously on the main thread now
        [self.coreImageContext drawImage:image inRect:self.view.bounds fromRect:[image extent]];
        [self.glContext presentRenderbuffer:GL_RENDERBUFFER];
    });
}

Вставка кода для выполнения и аффинного преобразования кажется неэффективной. Я пропускаю установочный вызов или параметр для предотвращения вращения и масштабирования?

Ответы [ 2 ]

3 голосов
/ 16 декабря 2011

Просмотр видео для AVFoundation выполняет ротацию изображений с использованием графического оборудования.Исходная ориентация захвата для камеры, обращенной назад, - влево.Это пейзаж прямо для фронтальной камеры.При записи видео AVFoundation поместит преобразование в заголовок MOV / MP4, чтобы указать игроку правильную ориентацию видео.Если вы просто вытяните изображения из MOV / MP4, они будут в исходной ориентации захвата.Посмотрите на два примера программ, связанных в верхнем сообщении для этого SO Post

0 голосов
/ 21 октября 2016

drawImage: inRect: fromRect: масштабирует изображение, чтобы соответствовать целевому прямоугольнику. Вам просто нужно соответствующим образом масштабировать self.view.bounds:

CGFloat screenScale = [[UIScreen mainScreen] scale];
[self.coreImageContext drawImage:image inRect:CGRectApplyAffineTransform(self.view.bounds, CGAffineTransformMakeScale(screenScale, screenScale)) fromRect:[image extent]];
...