2016-11-14 10 views
1

Я пытаюсь захватить видеокадры с моей камеры MacBook и обрабатывать их на лету (для последующего обнаружения лица). Чтобы уменьшить использование памяти, я хочу уменьшить разрешение захвата с заданного значения 1200x720 до 640x480.AVFoundation: как изменить размер кадров в sampleBuffer (AVCaptureSessionPreset) не влияет на это

Вот мой код, чтобы настроить Capture Session:

_session = [[AVCaptureSession alloc] init]; 

    if ([_session canSetSessionPreset:AVCaptureSessionPreset640x480]){ 
     [_session setSessionPreset:AVCaptureSessionPreset640x480]; 
     NSLog(@"resolution preset changed"); 
    } 

    // configure input 
    _camera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
    _deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:_camera error:nil]; 


    // configure output 
    _videoOutput = [[AVCaptureVideoDataOutput alloc] init]; 
    NSDictionary* newSettings = @{ (NSString*) kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA)}; 
    _videoOutput.videoSettings = newSettings; 
    //discard if the data output queue is blocked 
    [_videoOutput setAlwaysDiscardsLateVideoFrames:YES]; 

    // process frames on another queue 
    dispatch_queue_t videoDataOutputQueue; 
    videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue", DISPATCH_QUEUE_SERIAL); 
    [_videoOutput setSampleBufferDelegate:videoBufferDelegate queue:videoDataOutputQueue]; 

    [_session addInput:_deviceInput]; 
    [_session addOutput:_videoOutput]; 

    [_session startRunning]; 

После этого сеанса устанавливает соответствующим образом, он записывает «разрешение предварительно изменилось» правильно и передает видеоданные делегата на другой очереди на обрабатывать его. Когда я проверяю session.sessionPreset, он говорит, что пресет AVCaptureSessionPreset640x480.

Сейчас в делегатом:

- (void)captureOutput:(AVCaptureOutput *)captureOutput 
     didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
     fromConnection:(AVCaptureConnection *)connection 
{ 

    //get the image from buffer, transform it to CIImage 
    CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
    self.image = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer]; 

self.image.extent.size При осмотре, он показывает и неправильный размер 1200x720, как если бы я не изменил предустановку раньше. Даже при проверке аргумента метода sampleBuffer он показывает размерность 1200x720.

Я просмотрел интернет и ссылку на яблоко в течение нескольких часов, но не смог найти решение. Надеюсь, вы можете спасти меня!

ответ

0

Кажется, я нашел решение самостоятельно (или, по крайней мере, обходным путем). Комментирование следующие строки привели к предполагаемому изменению резолюции буфера:

NSDictionary* settings = @{ (NSString*) kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA)}; 
    _videoOutput.videoSettings = settings; 

Мое предположение, что установка этих настроек сжатия результатов в перезаписана AVCaptureSessionPreset. Однако я не понимаю, почему это должно быть так (параметры сжатия не должны влиять на настройки разрешения, верно?).

 Смежные вопросы

  • Нет связанных вопросов^_^