【发布时间】:2017-04-28 12:45:53
【问题描述】:
我正在使用 swift 3 和 xcode 创建我的自定义相机视图。
我已经让它工作了,但我面临一个小问题。要从前/后切换摄像头设备,我会停止会话,从视图中删除视频预览层,然后创建一个新会话并从前置摄像头添加一个新的视频预览层。这使得新相机突然出现。我想要相机设备之间的平滑过渡。我该怎么做?
这是我加载相机的代码:
func loadCamera()
{
session?.stopRunning()
videoPreviewLayer?.removeFromSuperlayer()
session = AVCaptureSession()
session!.sessionPreset = AVCaptureSessionPresetPhoto
var backCamera = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .front)
if cameraPos == "back"
{
backCamera = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .back)
}
var error: NSError?
var input: AVCaptureDeviceInput!
do {
input = try AVCaptureDeviceInput(device: backCamera)
} catch let error1 as NSError {
error = error1
input = nil
print(error!.localizedDescription)
}
if error == nil && session!.canAddInput(input) {
session!.addInput(input)
stillImageOutput = AVCapturePhotoOutput()
if session!.canAddOutput(stillImageOutput) {
session!.addOutput(stillImageOutput)
videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session)
videoPreviewLayer?.frame = cameraView.bounds
videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
videoPreviewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait
cameraView.layer.addSublayer(videoPreviewLayer!)
session!.startRunning()
}
}
}
我从 viewWillAppear 中调用它
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
loadCamera()
}
当用户点击更改相机时,我会调用加载相机
@IBAction func changeCamera(_ sender: UIButton) {
if cameraPos == "back"
{cameraPos = "front"}
else
{cameraPos = "back"}
loadCamera()
}
【问题讨论】:
标签: ios swift xcode swift3 avfoundation