2011-08-01 4 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 (@ "% @", error); 그리고 어떤 경우 여기에 게시 할 수 있습니까? –

+0

그것은 말합니다 : 오류 도메인 = AVFoundationErrorDomain 코드 = -11818 "녹음 중지됨"UserInfo = 0x197dd0 {NSLocalizedRecoverySuggestion = 녹음 장치를 사용하여 다른 작업을 중지하고 다시 시도하십시오., NSLocalizedDescription = 녹음 중지} – shujaat

+0

아무도 ??????? – shujaat

답변

7

나는 그것을 알아 냈습니다. 카테고리 믹싱이 필요했습니다. 다음은이를 만든 코드입니다.

+0

정말 도움이됩니다. – Yogi

+1

이 코드를 어디에서 사용합니까? –

+1

해당 코드를 앱 대리인에 넣습니다. – shujaat

관련 문제