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.
To również naprawiło mój problem. – yuxhuang