ios - 使用 AVCaptureSession 录制视频

标签 ios iphone swift ipad avcapturesession

我正在 Swift 中使用 AVCaptureSession 录制视频,它工作正常,但我的客户要求是用 transform animation 是否有可能实现这一点。

请检查我试过的以下代码:

var captureDevice : AVCaptureDevice!
var captureSession: AVCaptureSession?
var stillImageOutput: AVCaptureStillImageOutput?
var previewLayer: AVCaptureVideoPreviewLayer?

captureSession = AVCaptureSession()

captureSession?.sessionPreset = AVCaptureSessionPresetPhoto
if  let availbleDevices = AVCaptureDeviceDiscoverySession.init(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .front).devices {
    captureDevice = availbleDevices.first    

    captureSession?.beginConfiguration()
    configureVideoPreset()
    addVideoInput()

    configureVideoOutput()
    configurePhotoOutput()
    captureSession?.commitConfiguration()

    beginSession()
    ...
}

在开始 session 中,我在 view.layer 中添加了预览层

func beginSession(){        
    do {    
        let input =  try  AVCaptureDeviceInput(device: captureDevice)

        captureSession!.addInput(input)    
    } catch{
        print(error.localizedDescription)
    }
    if let previewLayer =  AVCaptureVideoPreviewLayer(session:captureSession){
        self.previewLayer = previewLayer
        self.previewLayer?.frame = view.bounds

        self.previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
        let dataOutput = AVCaptureVideoDataOutput()
        dataOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as NSString:kCVPixelFormatType_32BGRA]
        dataOutput.alwaysDiscardsLateVideoFrames = true

        if captureDevice.hasFlash == true {
            do {
                try captureDevice.lockForConfiguration()
                captureDevice.flashMode = AVCaptureFlashMode.on
                captureDevice.unlockForConfiguration()
            } catch {
                print("[SwiftyCam]: \(error)")
            }
        }    

        self.view.layer.addSublayer(self.previewLayer!)
        captureSession?.commitConfiguration()

        captureSession!.startRunning()
        captureSession?.beginConfiguration()

        if (captureSession?.canAddOutput(dataOutput))!{
            captureSession?.addOutput(dataOutput)
        }
        captureSession?.commitConfiguration()

        let output = AVCaptureMetadataOutput()
        output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
        captureSession?.addOutput(output)

        output.metadataObjectTypes = [AVMetadataObjectTypeFace]

        print("array \(output.metadataObjectTypes)")

        let queue = DispatchQueue.init(label: "com.UOO.captureQueue")
        dataOutput.setSampleBufferDelegate(self , queue: queue)
    }
}

一切正常,我也可以录制视频,但我无法用动画隐藏相机。

最佳答案

func setView(view: UIView, hidden: Bool) {
    UIView.transition(with: view, duration: 0.5, options: .transitionCrossDissolve, animations: {() -> Void in
        view.isHidden = hidden
    }, completion: nil)
}

像这样使用这个方法

  self.setView(view: previewLayer as! UIView, hidden:true)

我从你的问题中假设,预览层是从 View 中移除而没有动画的层

关于ios - 使用 AVCaptureSession 录制视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46194304/

相关文章:

ios - 基于 Web 的 iOS 应用程序有哪些最佳实践?

ios - 如何使用 SDWebImage 调整下载的图像大小?

iphone - 如何将 TableView Controller 的类型更改为常规 View Controller ?

ios - 在 App 和 Today Extension 之间快速共享 CoreData

swift - 登录警报 swift 2.0 后打开一个新的 View Controller

ios - 将单元格的高度设置为等于标签内容

iphone - 用于更改 View 的 UISegmented View

iOS Safari 放大高分辨率背景图像

ios - 我正在尝试更新 GCD 中的 Realm 对象,但是当我的代码运行时,它会因错误而崩溃,如下所示

iphone - startMonitoringForRegion 可以唤醒我的应用程序并开始 GPS 跟踪吗?