swift使用AVFoundation实现自定义相机
Posted hequnwang10
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift使用AVFoundation实现自定义相机相关的知识,希望对你有一定的参考价值。
上一篇文章《swift使用AVFoundation实现自定义相机(一)》实现了使用swiftUI自定义相机,这一篇总结使用UIkit框架实现自定义相机。创建项目的时候选择这个。
代码ViewController.swift
//
// ViewController.swift
// Snapchat
//
// Created by whq on 2021/8/13.
//
import AVFoundation
import UIKit
class ViewController: UIViewController {
var session:AVCaptureSession?
let output = AVCapturePhotoOutput()
let previewLayer = AVCaptureVideoPreviewLayer()
private let shutterButton:UIButton = {
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
button.layer.cornerRadius = 50
button.layer.borderWidth = 10
button.layer.borderColor = UIColor.white.cgColor
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .black
previewLayer.backgroundColor = UIColor.systemRed.cgColor
view.layer.addSublayer(previewLayer)
view.addSubview(shutterButton)
checkCameraPermissions()
shutterButton.addTarget(self, action: #selector(didTapTakePhoto), for: .touchUpInside)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
previewLayer.frame = view.bounds
shutterButton.center = CGPoint(x: view.frame.size.width/2,
y: view.frame.size.height-100)
}
private func checkCameraPermissions(){
switch AVCaptureDevice.authorizationStatus(for: .video) {
case .notDetermined:
AVCaptureDevice.requestAccess(for: .video){ [weak self] granted in
guard granted else{
return
}
DispatchQueue.main.async {
self?.setUpCamera()
}
}
case .restricted:
break
case .denied:
break
case .authorized:
break
@unknown default:
break
}
}
private func setUpCamera(){
let session = AVCaptureSession()
if let device = AVCaptureDevice.default(for: .video) {
do{
let input = try AVCaptureDeviceInput(device: device)
if session.canAddInput(input) {
session.addInput(input)
}
if session.canAddOutput(output) {
session.addOutput(output)
}
previewLayer.videoGravity = .resizeAspectFill
previewLayer.session = session
session.startRunning()
self.session = session
}
catch{
print(error)
}
}
}
@objc private func didTapTakePhoto(){
output.capturePhoto(with: AVCapturePhotoSettings(), delegate: self)
}
}
extension ViewController:AVCapturePhotoCaptureDelegate{
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
guard let data = photo.fileDataRepresentation() else {
return
}
let image = UIImage(data: data)
session?.stopRunning()
let imageView = UIImageView(image: image)
imageView.contentMode = .scaleAspectFill
imageView.frame = view.bounds
view.addSubview(imageView)
}
}
以上是关于swift使用AVFoundation实现自定义相机的主要内容,如果未能解决你的问题,请参考以下文章
swift avfoundation AVCapturePhotoCaptureDelegate 捕获方法
Swift 3:如何在使用 AVFoundation 录制视频期间将麦克风静音/取消静音