Record video using AVFoundation

I am trying to record a video using AVFoundation. When I add a video input only to a session, everything works fine, but when I add an audio input to it, it stops recording video. (The delegate method is called immediately after the start of recording). Here is my code:

-(void) recordVideo { self.session = [[AVCaptureSession alloc] init]; if([session canSetSessionPreset:AVCaptureSessionPresetMedium]) session.sessionPreset = AVCaptureSessionPresetMedium; CALayer *viewLayer = [self.cameraView layer]; AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; captureVideoPreviewLayer.frame = viewLayer.bounds; [viewLayer addSublayer:captureVideoPreviewLayer]; self.videoInput = [AVCaptureDeviceInput deviceInputWithDevice:[self frontFacingCameraIfAvailable] error:nil]; self.audioInput = [AVCaptureDeviceInput deviceInputWithDevice:[self audioDevice] error:nil]; if(!videoInput) NSLog(@"Couldn't create input!"); else { self.output= [[AVCaptureMovieFileOutput alloc] init]; NSString *pathString = [[self outputPath]stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *fileURL = [NSURL fileURLWithPath:pathString]; [session beginConfiguration]; [session removeInput:[self videoInput]]; if([session canAddInput:videoInput]) [session addInput:videoInput]; [videoInput release]; [session removeInput:[self audioInput]]; if([session canAddInput:audioInput]) [session addInput:audioInput]; [audioInput release]; if([session canAddOutput:output]) [session addOutput:output]; [output release]; [session commitConfiguration]; [session startRunning]; [output startRecordingToOutputFileURL:fileURL recordingDelegate:self]; } - (void) captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections { NSLog(@"Recording Started at %@",fileURL); } - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error { NSLog(@"Recording to file ended"); [session stopRunning]; [session release]; } - (AVCaptureDevice *)frontFacingCameraIfAvailable { NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; AVCaptureDevice *captureDevice = nil; for (AVCaptureDevice *device in videoDevices) { if (device.position == AVCaptureDevicePositionBack) { captureDevice = device; break; } } return captureDevice; } - (AVCaptureDevice *) audioDevice { NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio]; if ([devices count] > 0) { return [devices objectAtIndex:0]; } return nil; } 

I call [output stopRecording] after some fixed time, but when I add the audio input, it records one frame and the didFinishRecroding delegate method is called immediately.

Can someone tell me what is wrong with this code.

thanks

+8
iphone ipad video-capture avfoundation video-recording
source share
1 answer

I get it. I need a mix of categories. Below is the code that did this:

 NSError *setCategoryError = nil; [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error: &setCategoryError]; if (setCategoryError) { NSLog(@"%@",[setCategoryError description]); } OSStatus propertySetError = 0; UInt32 allowMixing = true; propertySetError = AudioSessionSetProperty ( kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof (allowMixing), &allowMixing); 
+7
source share

All Articles