2011-08-01 90 views
8

我正在嘗試使用AVFoundation錄製視頻。當我僅將視頻輸入添加到會話中時,一切正常,但是當我添加音頻輸入時,它會停止錄製視頻(錄製開始後立即調用委託方法)。這裏是我的代碼:使用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; 
} 

我叫[輸出stopRecording]一些固定的時間後,但是當我添加一個音頻輸入,它記錄一幀和didFinishRecroding委託方法被立即調用。

有人可以告訴我這段代碼有什麼問題。

謝謝

+0

委託函數中是否有任何錯誤可用?你可以'NSLog(@「%@」,錯誤);'如果有一些帖子在這裏? –

+0

它說:錯誤域= AVFoundationErrorDomain代碼= -11818「記錄停止」UserInfo = 0x197dd0 {NSLocalizedRecoverySuggestion =停止使用記錄設備的任何其他操作,並再試一次,NSLocalizedDescription =記錄停止} – shujaat

+0

任何人??????? – shujaat

回答

7

我已經想通了。我需要分類混合。以下是它的代碼:

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); 
+0

這真的很有用:) – Yogi

+1

你在哪裏使用這段代碼? – 2012-04-22 21:12:22

+1

將該代碼放入應用程序委託中 – shujaat

相關問題