Запись видео с использованием AVFoundation - PullRequest
8 голосов
/ 01 августа 2011

Я пытаюсь записать видео с помощью AVFoundation. Когда я добавляю видеовход только в сеанс, все работает нормально, но когда я добавляю в него аудиовход, запись видео останавливается (метод делегата вызывается сразу после начала записи). Вот мой код:

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

Я вызываю [output stopRecording] через некоторое фиксированное время, но когда я добавляю аудиовход, он записывает один кадр, и метод делегата didFinishRecroding вызывается немедленно.

Может кто-нибудь сказать мне, что не так с этим кодом.

Спасибо

1 Ответ

7 голосов
/ 16 августа 2011

Я понял это. Мне нужно было смешивание категорий. Ниже приведен код, который сделал это:

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);
...