Метод addInput QTCaptureSession не возвращает

У меня такой код:

BOOL success;

QTCaptureSession *session = [[QTCaptureSession alloc] init];
QTCaptureDevice  *device  = [QTCaptureDevice defaultInputDeviceWithMediaType: QTMediaTypeVideo];
success = [device open: &e];
if ( !success )
{
    NSLog(@"error opening input device: %@", e);
    return;
}

QTCaptureDeviceInput *input = [QTCaptureDeviceInput deviceInputWithDevice: device];
success = [session addInput: input error: &e];
if ( !success )
{
    NSLog(@"error adding input device to session: %@", e);
    return;
}

QTCaptureDecompressedVideoOutput *output = [[QTCaptureDecompressedVideoOutput alloc] init];
[output setDelegate: self];
success = [session addOutput: output error: &e];
if ( !success )
{
    NSLog(@"error adding output device to session: %@", e);
    return;
}

[session startRunning];

он находится в пакете, загружаемом во время выполнения, и является частью метода, который является селектором NSThread (он же выполняется в фоновом потоке, а не в основном потоке).

Моя проблема в том, что вызов #addInput: error: никогда не возвращается. Что мне здесь не хватает?


person Alexander Battisti    schedule 18.04.2011    source источник


Ответы (1)


Проблема заключалась в том, что основной поток приложения не использовал цикл выполнения, обычно предоставляемый NSApplicationMain () в приложениях Какао. Вместо этого я обрабатывал события в собственном цикле while.

Решение называлось:

CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, YES);

Эта ветка в списке рассылки Apple QuickTime для более подробной информации объяснение проблемы.

person Alexander Battisti    schedule 19.04.2011
comment
Вы можете подробнее рассказать о решении этого вопроса? В настоящее время у меня такая же проблема, и я не знаю, как решить ее с помощью CFRunLoop ... - person Mike F; 30.03.2012
comment
IIRC I «посыпал» вызовы CFRunLoopRunInMode (kCFRunLoopDefaultMode, 0, YES); в моем цикле while в основном потоке. - person Alexander Battisti; 02.04.2012