5

Ich werde verrückt versuchen, eine AVCaptureSession (in einem View-Controller) in meinem Projekt vorgestellt und entlassen werden. Ich bin derzeit auf iOS5.1 und habe ARC aktiviert.AVCaptureSession in modalviewcontroller auf iOS5 mit ARC

Ich kann es gut funktionieren, das erste Mal, wenn ich den Viewcontroller präsentiere und die Sitzung starte, aber wenn ich ein zweites Mal ablehne und präsentiere, wird die Sitzung nicht starten. Ich auf die "AVCaptureSessionRuntimeErrorNotification" Benachrichtigung abonniert und die folgende Fehlermeldung:

"Fehler Domain = AVFoundationErrorDomain-Code = -11.819 "kann nicht abgeschlossen Action" Userinfo = 0x1a4020 {. NSLocalizedRecoverySuggestion = erneut versuchen Sie es später, NSLocalizedDescription = Kann nicht abgeschlossen Action}"

Ich gehe davon aus, dass etwas in meiner Sitzung nicht richtig freigegeben wird, aber mit ARC gibt es keine Releases und ich setzte stattdessen alles auf Null freigegeben werden.

meine viewDidLoad Methoden im Grunde löst nur initCamera

initCamera Methode:

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]; 

Verfahren

captureOutput: (AVCaptureOutput *) captureOutput didOutputSampleBuffer: (CMSampleBufferRef) anderes sample fromConnection: (AVCaptureConnection *) Verbindung

ruft kein Problem beim ersten Mal, wenn ich den modalen Viewcontroller präsentiere, aber beim zweiten Versuch hört diese Methode auf zu rufen (weil die Sitzung nicht startet)

Zum Aufräumen rufe ich stopSession von meinem übergeordneten Viewcontroller auf, bevor ich ablehne und das geschieht folgendes:

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

    [vImagePreview removeFromSuperview]; 
    vImagePreview = nil; 


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

    queue = nil; 


} 

ich fühle mich wie ich alle möglichen Dinge versucht haben, wie eine dispatch_sync (Queue,^{}) Durchführen von in der Warteschlange zu warten, bis es gespült werden, aber das doesn Es scheint keinen Unterschied zu machen (beim Aufruf von dispatch_sync habe ich den Aufruf dispatch_release in meiner Methode init camera entfernt). Ich habe auch versucht, die Methode dispatch_set_finalizer_f (queue, capture_cleanup) in einer anderen Frage vorgeschlagen, aber ich weiß nicht, was eigentlich in der capture_cleanup-Methode gehen muss, weil alle Beispiele, die ich finde nicht-ARC-Code, wo sie Freigabe aufrufen Zeiger auf sich selbst. Ich habe auch den ganzen Beispielcode durchgegangen, den ich von Apple (SquareCam und AVCam) finden kann, aber diese sind auch nicht-ARC. Jede Hilfe würde sehr geschätzt werden.

Antwort

5

Ich erkannte, dass ich eine setFocusPointOfInterest auf meiner hinteren Kamera durchgeführt hatte und aus irgendeinem Grund die Sitzung beim Relaunch korrumpierte. Ich verstehe nicht, warum das das Problem verursacht hat, aber ich werde mich darum kümmern.

+0

Das hat mein Problem auch behoben. – yuxhuang

0

Sie könnten versuchen, das SquareCam-Projekt in ARC zu konvertieren, bevor Sie die Quelle in Ihrem Programm verwenden. Ich konnte dies tun, indem ich an den Stellen, an denen sich der Converter beklagte, einen __bridge Cast verwendete und auch die "bail:" goto's durch einfache if-Anweisungen ersetzte.