views:

766

answers:

2

I'm new with the whole QTKit and I was looking for some feedback on the following code that I am attempting to use to display the camera's image and record movies.

- (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];

}

Also, I'm not sure about the whole error parameter that the methods keep calling for, I saw the "&error" symbol in an example but I don't know what it means.

I'm also getting an error "cannot initialize a device that is not open" when I explicitly open the devices.

If anyone could help me sort this out, it'd be a great help, thanks.

+2  A: 

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

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

Pass the actual constants here, not string literals containing their names. There's no guarantee that QTMediaTypeVideo is defined to @"QTMediaTypeVideo"; it could be @"Ollie ollie oxen free", and even if it is what you expect now, it could change at any time.

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

Don't assume that the current working directory is /. Always use absolute paths. (I know this is test code; in real code, of course, you would have run an NSSavePanel and gotten the path from there.)

Also, I'm not sure about the whole error parameter that the methods keep calling for, I saw the "&error" symbol in an example but I don't know what it means.

The & means you're taking the address of a variable, which in this case is error. You're passing this address (a.k.a. pointer) to the error: argument of one of QTKit's methods. The method will, if it encounters an error, create an NSError object and store it at that address—i.e., in your variable. This is called “return-by-reference” (the “reference” being the pointer you provided).

I'm also getting an error "cannot initialize a device that is not open" when I explicitly open the devices.

Which method returns the error? Are you talking about an NSError, or just a Console message? If the latter, check your NSError variable and see what the problem method left behind.

This, incidentally, is why you should bail out if any of the QTKit methods returns an error: one of the subsequent messages may clobber it with a new error if you don't.

Peter Hosey
+1  A: 

Also, you may want to look at the MyRecorder sample code. It's a fully functional video recorder based on the QTKit Capture API. The code is reasonably simple and should be easy to understand.

Brad Larson