【发布时间】:2019-12-14 13:04:00
【问题描述】:
我已经快速实现了一个相机应用程序,但是从前置摄像头切换到后置摄像头无法正常工作
这是我实现的代码
import UIKit
import AVFoundation
class ViewController: UIViewController {
@IBOutlet weak var ImageView: UIView!
var captureSession: AVCaptureSession?
var videoPreviewLayer: AVCaptureVideoPreviewLayer?
var backCamera = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .back)
var frontCamera = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .front)
var capturePhotoOut : AVCapturePhotoOutput?
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 10.2, *){
let captureDevice = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .back)
do{
let input = try AVCaptureDeviceInput(device: captureDevice!)
captureSession = AVCaptureSession()
captureSession?.addInput(input)
videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
videoPreviewLayer?.frame = view.layer.bounds
ImageView.layer.addSublayer(videoPreviewLayer!)
captureSession?.startRunning()
}catch{
print("error")
}
}
capturePhotoOut = AVCapturePhotoOutput()
capturePhotoOut?.isHighResolutionCaptureEnabled = true
captureSession?.sessionPreset = .photo
captureSession?.addOutput(capturePhotoOut!)
capturePhotoOut!.isDepthDataDeliveryEnabled = capturePhotoOut!.isDepthDataDeliverySupported
capturePhotoOut!.isPortraitEffectsMatteDeliveryEnabled = capturePhotoOut!.isPortraitEffectsMatteDeliverySupported
}
func switchToFrontCamera(){
if frontCamera?.isConnected == true {
captureSession?.stopRunning()
let captureDevice = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .front)
do{
let input = try AVCaptureDeviceInput(device: captureDevice!)
captureSession = AVCaptureSession()
captureSession?.addInput(input)
videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
videoPreviewLayer?.frame = view.layer.bounds
ImageView.layer.addSublayer(videoPreviewLayer!)
captureSession?.startRunning()
}catch{
print("Error")
}
}else{
print("noFrontCamera")
}
}
func switchToBackCamera(){
if backCamera?.isConnected == true {
captureSession?.stopRunning()
let captureDevice = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .back)
do{
let input = try AVCaptureDeviceInput(device: captureDevice!)
captureSession = AVCaptureSession()
captureSession?.addInput(input)
videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
videoPreviewLayer?.frame = view.layer.bounds
ImageView.layer.addSublayer(videoPreviewLayer!)
captureSession?.startRunning()
}catch{
print("Error")
}
}else{
print("noFrontCamera")
}
}
@IBAction func rotateCamera(_ sender: Any) {
guard let currentCameraInput: AVCaptureInput = captureSession?.inputs.first else {
return
}
if let input = currentCameraInput as? AVCaptureDeviceInput{
if input.device.position == .back {
switchToFrontCamera()
}
if input.device.position == .front{
switchToBackCamera()
}
}
}
}
应用开始工作时找到前置摄像头,但按下旋转按钮时不会切换到后置摄像头
【问题讨论】:
-
你不需要 backCamera 和 frontCamera 作为变量。切换相机时重新加载
AVCaptureVideoPreviewLayer。 -
这个已经回答了:to the post