GPUImage не проходит проверку CVPixelBufferGetPlaneCount на iOS

В настоящее время я перевожу устаревший проект с iOS 5/6 на iOS 6/7.

Часть этого проекта включает в себя создание изображения с использованием библиотеки GPUImage, его обработку с помощью обрезающего фильтра, а затем, при необходимости, добавление некоторых эффектов насыщенности и размытия. В настоящее время я использую версию 0.1.2, установленную через какао-бобы.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь захватить изображение с камеры, я нажимаю следующее утверждение в GPUImageStillCamera.m line 254

if (CVPixelBufferGetPlaneCount(cameraFrame) > 0)
{
  NSAssert(NO, @"Error: no downsampling for YUV input in the framework yet");
}

где cameraFrame это CVImageBufferRef

Я воспроизвел код, в котором это вызывается, и перенес его в другой проект, где он отлично работает.

Как только я переместил этот воспроизведенный класс обратно в основной проект, я каждый раз нажимал на утверждение.

Вещи, которые я исключил с помощью собственной отладки

  • 64bit (это происходит на обоих)
  • другая версия библиотеки
  • первоначальная настройка объекта/код/использование

Это привело меня к мысли, что, возможно, это может быть настройка проекта, которую я просмотрел. Любая помощь или даже указатель в правильном направлении будут очень приветствоваться. Я потратил на это добрых 1-2 дня и все еще полностью потерян!

Я включил урезанный класс ниже, который показывает общее использование.

#import "ViewController.h"
#import "GPUImage.h"
#import "ImageViewController.h"

@interface ViewController ()
@property (nonatomic, strong) IBOutlet GPUImageView *gpuImageView;
@property (nonatomic, strong) GPUImageStillCamera *camera;
@property (nonatomic, strong) GPUImageCropFilter *cropFilter;
@end

@implementation ViewController

- (void)viewDidAppear:(BOOL)animated
{
  [super viewDidAppear:animated];
  [self setupCameraCapture];
}

- (void)setupCameraCapture
{
  if (self.camera) {
    return;
  }

  self.cropFilter = [[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0, 0, 1, 0.5625)];

  if ([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear]) {
    self.camera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPresetPhoto cameraPosition:AVCaptureDevicePositionBack];
  }
  else {
    self.camera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPresetPhoto cameraPosition:AVCaptureDevicePositionFront];
  }

  self.camera.outputImageOrientation = UIInterfaceOrientationPortrait;

  NSError *error = nil;
  [self.camera.inputCamera lockForConfiguration:&error];
  [self.camera.inputCamera setExposureMode:AVCaptureExposureModeContinuousAutoExposure];
  [self.camera.inputCamera setWhiteBalanceMode:AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance];
  if ([self.camera.inputCamera respondsToSelector:@selector(isLowLightBoostSupported)]) {
    BOOL isSupported = self.camera.inputCamera.isLowLightBoostSupported;
    if (isSupported) {
      [self.camera.inputCamera setAutomaticallyEnablesLowLightBoostWhenAvailable:YES];
    }
  }
  [self.camera.inputCamera unlockForConfiguration];

  [self.camera addTarget:self.cropFilter];
  [self.cropFilter addTarget:self.gpuImageView];
  [self.camera startCameraCapture];
}

- (IBAction)capturePressed:(id)sender
{
  [self.camera capturePhotoAsImageProcessedUpToFilter:self.cropFilter withCompletionHandler:^(UIImage *image, NSError *error) {
    // do something with the image here
  }];
}

@end

person Jon Hocking    schedule 24.02.2014    source источник


Ответы (1)


Настоящим виновником был скрученный метод, найденный моим коллегой Мареком. Спрятан в глубинах старой кодовой базы. Приведенный выше код работает нормально.

Урок: если вам действительно нужно что-то переделать, не забудьте оставить соответствующую документацию для будущих разработчиков.

person Jon Hocking    schedule 24.02.2014