iOS Swift 相机步骤与注意事项

第一步:初始化 AVCaptureDevice


let capDevice = AVCaptureDevice.default(for: .video)

第二步:初始化 设备会话管理器  管理输入输出

let  capDevicetureSession = AVCaptureSession.init()

        ///设置

       capDevicetureSession?.canSetSessionPreset(AVCaptureSession.Preset.init(rawValue: "AVCaptureSessionPreset1280x720"))

       capDevicetureSession?.sessionPreset = AVCaptureSession.Preset.init(rawValue: "AVCaptureSessionPreset1280x720")

第三步:初始化相机设备输入流
do{

            ///初始化输入流

          let  capDeviceInput=tryAVCaptureDeviceInput.init(device:capDevice!)

            ///添加输入流

            if capDevicetureSession?.canAddInput(capDeviceInput!) == true{

                capDevicetureSession?.addInput(capDeviceInput!)

            }

        }catch{

            print("相机初始化失败")

        }

第四步: 拍照 初始化照片输出流

///初始化照片输出流

       let  capDeviceImgOutput = AVCapturePhotoOutput.init()

        ///添加输出流

        if capDevicetureSession?.canAddOutput(capDeviceImgOutput!) == true{

            capDevicetureSession?.addOutput(capDeviceImgOutput!)

        }

第五步:录像 初始化视频输出流

///初始化视频数据输出流

        let capDeviceVideoOutput = AVCaptureVideoDataOutput.init()

        ///添加输出流

        if capDevicetureSession?.canAddOutput(capDeviceVideoOutput!) == true{

            capDevicetureSession?.addOutput(capDeviceVideoOutput!)

        }

        capDeviceVideoOutput?.alwaysDiscardsLateVideoFrames = true//kCVPixelBufferPixelFormatTypeKey

        capDeviceVideoOutput?.videoSettings = [String(kCVPixelBufferPixelFormatTypeKey):kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange]

        capDeviceVideoOutput?.setSampleBufferDelegate(self, queue:DispatchQueue.init(label:"video"))

第六步:因为录像肯定还需要同步录制音频所以初始化音频的输入  输出

因为音频不能用上面的相机device所以

///初始化麦克风设备

        letaudioDevice =AVCaptureDevice.default(for: .audio)

        do{

            // Wrap the audio device in a capture device input.

            capDeviceAudioInput=tryAVCaptureDeviceInput(device: audioDevice!)

            // If the input can be added, add it to the session.

            if capDevicetureSession!.canAddInput(capDeviceAudioInput!) {

                capDevicetureSession!.addInput(capDeviceAudioInput!)

            }


        }catch{

            print("麦克风失败")

        }


 ///初始化音频输出流

       let   capDeviceAudioOutput=  AVCaptureAudioDataOutput.init()

        if capDevicetureSession!.canAddOutput(capDeviceAudioOutput!){

           capDevicetureSession!.addOutput(capDeviceAudioOutput!)

        }

        capDeviceAudioOutput?.setSampleBufferDelegate(self, queue:DispatchQueue.init(label:"audio"))

第七步:初始化视频连接器

let  videoConnection = capDeviceVideoOutput?.connection(with: .video)

        videoConnection?.automaticallyAdjustsVideoMirroring = false

        //设置视频输出方向

        videoConnection?.videoOrientation = .portrait

        //判断是否支撑视频稳定 可以显著提高视频的质量 只会在录制视频文件涉及到

        if videoConnection!.isVideoStabilizationSupported {

            videoConnection?.preferredVideoStabilizationMode = .auto

        }


第八步:最重要的一步:将所有的输入输出流都添加到设备会话管理器

前面几步已经添加了

最后就是初始化预览相机的视图了

///初始化相机输出流预览图层

        let capDevicePreViewLayer = AVCaptureVideoPreviewLayer.init(session: capDevicetureSession!)

         capDeviceContentView=SYDIYCameraContentView.init(frame: preViewLayerFrame)

         capDevicePreViewLayer?.frame=CGRect.init(x:0, y:0, width: preViewLayerFrame.size.width, height: preViewLayerFrame.size.height)

         capDevicePreViewLayer?.videoGravity = .resizeAspectFill

然后开启会话管理器启动设备运行

capDevicetureSession?.startRunning()

注意事项就是:所有设置必须在会话管理器启动前初始化并且设置,不然拍照 和 录像 会有很多小问题

推荐阅读更多精彩内容