5

Idę szalony próbując uzyskać AVCaptureSession (w kontroler widoku), które mają być przedstawione i odrzucone w moim projekcie. Obecnie jestem na iOS5.1 i włączono obsługę ARC.AVCaptureSession w kontrolerze modalview na iOS5 z ARC

Mogę sprawić, żeby działało poprawnie po pierwszym przedstawieniu kontrolera viewcontroller i rozpoczęciu sesji, ale kiedy odrzucę i przedstawię drugi raz, sesja się nie rozpocznie. Popierałem "AVCaptureSessionRuntimeErrorNotification" powiadamiania i pojawia się następujący błąd:

"Błąd Domain = kod AVFoundationErrorDomain = -11819 "Nie można zakończyć operacji" UserInfo = 0x1a4020 {. NSLocalizedRecoverySuggestion = Spróbuj ponownie później, NSLocalizedDescription = Nie można zakończyć akcji}"

Zakładam, że coś nie jest poprawnie publikowane w mojej sesji, ale z ARC nie ma żadnych wydań, a zamiast tego ustawiam wszystko, co ma być wydane na zero.

moich metod viewDidLoad zasadzie tylko wyzwala initCamera

initCamera metoda:

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

Sposób

captureOutput: (AVCaptureOutput *) captureOutput didOutputSampleBuffer: (CMSampleBufferRef) sampleBuffer fromConnection: (AVCaptureConnection *) połączenie

zostaje wywołany bez problemu, gdy po raz pierwszy przedstawiam modalny kontroler viewcontroller, ale przy drugiej próbie ta metoda przestaje być wywoływana (ponieważ sesja się nie uruchamia)

Do czyszczenia Wzywam stopSession z mojego nadrzędnego kontrolera viewcontroller przed zwalnianiem i który wykonuje następujące czynności:

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

    [vImagePreview removeFromSuperview]; 
    vImagePreview = nil; 


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

    queue = nil; 


} 

czuję, że próbowałem różnych rzeczy, takich jak wykonywanie dispatch_sync (kolejki,^{}) w kolejce czekać na to, aby być zaczerwieniona, ale to nie robi Wydaje się, że robi różnicę (podczas wywoływania dispatch_sync usunąłem wywołanie dispatch_release w mojej metodzie kamery init). Próbowałem również przy użyciu metody dispatch_set_finalizer_f (queue, capture_cleanup) zasugerowanej w innym pytaniu, ale nie wiem, co faktycznie należy zrobić w metodzie capture_cleanup, ponieważ wszystkie przykłady, które znajduję, są kodami niezwiązanymi z ARC, w których wywołują zwalnianie wskaźnik do siebie. Przeszukałem cały przykładowy kod, który mogę znaleźć w Apple (SquareCam i AVCam), ale nie są to również ARC. Każda pomoc będzie bardzo ceniona.

Odpowiedz

5

Uświadomiłem sobie, że wykonuję setFocusPointOfInterest na moim tylnym aparacie i z jakiegoś powodu został on uszkodzony podczas ponownego uruchamiania sesji. Nie rozumiem, dlaczego to spowodowało problem, ale będę się nad tym zastanawiać.

+0

To również naprawiło mój problem. – yuxhuang

0

Możesz spróbować przekonwertować projekt SquareCam na ARC, zanim użyjesz źródła w swoim programie. Udało mi się to zrobić za pomocą __bridge w miejscach, w których konwerter się skarżył, a także zastąpić "bail:" goto za pomocą prostych instrukcji if.