2016-12-13 5 views
0

Я создавал свой пользовательский вид камеры с помощью быстрых 3 и xcode.Плавный переход при переключении камер в пользовательскую камеру swift + xcode

У меня есть это, чтобы работать, но я столкнулся с небольшой проблемой. Чтобы переключить камеру с передней/задней стороны, я прекращаю сеанс, удаляю слой предварительного просмотра видео из представления, а затем создаю новый сеанс и добавляем новый слой предварительного просмотра видео с передней камеры. Это приводит к появлению новой камеры с рывком. Я хочу плавный переход между устройствами камеры. Как я могу это сделать?

Вот мой код для загрузки камеры:

func loadCamera() 
{ 

    session?.stopRunning() 
    videoPreviewLayer?.removeFromSuperlayer() 

    session = AVCaptureSession() 
    session!.sessionPreset = AVCaptureSessionPresetPhoto 


    var backCamera = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .front) 

    if cameraPos == "back" 
    { 
     backCamera = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .back) 
    } 

    var error: NSError? 
    var input: AVCaptureDeviceInput! 
    do { 
     input = try AVCaptureDeviceInput(device: backCamera) 
    } catch let error1 as NSError { 
     error = error1 
     input = nil 
     print(error!.localizedDescription) 
    } 

    if error == nil && session!.canAddInput(input) { 
     session!.addInput(input) 

     stillImageOutput = AVCapturePhotoOutput() 


     if session!.canAddOutput(stillImageOutput) { 
      session!.addOutput(stillImageOutput) 


      videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) 

      videoPreviewLayer?.frame = cameraView.bounds 
      videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill 
      videoPreviewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait 


      cameraView.layer.addSublayer(videoPreviewLayer!) 
      session!.startRunning() 

     } 
    } 
} 

я называю это из viewWillAppear

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    loadCamera() 
} 

и я называю камеры загрузки, если пользователь нажимает на камеру изменения

@IBAction func changeCamera(_ sender: UIButton) { 

    if cameraPos == "back" 
    {cameraPos = "front"} 

    else 
    {cameraPos = "back"} 


    loadCamera() 
} 

ответ

0

вызовов функция loadCamera() внутри viewDidAppear вместо viewWillAppear

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(true) 
    loadCamera() 
} 

Фоновый поток:

DispatchQueue.global(qos: .background).async { 

    // perform ui updation and web related code 
    // background thread 

    DispatchQueue.main.async { 
     // main thread 
    } 
} 
+0

пытался. все тот же – user2238284

+0

вы можете использовать фоновые потоки также для выполнения некоторых обновлений uicomponents. – vaibhav

+0

любое предложение или ссылку, на которую вы можете поделиться, я могу посмотреть? – user2238284

 Смежные вопросы

  • Нет связанных вопросов^_^