从iOS相机捕获图片
我需要通过相机捕捉图像。 但它给出了以下错误: ‘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对象。 必须通过引用传递它。 这就是我克服挑战的方式。 我没有实例化类,我只是将它作为对AVCaptureDeviceInput对象的引用传递给它。
希望这有帮助!
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 } } } }
也许你在此期间解决了它,但是如果你改变你的代码,它应该工作:
只需删除getBackCamera()
中的getBackCamera()
devic = AVCaptureDevice()
getBackCamera()
并在类的头部声明如下: var device, devic : AVCaptureDevice!
class ViewController: UIViewController { var session: AVCaptureSession! var device, devic : 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 as [NSObject : AnyObject] session.addOutput(stillImageOutput) session.startRunning() } func getBackCamera() -> AVCaptureDevice { // 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 }