集成自定义摄像头视图AVCaptureDevice
我正在尝试整合自定义摄像头视图,并遵循一些稍微过时的代码。我有一些错误,但我认为已经解决他们吧2.集成自定义摄像头视图AVCaptureDevice
这是迄今为止当前代码:
import Foundation
import AVFoundation
import UIKit
class setupView : UIViewController {
@IBOutlet var cameraView: UIView!
@IBOutlet var nameTextField: UITextField!
var captureSession = AVCaptureSession()
var stillImageOutput = AVCapturePhotoOutput()
var previewLayer = AVCaptureVideoPreviewLayer()
override func viewDidLoad() {
let session = AVCaptureDeviceDiscoverySession.init(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .back)
if let device = session?.devices[0] {
if device.position == AVCaptureDevicePosition.back {
do {
let input = try AVCaptureDeviceInput(device: device)
if captureSession.canAddInput(input){
captureSession.addInput(input)
stillImageOutput.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG]
if captureSession.canAddOutput(stillImageOutput) {
captureSession.addOutput(stillImageOutput)
captureSession.startRunning()
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer.AVLayerVideoGravityResizeAspectFill
previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.portrait
cameraView.layer.addSublayer(previewLayer)
previewLayer.bounds = cameraView.frame
previewLayer.position = CGPoint(x: cameraView.frame.width/2, y:cameraView.frame.height/2)
}
}
} catch {
}
}
}
}
@IBAction func takePhoto(_ sender: Any) {
}
@IBAction func submitAction(_ sender: Any) {
}
}
目前我得到2个错误:
“型AVCapturePhotoOutput的值“不具有成员‘outputSettings’
”的类型‘AVCaptureVideoPreviewLayer’值没有构件 ‘AVLayerVideoGravityResizeAspectFill’
import AVFoundation
import Foundation
@IBOutlet weak var mainimage: UIImageView!
let captureSession = AVCaptureSession()
let stillImageOutput = AVCaptureStillImageOutput()
var previewLayer : AVCaptureVideoPreviewLayer?
var captureDevice : AVCaptureDevice?
override func viewDidLoad() {
super.viewDidLoad()
captureSession.sessionPreset = AVCaptureSessionPresetHigh
if let devices = AVCaptureDevice.devices() as? [AVCaptureDevice] {
// Loop through all the capture devices on this phone
for device in devices {
// Make sure this particular device supports video
if (device.hasMediaType(AVMediaTypeVideo)) {
// Finally check the position and confirm we've got the back camera
if(device.position == AVCaptureDevicePosition.front) {
captureDevice = device
if captureDevice != nil {
print("Capture device found")
beginSession()
}
}
}
}
}
}
func beginSession() {
do {
try captureSession.addInput(AVCaptureDeviceInput(device: captureDevice))
stillImageOutput.outputSettings = [AVVideoCodecKey:AVVideoCodecJPEG]
if captureSession.canAddOutput(stillImageOutput) {
captureSession.addOutput(stillImageOutput)
}
}
catch {
print("error: \(error.localizedDescription)")
}
guard let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) else {
print("no preview layer")
return
}
self.view.layer.addSublayer(previewLayer)
previewLayer.frame = self.view.layer.frame
captureSession.startRunning()
self.view.addSubview(mainimage)
}
此代码工作在我的应用程序
你几乎没有。问题是一些AVFoundation类已被弃用,现在有多种方式拍摄照片。这是你的代码的问题。
“型AVCapturePhotoOutput价值”没有成员“outputSettings”
这是因为实际上AVCapturePhotoOutput
没有定义为outputSettings
任何成员。检查出的AVCapturePhotoOutput
其实outputSettings
全documentation是AVCaptureStillImageOutput
成员,同样是来自iOS的10.0
“价值型 “AVCaptureVideoPreviewLayer弃用” 没有成员 “AVLayerVideoGravityResizeAspectFill”
同样的错误,根据你的代码,AVCaptureVideoPreviewLayer
没有成员。如果你想设置视频预览层的设置如下。
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
像你提到的代码已经过时,其使用已过时AVCaptureStillImageOutput
如果真想用AVCapturePhotoOutput
那么你应该遵循以下步骤。
这些是拍摄照片的步骤。
- 创建一个AVCapturePhotoOutput对象。使用其属性确定支持的捕捉设置并启用某些功能(例如,是否捕捉实时照片)。
- 创建并配置AVCapturePhotoSettings对象,以便为特定捕捉(例如,是否启用图像稳定或闪光灯)选择功能和设置。
- 通过将您的照片设置对象传递给capturePhoto(with:delegate :)方法以及实现AVCapturePhotoCaptureDelegate协议的委托对象来捕获图像。照片捕捉输出然后调用您的委托在捕获过程中通知您重要事件。
有此下面的代码对你clickCapture方法,不要忘了确认,并实现你的类委托。
let settings = AVCapturePhotoSettings()
let previewPixelType = settings.availablePreviewPhotoPixelFormatTypes.first!
let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType,
kCVPixelBufferWidthKey as String: 160,
kCVPixelBufferHeightKey as String: 160,
]
settings.previewPhotoFormat = previewFormat
self.cameraOutput.capturePhoto(with: settings, delegate: self)
,如果你想在不同的方式知道从avfoundation拍摄的照片看看我以前的SO answer
也是苹果文档解释为How to use AVCapturePhotoOutput
错误“类型AVCapturePhotoOutput价值”很清楚没有成员“outputSettings”被删除,如果我恢复到AVCaptureStillImageOutput,但是这已折旧。 –