第一步:初始化 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()
注意事项就是:所有设置必须在会话管理器启动前初始化并且设置,不然拍照 和 录像 会有很多小问题
网友评论