5

我瘋了,試圖讓AVCaptureSession(在視圖控制器中)在我的項目中呈現和解散。我目前在iOS5.1上並啓用了ARC。在iOS5上的modalviewcontroller中的AVCaptureSession與ARC

我可以在第一次提交viewcontroller並開始會話時正常工作,但是當我解散並再次提交時,會話將無法啓動。我訂閱了「AVCaptureSessionRuntimeErrorNotification」的通知,並收到以下錯誤:

「錯誤域= AVFoundationErrorDomain代碼= -11819‘無法完成操作’的UserInfo = 0x1a4020 {。NSLocalizedRecoverySuggestion =請稍後再試,NSLocalizedDescription =無法完成行動}」

我假設有些東西在我的會話中沒有正確釋放,但是使用ARC沒有發佈,而是我將所有內容都設置爲零。

我的viewDidLoad方法基本上只是觸發initCamera

initCamera方法:

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

session = tmpSession; 
session.sessionPreset = AVCaptureSessionPresetMedium; 
captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 

captureVideoPreviewLayer.frame = self.vImagePreview.bounds; 
[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer]; 
rearCamera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 

NSError *error = nil; 
input = [AVCaptureDeviceInput deviceInputWithDevice:rearCamera error:&error]; 

if (!input) { 
    // Handle the error appropriately. 
    NSLog(@"ERROR: trying to open camera: %@", error); 
} 

[session addInput:input]; 

videoDataOutput = [[AVCaptureVideoDataOutput alloc] init]; 
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA], kCVPixelBufferPixelFormatTypeKey, nil]; 
[videoDataOutput setVideoSettings:outputSettings]; 
[videoDataOutput setAlwaysDiscardsLateVideoFrames:YES]; 


queue = dispatch_queue_create("cameraQueue", DISPATCH_QUEUE_SERIAL); 
[videoDataOutput setSampleBufferDelegate:self queue:queue]; 
dispatch_release(queue); 

[session addOutput:videoDataOutput]; 

NSNotificationCenter *notify = 
[NSNotificationCenter defaultCenter]; 

[notify addObserver: self 
      selector: @selector(onVideoError:) 
       name: AVCaptureSessionRuntimeErrorNotification 
      object: session]; 


[session startRunning]; 


[rearCamera lockForConfiguration:nil]; 
rearCamera.whiteBalanceMode = AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance; 
rearCamera.exposureMode = AVCaptureExposureModeContinuousAutoExposure; 
rearCamera.focusMode = AVCaptureFocusModeContinuousAutoFocus; 
[rearCamera unlockForConfiguration]; 

的方法

captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)連接

在第一次出現模式視圖控制器時被稱爲沒有問題,但在第二次嘗試時,此方法停止被調用(因爲會話未啓動)

對於清理,我在解僱之前從父視圖控制器調用stopSession並執行以下操作:

if ([session isRunning]) { 
    [session removeInput:input]; 
    [session stopRunning]; 

    [vImagePreview removeFromSuperview]; 
    vImagePreview = nil; 


    input = nil; 
    videoDataOutput = nil; 
    captureVideoPreviewLayer = nil; 
    session = nil; 

    queue = nil; 


} 

我覺得我已經試過各種東西,如隊列執行dispatch_sync(隊列,^ {}),以等待它被刷新,但沒有按似乎沒有什麼區別(當調用dispatch_sync時,我在init初始相機方法中刪除了dispatch_release調用)。我也嘗試過使用在另一個問題中提出的dispatch_set_finalizer_f(queue,capture_cleanup)方法,但我不知道capture_cleanup方法需要實際去哪些方面,因爲我找到的所有例子都是非ARC代碼,指向自我。我還梳理了我可以從Apple(SquareCam和AVCam)中找到的所有示例代碼,但這些代碼也是非ARC的。任何幫助將不勝感激。

回答

5

我意識到我在後置攝像頭上執行setFocusPointOfInterest,出於某種原因它正在重新啓動時破壞會話。我不明白爲什麼這會造成這個問題,但我會研究這個問題。

+0

這也解決了我的問題。 – yuxhuang 2013-02-22 02:08:39

0

在程序中使用源代碼之前,您可能會嘗試將SquareCam項目轉換爲ARC。我能夠通過在轉換器抱怨的地方使用__bridge投射,並用簡單的if語句替換「保釋:」goto。