2011-12-16 2 views
3

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

glContext создан с [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2];

My 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]; 
    }); 
} 

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

+0

Такая же проблема здесь. Я использовал почти тот же код, что и в вашем случае. Я закончил тем, что отказался и использовал аффинное преобразование, чтобы исправить поворот и изменить размер изображения, чтобы заполнить весь экран. –

ответ

2

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

0

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]];