我需要用相机拍一张照片。但它给出了以下错误:“NSInvalidArgumentException”,原因:“无法直接实例化AVCaptureDevice。”
遵循代码:
var session: AVCaptureSession!
var device: AVCaptureDevice!
var captureVideoPreviewLayer: AVCaptureVideoPreviewLayer!
var image: UIImage!
var input: AVCaptureDeviceInput!
var stillImageOutput: AVCaptureStillImageOutput!
var viewControllerScheduling: RentalSchedulingViewController!
override func viewDidLoad() {
super.viewDidLoad()
session = AVCaptureSession()
session.sessionPreset = AVCaptureSessionPresetPhoto;
captureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: session)
captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
captureVideoPreviewLayer.frame = self.view.frame
self.view.layer.addSublayer(captureVideoPreviewLayer)
var error = NSErrorPointer()
captureVideoPreviewLayer.session.beginConfiguration()
input = AVCaptureDeviceInput(device: self.getBackCamera(), error: error)
session.addInput(input)
captureVideoPreviewLayer.session.commitConfiguration()
stillImageOutput = AVCaptureStillImageOutput()
var outputSettings = NSDictionary(objectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey)
stillImageOutput.outputSettings = outputSettings
session.addOutput(stillImageOutput)
session.startRunning()
}
取回摄像机:
func getBackCamera() -> AVCaptureDevice {
var devic = AVCaptureDevice()
let devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) as NSArray
for dev in devices {
devic = dev as AVCaptureDevice
if devic.position == AVCaptureDevicePosition.Back {
return devic
}
}
return devic
}
要捕获图像的事件:
@IBAction func capture(sender: AnyObject) {
var videoConnection = AVCaptureConnection()
for con in stillImageOutput.connections {
let connection = con as AVCaptureConnection
for p in connection.inputPorts {
let port = p as AVCaptureInputPort
if port.mediaType == AVMediaTypeVideo {
videoConnection = connection
break;
}
}
}
stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) {
(imageSampleBuffer, error) in
if imageSampleBuffer != nil {
let imageData = AVCaptureStillImageOutput .jpegStillImageNSDataRepresentation(imageSampleBuffer)
self.processImage(UIImage(data: imageData)!)
}
}
}
处理图像:
func processImage(image: UIImage) {
UIGraphicsBeginImageContext(CGSizeMake(320, 426));
image.drawInRect(CGRectMake(0, 0, 320, 426))
let smallImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext();
let cropRect = CGRectMake(0, 55, 320, 320)
let imageRef = CGImageCreateWithImageInRect(smallImage.CGImage, cropRect)
self.image = UIImage(CGImage: imageRef)
}
错误就发生在这里:
input = AVCaptureDeviceInput(device: self.getBackCamera(), error: error)
最佳答案
我一直在查这个问题。似乎无法实际实例化设备AVCaptureDevice对象。必须通过引用传递。这就是我如何克服挑战的。
我没有实例化类,我只是将其作为对avCaptureDeviceImput对象的引用传入。
希望这有帮助!
var captureDevice : AVCaptureDevice?
let devices = AVCaptureDevice.devices()
// 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.Back) {
captureDevice = device as? AVCaptureDevice
}
}
}
}
关于ios - 从iOS相机捕获图片,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26910358/