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)
}
}