2014-02-20 2 views
0

AV Foundation을 사용하는보기 컨트롤러가 있습니다. View 컨트롤러가로드 되 자마자 사용자는 입력 장치가보고있는 것을 정확히 볼 수 있습니다. 이것은 viewDidLoad 메서드 구현에서 AVCaptureSession을 시작했기 때문입니다. 여기 AV Foundation을 사용하여 스틸 이미지를 캡처하려고 할 때 계속 "비활성/잘못된 연결이 통과되었습니다."오류가 발생합니다.

내가있는 viewDidLoad에있는 코드이다

[super viewDidLoad]; 


AVCaptureSession *session =[[AVCaptureSession alloc]init]; 


[session setSessionPreset:AVCaptureSessionPresetHigh]; 


AVCaptureDevice *inputDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 


NSError *error = [[NSError alloc]init]; 


AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:&error]; 


if([session canAddInput:deviceInput]) 
    [session addInput:deviceInput]; 


AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:session]; 



[previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 



CALayer *rootLayer = [[self view]layer]; 


[rootLayer setMasksToBounds:YES]; 



[previewLayer setFrame:CGRectMake(0, 0, rootLayer.bounds.size.width, rootLayer.bounds.size.height/2)]; 


[rootLayer insertSublayer:previewLayer atIndex:0]; 


[session startRunning]; 

그리고 I이 뷰 컨트롤러의 접속있는 UIButton되었습니다 IBAction를 구현 방법이있다. 여기에 IBAction를 구현의 코드입니다 : 내 아이폰 응용 프로그램을 실행하고이 구현에 연결된 버튼을 누르면

AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc]init]; 


AVCaptureConnection *connection = [[AVCaptureConnection alloc]init]; 

[stillImageOutput captureStillImageAsynchronouslyFromConnection:connection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { 

    NSLog(@"Image Data Captured: %@", imageDataSampleBuffer); 
    NSLog(@"Any errors? %@", error); 

    if(imageDataSampleBuffer) { 


     NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; 


     UIImage *image = [[UIImage alloc]initWithData:imageData]; 


     NSLog(@"%@", image); 


    } 

}]; 

, 나는 콘솔에서이 오류를 얻을 :

*** -[AVCaptureStillImageOutput captureStillImageAsynchronouslyFromConnection:completionHandler:] - inactive/invalid connection passed.' 

내가에서 보았다 xcode 워드 프로세서 및 "canAddConnection : YES를 반환하는 경우에만 addConnection을 사용하여 세션에 AVCaptureConnection 인스턴스를 추가 할 수 있지만"내 AVCaptureSession 개체에서 addConnection 및 canAddConnection에 대한 메서드 호출을 시도했지만 표시하지 않습니다 옵션으로 사용할 수 있습니다.

또한 iOS의 경우 수동으로 연결을 만들지 않아도되지만 내 IBAction의 코드에 입력이 필요한 captureStillImageAsynchronouslyFromConnection:의 메서드 호출이 있기 때문에 이것이 나에게 맞는 것은 아닙니다.

그래서 연결이 자동으로 만들어지면 입력을 위해 사용할 수 있도록 전화가 무엇입니까?

AV Foundation에서 작업 한 것은 이번이 처음이며이 연결 오류를 알 수없는 것 같습니다.

도움을 주시면 대단히 감사하겠습니다.

답변

1

카메라를 설정할 때 stillImageOutput을 AVCaptureSession에 추가하십시오. 사진을 찍을 때

self.stillImageOutput = AVCaptureStillImageOutput() 
let stillSettings = [AVVideoCodecJPEG:AVVideoCodecKey] 
self.stillImageOutput.outputSettings = stillSettings 
if(self.session.canAddOutput(self.stillImageOutput)){ 
self.session.addOutput(self.stillImageOutput) 
} 

그런 stillImageOutput에서 AVCaptureSession를 얻을.

0

func takePhoto(sender: UIButton!){ 
let connection = self.stillImageOutput.connectionWithMediaType(AVMediaTypeVideo) 

if(connection.enabled){ 
    self.stillImageOutput.captureStillImageAsynchronouslyFromConnection(connection, completionHandler: {(buffer: CMSampleBuffer!, error: NSError!) -> Void in 
     println("picture taken")//this never gets executed 
    }) 
} 

은}

@property (nonatomic, strong) AVCaptureSession *captureSession; 
//... 
self.captureSession = session; 

내가 당신을 도움이되기를 바랍니다처럼, 당신은 AVCaptureSession을 유지하는 특성을 가지고 있었다.