2016-08-20 25 views
7

Nesne C'de yazılan iOS kamera uygulamam kilitli ekrandan/telefon kilidini açarken önyükleme katmanını dondurur.AVCapture önizlemesi, telefonun kilidini açarken donuyor/takılıyor

Tüm kamera yapılandırmaları ayarları viewWillAppear'da aranıyor. Şimdiye kadar başarılı oldum, tek sorun dışında, kamera önizleme katmanı kilit ekranından geri döndüğünde donuyor veya takılıyor. Kodumun kamera bölümü aşağıda verilmiştir.

Herhangi bir yardım çok takdir edilmektedir. Teşekkür ederim. ps: Sadece bir acemi olduğum için kodumda herhangi bir hatayı işaret etmekte çekinmeyin.

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    [self setGUIBasedOnMode]; 
    }); 
} 


-(void) setGUIBasedOnMode 
{ 
if (![self isStreamStarted]) { 
if (shutterActionMode == SnapCamSelectionModeLiveStream) 
{ 
    _flashButton.hidden = true; 
    _cameraButton.hidden = true; 
    _liveSteamSession = [[VCSimpleSession alloc] initWithVideoSize:[[UIScreen mainScreen]bounds].size frameRate:30 bitrate:1000000 useInterfaceOrientation:YES]; 
    [_liveSteamSession.previewView removeFromSuperview]; 
    AVCaptureVideoPreviewLayer *ptr; 
    [_liveSteamSession getCameraPreviewLayer:(&ptr)]; 
    _liveSteamSession.previewView.frame = self.view.bounds; 
    _liveSteamSession.delegate = self; 
} 
else{ 
    [_liveSteamSession.previewView removeFromSuperview]; 
    _liveSteamSession.delegate = nil; 
    _cameraButton.hidden = false; 
    if(flashFlag == 0){ 
     _flashButton.hidden = false; 
    } 
    else if(flashFlag == 1){ 
     _flashButton.hidden = true; 
    } 
    self.session = [[AVCaptureSession alloc] init]; 
    self.previewView.hidden = false; 
    self.previewView.session = self.session; 

    [self configureCameraSettings]; //All The Camera Configuration Settings. 

    dispatch_async(self.sessionQueue, ^{ 
     switch (self.setupResult) 
     { 
      case AVCamSetupResultSuccess: 
      { 
       [self addObservers]; 

       [self.session startRunning]; 

       self.sessionRunning = self.session.isRunning; 
       if(loadingCameraFlag == false){ 
        [self hidingView]; 
       } 
       break; 
      } 
      case AVCamSetupResultCameraNotAuthorized: 
      { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        NSString *message = NSLocalizedString(@"MyApp doesn't have permission to use the camera, please change privacy settings", @"Alert message when the user has denied access to the camera"); 
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"AVCam" message:message preferredStyle:UIAlertControllerStyleAlert]; 
        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", @"Alert OK button") style:UIAlertActionStyleCancel handler:nil]; 
        [alertController addAction:cancelAction]; 

        UIAlertAction *settingsAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Settings", @"Alert button to open Settings") style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
         [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; 
        }]; 
        [alertController addAction:settingsAction]; 
        [self presentViewController:alertController animated:YES completion:nil]; 
       }); 
       break; 
      } 
      case AVCamSetupResultSessionConfigurationFailed: 
      { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        NSString *message = NSLocalizedString(@"Unable to capture media", @"Alert message when something goes wrong during capture session configuration"); 
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"MyApp" message:message preferredStyle:UIAlertControllerStyleAlert]; 
        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", @"Alert OK button") style:UIAlertActionStyleCancel handler:nil]; 
        [alertController addAction:cancelAction]; 
        [self presentViewController:alertController animated:YES completion:nil]; 
       }); 
       break; 
      } 
     } 
    }); 
} 
} 

