QTCaptureOutput.delegate captureOutput: didOutputVideoFrame: никогда не вызывался

Источник

Итак, у меня есть QTCaptureSession, настроенный таким образом:

    //Setup Camera
    cameraSession = [[QTCaptureSession alloc] init];
    QTCaptureDevice *camera = [QTCaptureDevice deviceWithUniqueID: cameraID];
    
    BOOL success = [camera open: &error];
    if (!success || error)
    {
        NSLog(@"Could not open device %@.", cameraID);
        NSLog(@"Error: %@", [error localizedDescription]);
        return nil;
    }
    
    //Setup Input Session
    QTCaptureDeviceInput *cameraInput = [[QTCaptureDeviceInput alloc] initWithDevice: camera];
    
    success = [cameraSession addInput: cameraInput error: &error];
    if (!success || error)
    {
        NSLog(@"Could not initialize input session.");
        NSLog(@"Error: %@", [error localizedDescription]);
        return nil;
    }
    
    //Setup Output
    QTCaptureDecompressedVideoOutput *cameraOutput = [[QTCaptureDecompressedVideoOutput alloc] init];
    [cameraOutput setDelegate: self];
    
    success = [cameraSession addOutput: cameraOutput error: &error];
    if (!success || error)
    {
        NSLog(@"Could not initialize output session.");
        NSLog(@"Error: %@", [error localizedDescription]);
        return nil;
    }

И QTCaptureDecompressedVideoOutput делегата captureOutput:didOutputVideoFrame:WithSampleBuffer:fromConnection: таким образом:

- (void)captureOutput:(QTCaptureOutput *)captureOutput didOutputVideoFrame:(CVImageBufferRef)videoFrame withSampleBuffer:(QTSampleBuffer *)sampleBuffer fromConnection:(QTCaptureConnection *)connection
{
    NSLog(@"starting convert\n");
}

Затем я запускаю обработку захвата, используя:

    [cameraSession startRunning];

Все переменные инициализируются нормально, и сеанс запускается нормально, но captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection: никогда не вызывается.

Контекст

Это приложение командной строки, скомпилированное с помощью GCC. Он связан со следующими фреймворками:

  • Фундамент
  • Какао
  • QTKit
  • кварцкор

Соответствующее Разное

Кадр вряд ли пропадет, потому что captureOutput:didDropVideoFrameWithSampleBuffer:fromConnection: также не вызывается.


person Patrick Perini    schedule 01.02.2012    source источник


Ответы (1)


Итак, с некоторой помощью Майка Эша мне удалось выяснить, что моя программа завершается немедленно и не ожидает обратного вызова делегата (который, согласно документам Apple QTKit, может выполняться в отдельном потоке).

Мое решение состояло в том, чтобы добавить свойства BOOL к моему объекту с именем captureIsFinished, а затем добавить это к функции main():

    //Wait Until Capture is Finished
    while (![snap captureIsFinished])
    {
        [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 1]];
    }

Что эффективно увековечивает цикл выполнения приложения в течение 1 секунды, проверяет, завершен ли захват, а затем запускается еще на секунду.

person Patrick Perini    schedule 01.02.2012