• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 在自定义相机swift + xcode中切换相机时平滑过渡

[复制链接]
菜鸟教程小白 发表于 2022-12-11 18:19:28 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用 swift 3 和 xcode 创建我的自定义相机 View 。

我已经让它工作了,但我面临一个小问题。要从前/后切换摄像头设备,我停止 session ,从 View 中删除视频预览层,然后创建一个新 session 并从前置摄像头添加一个新的视频预览层。这使得新相机突然出现。我想要相机设备之间的平滑过渡。我该怎么做?

这是我加载相机的代码:

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()
}



Best Answer-推荐答案


在 loadCamera() 中,您需要从前端捕获设备创建一个 AVCaptureInput。在某些相机单例上同时保留后输入和前输入是一种很好的做法。可以通过移除所有输入然后分配另一个输入来实现前后之间的平滑过渡。

func show(back: Bool) {
  session.beginConfiguration()
  if let inputs = session.inputs as? [AVCaptureDeviceInput] {
    for input in inputs {
      session.removeInput(input)
    }
  }
  if back {
    if session.canAddInput(backInput) {
      session.addInput(backInput)
    }
  } else {
    if session.canAddInput(frontInput) {
      session.addInput(frontInput)
    }
  }
  session.commitConfiguration()
}

关于ios - 在自定义相机swift + xcode中切换相机时平滑过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41121401/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap