我从GitHub上获得了此代码,这是最基本的自定义相机视图控制器。我已经安装了闪光灯,可以同时测试前后摄像头。但是,我将如何实现一个按钮,让您可以在应用程序中切换相机?我创建了一个“按下相机的按钮”操作,将在轻按相机的开关按钮时运行。
class CameraViewController: UIViewController {
@IBOutlet weak var flashButton: UIButton!
@IBOutlet weak var cameraButton: UIButton!
var flashOn = false
@IBOutlet weak var previewView: PreviewView!
let captureSession = AVCaptureSession()
var videoPreviewLayer: AVCaptureVideoPreviewLayer?
let capturePhotoOutput = AVCapturePhotoOutput()
let capturePhotoDelegate = CapturePhotoDelegate()
private var deviceInput: AVCaptureDeviceInput?
private var cameraPosition: CameraPosition = .back
enum CameraPosition {
case front
case back
}
override func viewDidLoad() {
super.viewDidLoad()
checkCameraUsagePermission()
flashButton.setTitle("OFF", for: .normal)
cameraButton.setTitle("BACK", for: .normal)
}
func initialiseCaptureSession() {
let captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .unspecified)
guard let input = try? AVCaptureDeviceInput(device: captureDevice!),
captureSession.canAddInput(input)
else { return }
captureSession.addInput(input)
self.previewView.videoPreviewLayer.session = self.captureSession
self.previewView.videoPreviewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
capturePhotoOutput.isHighResolutionCaptureEnabled = true
captureSession.addOutput(capturePhotoOutput)
captureSession.startRunning()
}
@IBAction func onTapTakePhoto(_ sender: UIButton) {
let photoSettings = AVCapturePhotoSettings()
photoSettings.isAutoStillImageStabilizationEnabled = true
photoSettings.isHighResolutionPhotoEnabled = true
photoSettings.flashMode = .auto
if flashOn == true {
photoSettings.flashMode = .on
} else if flashOn == false {
photoSettings.flashMode = .off
}
capturePhotoOutput.capturePhoto(with: photoSettings, delegate: capturePhotoDelegate)
}
func checkCameraUsagePermission() {
switch AVCaptureDevice.authorizationStatus(for: .video) {
case .authorized:
self.initialiseCaptureSession()
case .notDetermined:
AVCaptureDevice.requestAccess(for: .video) { granted in
if granted {
self.initialiseCaptureSession()
}
}
case .denied:
return
case .restricted:
return
}
}
@IBAction func flashButtonPressed(_ sender: UIButton) {
if flashOn == false {
flashOn = true
flashButton.setTitle("ON", for: .normal)
} else {
flashOn = false
flashButton.setTitle("OFF", for: .normal)
}
}
func addVideoInput(position: AVCaptureDevice.Position) {
guard let device: AVCaptureDevice = AVCaptureDevice.default(.builtInWideAngleCamera,
for: .video, position: position) else { return }
if let currentInput = self.deviceInput {
self.captureSession.removeInput(currentInput)
self.deviceInput = nil
}
do {
let input = try AVCaptureDeviceInput(device: device)
if self.captureSession.canAddInput(input) {
self.captureSession.addInput(input)
self.deviceInput = input
}
} catch {
print(error)
}
}
@IBAction func cameraButtonPressed(_ sender: UIButton) {
switch self.cameraPosition {
case .front:
self.cameraPosition = .back
self.addVideoInput(position: .back)
case .back:
self.cameraPosition = .front
self.addVideoInput(position: .front)
}
//configure your session here
DispatchQueue.main.async {
self.captureSession.beginConfiguration()
if self.captureSession.canAddOutput(self.capturePhotoOutput) {
self.captureSession.addOutput(self.capturePhotoOutput)
}
self.captureSession.commitConfiguration()
}
}
}
答案 0 :(得分:0)
首先,将您的AVCaptureDeviceInput
存储在媒体资源中
private var deviceInput: AVCaptureDeviceInput?
下一个创建枚举,将指示哪个摄像机处于活动状态
enum CameraPosition {
case front
case back
}
和当前相机模式的属性
private var cameraPosition: CameraPosition = .back
现在创建负责摄像头切换的功能
func addVideoInput(position: AVCaptureDevice.Position) {
guard let device: AVCaptureDevice = AVCaptureDevice.default(.builtInWideAngleCamera,
for: .video, position: position) else { return }
if let currentInput = self.deviceInput {
self.captureSession.removeInput(currentInput)
self.deviceInput = nil
}
do {
let input = try AVCaptureDeviceInput(device: device)
if self.captureSession.canAddInput(input) {
self.captureSession.addInput(input)
self.deviceInput = input
}
} catch {
print(error)
}
}
现在,您可以在cameraButtonPressed
方法中切换摄像头
@IBAction func cameraButtonPressed(_ sender: UIButton) {
switch self.cameraPosition {
case .front:
self.cameraPosition = .back
self.addVideoInput(position: .back)
case .back:
self.cameraPosition = .front
self.addVideoInput(position: .front)
}
//configure your session here
DispatchQueue.main.async {
self.captureSession.beginConfiguration()
if self.captureSession.canAddOutput(self.capturePhotoOutput) {
self.captureSession.addOutput(self.capturePhotoOutput)
}
self.captureSession.commitConfiguration()
}
}