我瘋了,試圖讓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的。任何幫助將不勝感激。
這也解決了我的問題。 – yuxhuang 2013-02-22 02:08:39