如何解决尝试拍照会导致运行时错误 没有活动且已启用的视频连接
我在下面的目标 swift 代码是拍照然后对照片进行拼接。现在出现一个运行时错误,下面列出来不知道怎么理解。
//Thread 1: "*** -[AVCapturePhotoOutput capturePhotoWithSettings:delegate:] 没有活动和启用的视频连接"
我不知道在代码中添加什么来修复这个运行时错误。这段代码有 2 个不同的类 ViewController 和 PreviewVC。
import UIKit;import AVFoundation
class ViewController: UIViewController {
var b1 = UIButton()
var caputreSession = AVCaptureSession()
var backCamera : AVCaptureDevice?
var frontCamera : AVCaptureDevice?
var currentCamera: AVCaptureDevice?
var photoOutput : AVCapturePhotoOutput?
var image : UIImage?
var captureSESSION = AVCaptureSession()
var cameraPreviewLayer : AVCaptureVideoPreviewLayer?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
setupCaputerSession()
setUpDevice()
setupinput()
setUpPreivewLayer()
startRunningCaptiureSessions()
[b1].forEach{
$0.translatesAutoresizingMaskIntoConstraints = false
view.addSubview($0)
}
b1.backgroundColor = .orange
b1.frame = CGRect(x: 100,y: 100,width: 100,height: 100)
b1.addTarget(self,action: #selector(takePHoto),for: .touchDown)
cameraPreviewLayer?.frame = CGRect(x: 100,y: 300,width: 200,height: 200)
}
func setupCaputerSession (){
captureSESSION.sessionPreset = AVCaptureSession.Preset.photo
}
func setUpDevice(){
let devicediscoverySession = AVCaptureDevice.discoverySession(deviceTypes:[AVCaptureDevice.DeviceType.builtInWideAngleCamera],mediaType: AVMediaType.video,position: AVCaptureDevice.Position.unspecified)
let devices = devicediscoverySession.devices
for device in devices {
if device.position == AVCaptureDevice.Position.back {
backCamera = device
}
else if device.position == AVCaptureDevice.Position.front {
frontCamera = device
}
}
currentCamera = backCamera
}
func setupinput(){
do {
let captureDeviceInput = try AVCaptureDeviceInput(device: currentCamera!)
caputreSession.addInput(captureDeviceInput)
photoOutput = AVCapturePhotoOutput()
photoOutput?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey : AVVideoCodecType.jpeg])],completionHandler: nil)
captureSESSION.addOutput(photoOutput!)
}
catch{
print(error)
}
}
func setUpPreivewLayer(){
cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: caputreSession)
cameraPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
cameraPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
cameraPreviewLayer?.frame = self.view.frame
self.view.layer.insertSublayer(cameraPreviewLayer!,at: 0)
}
func startRunningCaptiureSessions(){
caputreSession.startRunning()
}
@objc func takePHoto(){
let settings = AVCapturePhotoSettings()
photoOutput?.capturePhoto(with: settings,delegate: self)
let vc = previewVC()
vc.modalPresentationStyle = .overCurrentContext // actually .fullScreen would be better
self.present(vc,animated: true)
vc.image = self.image
}
}
extension ViewController : AVCapturePhotoCaptureDelegate {
func photoOutput(_ output: AVCapturePhotoOutput,didFinishProcessingPhoto photo: AVCapturePhoto,error: Error?) {
if let imageData = photo.fileDataRepresentation(){
image = UIImage(data: imageData)
}
}
}
class previewVC: UIViewController {
var displayPic = UIImageView()
var image : UIImage!
var backBtn = UIButton()
override func viewDidLoad() {
super.viewDidLoad()
[displayPic,backBtn].forEach{
$0.translatesAutoresizingMaskIntoConstraints = false
view.addSubview($0)
}
displayPic.backgroundColor = .red
backBtn.backgroundColor = .systemteal
displayPic.frame = CGRect(x: 100,y: 200,height: 100)
backBtn.frame = CGRect(x: 0,width: 10,height: 10)
backBtn.addTarget(self,action: #selector(returnBack),for: .touchDown)
}
@objc func returnBack(){
let vc = previewVC()
vc.modalPresentationStyle = .overCurrentContext // actually .fullScreen would be better
self.present(vc,animated: true)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。