美文网首页
iOS Swift 相机步骤与注意事项

iOS Swift 相机步骤与注意事项

作者: AlanAnie | 来源:发表于2020-05-15 18:55 被阅读0次

    第一步:初始化 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()

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

    相关文章

      网友评论

          本文标题:iOS Swift 相机步骤与注意事项

          本文链接:https://www.haomeiwen.com/subject/jgrhohtx.html