QTCaptureOutput.delegate captureOutput: didOutputVideoFrame: ... никогда не вызывается - PullRequest
0 голосов
/ 01 февраля 2012

Источник

Итак, у меня есть 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
  • QuartzCore

Соответствующий сборник

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

1 Ответ

1 голос
/ 02 февраля 2012

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

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

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

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

...