可可QTKit和录制电影

时间:2009-03-07 21:49:37

标签: objective-c cocoa xcode macos qtkit

我是整个QTKit的新手,我正在寻找以下代码的一些反馈,我试图用来显示相机的图像和录制电影。

- (void)initializeMovie {

NSLog(@"Hi!");

QTCaptureSession* mainSession = [[QTCaptureSession alloc] init];

QTCaptureDevice* deviceVideo = [QTCaptureDevice defaultInputDeviceWithMediaType:@"QTMediaTypeVideo"];

QTCaptureDevice* deviceAudio = [QTCaptureDevice defaultInputDeviceWithMediaType:@"QTMediaTypeSound"];

NSError* error;

[deviceVideo open:&error];
[deviceAudio open:&error];

QTCaptureDeviceInput* video = [QTCaptureDeviceInput deviceInputWithDevice:deviceVideo];

QTCaptureDeviceInput* audio = [QTCaptureDeviceInput deviceInputWithDevice:deviceAudio];

[mainSession addInput:video error:&error];
[mainSession addInput:audio error:&error];

QTCaptureMovieFileOutput* output = [[QTCaptureMovieFileOutput alloc] init];
[output recordToOutputFileURL:[NSURL URLWithString:@"Users/chasemeadors/Desktop/capture1.mov"]];

[mainSession addOutput:output error:&error];

[movieView setCaptureSession:mainSession];

[mainSession startRunning];

}

另外,我不确定方法一直要求的整个错误参数,我在一个例子中看到了“& error”符号,但我不知道这意味着什么。

当我明确打开设备时,我也收到错误“无法初始化未打开的设备”。

如果有人能帮助我解决这个问题,那将是一个很大的帮助,谢谢。

2 个答案:

答案 0 :(得分:2)

  

QTCaptureDevice * deviceVideo = [QTCaptureDevice defaultInputDeviceWithMediaType:@“QTMediaTypeVideo”];

     

QTCaptureDevice * deviceAudio = [QTCaptureDevice defaultInputDeviceWithMediaType:@“QTMediaTypeSound”];

在此处传递实际常量,而不是包含其名称的字符串文字。无法保证将QTMediaTypeVideo定义为@"QTMediaTypeVideo";它可能是@"Ollie ollie oxen free",即使它是你期望的现在,它也可以随时改变。

[output recordToOutputFileURL:[NSURL URLWithString:@"Users/chasemeadors/Desktop/capture1.mov"]];

不要假设当前工作目录是/。始终使用绝对路径。 (我知道这是测试代码;在实际代码中,你当然会运行一个NSSavePanel并从那里获得路径。)

  

另外,我不确定方法一直在调用的整个错误参数,我在一个例子中看到了“&error”符号,但我不知道这意味着什么。

&表示您正在获取变量的地址,在本例中为error。您将此地址(a.k.a.指针)传递给QTKit方法之一的error:参数。如果遇到错误,该方法将创建一个NSError对象并将其存储在该地址 - 即变量中。这称为“引用返回”(“引用”是您提供的指针)。

  

当我明确打开设备时,我也收到错误“无法初始化未打开的设备”。

哪种方法返回错误?您是在谈论NSError还是仅仅是控制台消息?如果是后者,请检查您的NSError变量,看看问题方法留下了什么。

顺便说一句,这就是为什么如果任何一个QTKit方法返回错误你应该挽救的原因:如果不这样做,后续消息之一可能会用新错误来破坏它。

答案 1 :(得分:2)

另外,您可能需要查看MyRecorder sample code。它是基于QTKit Capture API的全功能视频录像机。代码相当简单,应该易于理解。