CapturePhoto 不工作 swift 3
CapturePhoto is not working swift 3
我正在尝试构建相机应用程序。由于我是 iOS 的新手,我阅读了文档、观看了教程并编写了以下代码:
import UIKit
import AVFoundation
class StartVC: UIViewController {
var connection: AVCaptureConnection!
var output: AVCapturePhotoOutput!
var videoPreviewLayer: AVCaptureVideoPreviewLayer!
@IBOutlet var videoPreviewView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
self.createCamera()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.videoPreviewLayer.bounds = self.videoPreviewView.bounds
self.videoPreviewLayer.position = CGPoint(x: self.videoPreviewView.bounds.midX, y: self.videoPreviewView.bounds.midY)
}
func createCamera() {
let captureSession = AVCaptureSession()
if captureSession.canSetSessionPreset(AVCaptureSessionPresetHigh) {
captureSession.sessionPreset = AVCaptureSessionPresetHigh
} else {
print("Error: Couldn't set preset = \(AVCaptureSessionPresetHigh)")
return
}
let cameraDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
var error: NSError?
let inputDevice = try! AVCaptureDeviceInput.init(device: cameraDevice)
//let inputDevice = AVCaptureDeviceInput.withDevice(cameraDevice) as AVCaptureDeviceInput
if let error = error {
print("Error: \(error)")
return
}
if captureSession.canAddInput(inputDevice) {
captureSession.addInput(inputDevice)
} else {
print("Error: Couldn't add input device")
return
}
let imageOutput = AVCapturePhotoOutput()
if captureSession.canAddOutput(imageOutput) {
captureSession.addOutput(imageOutput)
} else {
print("Error: Couldn't add output")
return
}
// Store imageOutput. We will need it to take photo
self.output = imageOutput
let connection = imageOutput.connections.first as! AVCaptureConnection!
// Store this connection in property. We will need it when we take image.
self.connection = connection
connection?.videoOrientation = AVCaptureVideoOrientation.portrait
captureSession.startRunning()
// This will preview the camera
let videoLayer = AVCaptureVideoPreviewLayer(session: captureSession)
videoLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
videoLayer?.contentsScale = UIScreen.main.scale
self.videoPreviewView.layer.addSublayer(videoLayer!)
// Store this layer instance in property. We will place it into a view
self.videoPreviewLayer = videoLayer
}
@IBAction func CaptureButton(_ sender: UIButton) {
let captureSettings = AVCapturePhotoSettings()
let previewPixelType = captureSettings.availablePreviewPhotoPixelFormatTypes.first!
let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType,
kCVPixelBufferWidthKey as String: 300,
kCVPixelBufferHeightKey as String: 300,
]
captureSettings.previewPhotoFormat = previewFormat
self.output.capturePhoto(with: captureSettings, delegate: self as! AVCapturePhotoCaptureDelegate)
}
}
但是我在这部分遇到了错误。
@IBAction func CaptureButton(_ sender: UIButton) {
let captureSettings = AVCapturePhotoSettings()
let previewPixelType = captureSettings.availablePreviewPhotoPixelFormatTypes.first!
let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType,
kCVPixelBufferWidthKey as String: 300,
kCVPixelBufferHeightKey as String: 300,
]
captureSettings.previewPhotoFormat = previewFormat
// For this line
self.output.capturePhoto(with: captureSettings, delegate: self as! AVCapturePhotoCaptureDelegate)
}
错误是说它无法将 myViewController 的值转换为 AVCapturePhotoCaptureDelegate
我该如何解决这个问题?
此错误是因为您没有确认 AVCapturePhotoCaptureDelegate 到您编写此代码的 viewController。
要解决此错误,请在您的 class 声明中添加 'AVCapturePhotoCaptureDelegate',如下所示:
class myViewController: UIViewController,AVCapturePhotoCaptureDelegate{
}
试试这个
class StartVC: UIViewController {
}
extension StartVC: AVCapturePhotoCaptureDelegate{
}
无需铸造
self.output.capturePhoto(with: captureSettings, delegate: self)
也可以写成
class StartVC: UIViewController,AVCapturePhotoCaptureDelegate {
}
尝试在 info.plist 中添加 "Privacy - Camera Usage Description" 键。如果您使用 iOS 10+.
从我们的应用程序访问相机需要此密钥。
我正在尝试构建相机应用程序。由于我是 iOS 的新手,我阅读了文档、观看了教程并编写了以下代码:
import UIKit
import AVFoundation
class StartVC: UIViewController {
var connection: AVCaptureConnection!
var output: AVCapturePhotoOutput!
var videoPreviewLayer: AVCaptureVideoPreviewLayer!
@IBOutlet var videoPreviewView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
self.createCamera()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.videoPreviewLayer.bounds = self.videoPreviewView.bounds
self.videoPreviewLayer.position = CGPoint(x: self.videoPreviewView.bounds.midX, y: self.videoPreviewView.bounds.midY)
}
func createCamera() {
let captureSession = AVCaptureSession()
if captureSession.canSetSessionPreset(AVCaptureSessionPresetHigh) {
captureSession.sessionPreset = AVCaptureSessionPresetHigh
} else {
print("Error: Couldn't set preset = \(AVCaptureSessionPresetHigh)")
return
}
let cameraDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
var error: NSError?
let inputDevice = try! AVCaptureDeviceInput.init(device: cameraDevice)
//let inputDevice = AVCaptureDeviceInput.withDevice(cameraDevice) as AVCaptureDeviceInput
if let error = error {
print("Error: \(error)")
return
}
if captureSession.canAddInput(inputDevice) {
captureSession.addInput(inputDevice)
} else {
print("Error: Couldn't add input device")
return
}
let imageOutput = AVCapturePhotoOutput()
if captureSession.canAddOutput(imageOutput) {
captureSession.addOutput(imageOutput)
} else {
print("Error: Couldn't add output")
return
}
// Store imageOutput. We will need it to take photo
self.output = imageOutput
let connection = imageOutput.connections.first as! AVCaptureConnection!
// Store this connection in property. We will need it when we take image.
self.connection = connection
connection?.videoOrientation = AVCaptureVideoOrientation.portrait
captureSession.startRunning()
// This will preview the camera
let videoLayer = AVCaptureVideoPreviewLayer(session: captureSession)
videoLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
videoLayer?.contentsScale = UIScreen.main.scale
self.videoPreviewView.layer.addSublayer(videoLayer!)
// Store this layer instance in property. We will place it into a view
self.videoPreviewLayer = videoLayer
}
@IBAction func CaptureButton(_ sender: UIButton) {
let captureSettings = AVCapturePhotoSettings()
let previewPixelType = captureSettings.availablePreviewPhotoPixelFormatTypes.first!
let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType,
kCVPixelBufferWidthKey as String: 300,
kCVPixelBufferHeightKey as String: 300,
]
captureSettings.previewPhotoFormat = previewFormat
self.output.capturePhoto(with: captureSettings, delegate: self as! AVCapturePhotoCaptureDelegate)
}
}
但是我在这部分遇到了错误。
@IBAction func CaptureButton(_ sender: UIButton) {
let captureSettings = AVCapturePhotoSettings()
let previewPixelType = captureSettings.availablePreviewPhotoPixelFormatTypes.first!
let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType,
kCVPixelBufferWidthKey as String: 300,
kCVPixelBufferHeightKey as String: 300,
]
captureSettings.previewPhotoFormat = previewFormat
// For this line
self.output.capturePhoto(with: captureSettings, delegate: self as! AVCapturePhotoCaptureDelegate)
}
错误是说它无法将 myViewController 的值转换为 AVCapturePhotoCaptureDelegate
我该如何解决这个问题?
此错误是因为您没有确认 AVCapturePhotoCaptureDelegate 到您编写此代码的 viewController。
要解决此错误,请在您的 class 声明中添加 'AVCapturePhotoCaptureDelegate',如下所示:
class myViewController: UIViewController,AVCapturePhotoCaptureDelegate{
}
试试这个
class StartVC: UIViewController {
}
extension StartVC: AVCapturePhotoCaptureDelegate{
}
无需铸造
self.output.capturePhoto(with: captureSettings, delegate: self)
也可以写成
class StartVC: UIViewController,AVCapturePhotoCaptureDelegate {
}
尝试在 info.plist 中添加 "Privacy - Camera Usage Description" 键。如果您使用 iOS 10+.
从我们的应用程序访问相机需要此密钥。