Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Video Recording using AVFoundation

I am trying to record video using AVFoundation. When I add video input only to the session, everything works fine but when I add an audio input to it, it stops recording the video.(Delegate method is called immediately after recording starts). 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 an audio input it records a single frame and didFinishRecroding delegate method is called immediately.

Can anybody tell me whats wrong with this code.

Thanks

like image 685
shujaat Avatar asked Aug 01 '11 11:08

shujaat


1 Answers

I have figured it out. I needed category mixing. Following is the code that made it:

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);
like image 163
shujaat Avatar answered Oct 31 '22 22:10

shujaat