您的位置:首页 > 移动开发 > Swift

[iOS Swift3.0/Oc] 摄像头实时获取视频流效果 简单记录

2016-12-05 15:49 579 查看

Oc参考贴: iOS从摄像头获得实时视频流

ios-深度解析二维码的生成与使用

Swift 3.0

1.创建 会话对象+输入对象+输出对象

为了能实时看到摄像机获取的视频图像,还要创建一个 预览图层(AVCaptureVideoPreviewLayer), 不然即使获取了摄像头对象,你也看不到拍摄的图

//会话对象 (负责输入和输出设置之间的数据传递)
private lazy var  session : AVCaptureSession = AVCaptureSession()

//输入设备 (摄像头)
private lazy var deviceInput : AVCaptureInput? = {
//获取摄像头 (默认设置后置摄像头)
let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
do {
//创建输入对象
let input = try AVCaptureDeviceInput.init(device: device)
return input
}catch{
print(error)
return nil
}
}()
//输入对象
private lazy var deviceOutPut : AVCaptureMetadataOutput = AVCaptureMetadataOutput()
//创建预览图层
private lazy var previewLayer : AVCaptureVideoPreviewLayer = {
let layer = AVCaptureVideoPreviewLayer.init(session: self.session) // 闭包要访问外界数据  要self
layer?.frame = UIScreen.main.bounds
return layer!
}()


2. 将输入对象/输出对象 添加到session(会话)中

private func startScan(){
//1.判断能否将输入添加到会话中
if !session.canAddInput(deviceInput) {
return
}
//2.判断能否将输出添加到会话中
if !session.canAddOutput(deviceOutPut) {
return
}
//3.添加到会话中
session.addInput(deviceInput)
session.addOutput(deviceOutPut)
//4.设置输出能够解析的数据类型 (一定要在输出对象添加到会话之后才能设置,否则Bug)
deviceOutPut.metadataObjectTypes = deviceOutPut.availableMetadataObjectTypes  //设置系统所有的数据类型都能解析
//5.设置输出对象的代理 (只要解析成功就会通知代理)
deviceOutPut.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
//添加预览图层到底层
view.layer.insertSublayer(previewLayer, at: 0)
//6.告诉session会话,开始扫描
session.startRunning()
}


3. AVCaptureMetadataOutputObjectsDelegate 代理中处理数据

extension QRcodeViewController:AVCaptureMetadataOutputObjectsDelegate{

//只要解析到数据,就会调用
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {
guard let objc = metadataObjects.last as? AVMetadataMachineReadableCodeObject
else {
return
}
print(objc.stringValue)
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