-(void)configureCameraSettings 
{ 
self.sessionQueue = dispatch_queue_create("session queue",  DISPATCH_QUEUE_SERIAL); 
self.setupResult = AVCamSetupResultSuccess; 
switch ([AVCaptureDevice  authorizationStatusForMediaType:AVMediaTypeVideo]) 
{ 
    case AVAuthorizationStatusAuthorized: 
    { 
     break; 
    } 
    case AVAuthorizationStatusNotDetermined: 
    { 
     dispatch_suspend(self.sessionQueue); 
     [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { 
      if (! granted) { 
       self.setupResult = AVCamSetupResultCameraNotAuthorized; 
      } 
      dispatch_resume(self.sessionQueue); 
     }]; 
     break; 
    } 
    default: 
    { 
     self.setupResult = AVCamSetupResultCameraNotAuthorized; 
     break; 
    } 
} 

dispatch_async(self.sessionQueue, ^{ 
if (self.setupResult != AVCamSetupResultSuccess) { 
    return; 
} 
self.backgroundRecordingID = UIBackgroundTaskInvalid; 
NSError *error = nil; 

AVCaptureDevice *videoDevice = [IPhoneCameraViewController deviceWithMediaType:AVMediaTypeVideo preferringPosition:AVCaptureDevicePositionBack]; 
AVCaptureDeviceInput *videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; 

[self.session beginConfiguration]; 

if ([self.session canAddInput:videoDeviceInput]) { 
    [self.session addInput:videoDeviceInput]; 
    self.videoDeviceInput = videoDeviceInput; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation; 
     AVCaptureVideoOrientation initialVideoOrientation = AVCaptureVideoOrientationPortrait; 
     if (statusBarOrientation != UIInterfaceOrientationUnknown) { 
      initialVideoOrientation = (AVCaptureVideoOrientation)statusBarOrientation; 
     } 
     AVCaptureVideoPreviewLayer *previewLayer = (AVCaptureVideoPreviewLayer *)self.previewView.layer; 
     if (shutterActionMode == SnapCamSelectionModeVideo) 
     { 
      [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 
      if([self.session canSetSessionPreset:AVCaptureSessionPresetMedium]){ 
       [self.session setSessionPreset:AVCaptureSessionPresetMedium]; 
      } 
     } 
     previewLayer.connection.videoOrientation = initialVideoOrientation; 
    }); 
} 
else { 
    self.setupResult = AVCamSetupResultSessionConfigurationFailed; 
} 

AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; 
AVCaptureDeviceInput *audioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error]; 

if (! audioDeviceInput) { 
} 

if ([self.session canAddInput:audioDeviceInput]) { 
    [self.session addInput:audioDeviceInput]; 
} 
else { 
} 

AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; 

Float64 TotalSeconds = 10*60; 
int32_t preferredTimeScale = 30; 
CMTime maxDuration = CMTimeMakeWithSeconds(TotalSeconds, preferredTimeScale);   movieFileOutput.maxRecordedDuration = maxDuration; 
movieFileOutput.minFreeDiskSpaceLimit = 1024 * 1024 * 100; 

if ([self.session canAddOutput:movieFileOutput]) { 
    [self.session addOutput:movieFileOutput]; 
    AVCaptureConnection *connection = [movieFileOutput connectionWithMediaType:AVMediaTypeVideo]; 
    if (connection.isVideoStabilizationSupported) { 
     connection.preferredVideoStabilizationMode = AVCaptureVideoStabilizationModeAuto; 
    } 
    self.movieFileOutput = movieFileOutput; 
} 
else { 
    self.setupResult = AVCamSetupResultSessionConfigurationFailed; 
} 

AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; 
if ([self.session canAddOutput:stillImageOutput]) { 
    stillImageOutput.outputSettings = @{AVVideoCodecKey : AVVideoCodecJPEG}; 
    [self.session addOutput:stillImageOutput]; 
    self.stillImageOutput = stillImageOutput; 
} 
else { 
    self.setupResult = AVCamSetupResultSessionConfigurationFailed; 
} 
[self.session commitConfiguration]; 
}); 
} 
+0

http://stackoverflow.com/a/30707170/4601170 –

cevap

0

ViewDidLoadViewWillAppear ve ViewDidAppear yöntem uygulama yaşam döngüsü uygulaması arasında bir çok fark vardır.

UIViews oluşturulması veya bazı ağır bir görevi yerine nedenler dondurmak oldukça pahalıdır ve viewWillAppear yöntemine

üzerine bunu yaparken mümkün olduğunca göz var kaçınmalısınız:

  1. ViewDidLoad: Görünümle birlikte görünmesi gereken bir görünüme denetimleri her eklediğimde, hemen ViewDidLoad yöntemine koydum. Temelde bu görünüm, belleğe yüklendiğinde çağrılır. Örneğin, eğer görüşüm 3 etiketli bir form ise, etiketleri buraya eklerim; Bu formlar olmadan manzara asla olmayacak.
  2. ViewWillAppear: ViewWillAppear genellikle yalnızca formdaki verileri güncelleştirmek için kullanılır. Bu nedenle, yukarıdaki örnekte, verileri alanımdan formda gerçekten yüklemek için bunu kullanırdım. UIViews yaratılması oldukça pahalıdır ve bu, ViewWillAppear yönteminde bunu yapmanın mümkün olduğu kadar kaçınmanız gerekir, çünkü bu çağrıldığında, iPhone UIView'i kullanıcıya göstermeye hazır demektir ve burada yaptığınız her şey Performansı çok görünür bir şekilde etkileyecektir (animasyonlar gecikmeli, vb. gibi).
  3. ViewDidAppear: ViewDidAppear, örneğin, yukarıdaki form için fazladan veri almak için bir web servis çağrısı yapmak gibi, yürütmek için uzun zaman alan şeylere yeni iş parçacıklarını başlatmak için kullanılır. ve kullanıcıya görüntüleniyorken, verileri alırken kullanıcıya güzel bir "Bekleyen" mesajı gösterebilirsiniz. durdurmak için UIApplicationDidEnterBackgroundNotification/UIApplicationWillEnterForegroundNotification,UIApplicationWillResignActiveNotification/UIApplicationDidBecomeActiveNotification bildirimleri gözlemlemek
1

deneme/yakalama oturumu başlatmak buna

İlgili konular