ARC

5

ile iOS5'te modal viewcontroller'da AVCaptureSession Bir AVCaptureSession'ı (bir denetleyicide) sunmaya çalışıyorum ve projemde görevden alındım. Şu anda iOS5.1'de yaşıyorum ve ARC'yi etkinleştirdim.ARC

İlk kez görüntü denetleyicisini sunduğumda ve oturumu başlattığımda iyi çalışabilirim, ancak kapattığımda ve ikinci kez sunuşunda oturum başlamayacaktır. Ben "AVCaptureSessionRuntimeErrorNotification" bildirimi abone ve aşağıdaki hatayı alırsınız:

"Hata Alan = AVFoundationErrorDomain Kodu = -11.819 'değil Komple Eylem Can' Userınfo = 0x1a4020 {. NSLocalizedRecoverySuggestion = Daha sonra tekrar deneyin, NSLocalizedDescription = Tamamlanamıyor Eylem}"

Oturumumda bir şeyin düzgün bir şekilde yayınlanmadığını varsayardım, ancak ARC ile herhangi bir yayınlama yok ve bunun yerine her şeyi sıfırlanacak.

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

yöntem

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

benim viewDidLoad yöntemlerine

Temelde sadece initCamera

initCamera yöntemi tetikler *) bağlantı

, modal görünüm denetleyicisini ilk kez sunarken sorun değil, ikinci denemede bu yöntem çağrılmayı durdurur (oturum başlamaz)

Temizlemek için görevden ayrılmadan önce ana görünüm denetleyiciden stopSession'ı arıyorum. böyle fýrçalanmadan için beklemek sıraya (^ {}, kuyruk) bir dispatch_sync gerçekleştirme olarak her türlü şeyi denedim gibi

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

    [vImagePreview removeFromSuperview]; 
    vImagePreview = nil; 


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

    queue = nil; 


} 

hissediyorum, ama bu gelmez: ve o şunları yapar Bir fark yaratıyor gibi görünmüyor (dispatch_sync çağrıldığında init kamera yöntemimde dispatch_release çağrısını kaldırdım). Ayrıca başka bir soruda önerilen dispatch_set_finalizer_f (sıra, capture_cleanup) yöntemini kullanmayı denedim, ancak yakalama çağrısı yaptıkları tüm örnekler ARC kodları olmadığından capture_cleanup yönteminde gerçekten neye ihtiyaç duyduğumu bilmiyorum. kendi kendine işaretçi. Ayrıca Apple'dan (SquareCam ve AVCam) bulabildiğim tüm örnek kodları taradım ama bunlar da ARC değil. Herhangi bir yardım büyük takdir edilecektir.

cevap

5

Arka kameramda setFocusPointOfInterest gerçekleştirdiğimi fark ettim ve bazı nedenlerden dolayı oturum yeniden başlatılıyor. Bunun neden sorun olduğunu anlamıyorum ama buna bakacağım.

+0

Bu, sorunumu da düzeltti. – yuxhuang

0

Programınızda kaynağı kullanmadan önce SquareCam projesini ARC'ye dönüştürmeyi deneyebilirsiniz. Ben çevirici şikayetçi yerlerde bir __bridge cast kullanarak bunu başardı ve aynı zamanda "kefalet:" goto's basit ifadeler ile değiştirin.