1

我有以下代码:

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: 的调用永远不会返回。我在这里想念什么?

4

1 回答 1

0

问题是,应用程序的主线程没有使用 Cocoa 应用程序中通常由 NSApplicationMain() 提供的运行循环。相反,我在自己的 while 循环中处理事件。

解决方案是调用:

CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, YES);

Apple 的 QuickTime 邮件列表上的这个线程对问题有更详细的解释。

于 2011-04-19T10:19:30.057 回答