2011-08-01 22 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

このコードはどこで使用しますか? –

+1

そのコードをアプリデリゲートに入れる – shujaat

関連する問題