本文介绍了在iOS10中使用AVCapturePhotoOutput-NSGenericException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我目前正在尝试弄清楚如何使用iOS 10的AVCapturePhotoOutput方法,但遇到了麻烦.我觉得自己即将做好,但继续收到错误消息:
I am currently trying to figure out how to use iOS 10's AVCapturePhotoOutput method and am having trouble doing so. I feel like I am about to get it right but continue receiving an error:
我试图将这行代码放入AVCapturePhotoCaptureDelegate或我的didPressTakePhoto函数中:
I have tried to put this line of code in either the AVCapturePhotoCaptureDelegate or my didPressTakePhoto function:
if let videoConnection = stillImageOutput.connection(withMediaType: AVMediaTypeVideo) {
videoConnection.videoOrientation = AVCaptureVideoOrientation.portrait;
...
}
这是我到目前为止的代码:
Here is the code I have so far:
import AVFoundation
import UIKit
class Camera: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, AVCapturePhotoCaptureDelegate {
@IBOutlet weak var cameraView: UIView!
@IBOutlet weak var imageView: UIImageView!
var captureSession : AVCaptureSession?
var stillImageOutput : AVCapturePhotoOutput?
var stillImageOutputSettings : AVCapturePhotoSettings?
var previewLayer : AVCaptureVideoPreviewLayer?
var didTakePhoto = Bool();
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated);
previewLayer?.frame = cameraView.bounds;
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated);
captureSession = AVCaptureSession();
captureSession?.sessionPreset = AVCaptureSessionPreset1920x1080;
stillImageOutput = AVCapturePhotoOutput();
let backCamera = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo);
do {
let input = try AVCaptureDeviceInput(device: backCamera)
if (captureSession?.canAddInput(input))! {
captureSession?.addInput(input);
if (captureSession?.canAddOutput(stillImageOutput))! {
captureSession?.canAddOutput(stillImageOutput);
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession);
previewLayer?.videoGravity = AVLayerVideoGravityResizeAspect;
previewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait;
cameraView.layer.addSublayer(previewLayer!);
captureSession?.startRunning();
}
}
} catch {
print(error);
}
}
func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) {
if let error = error {
print(error.localizedDescription);
}
if let sampleBuffer = photoSampleBuffer, let previewBuffer = previewPhotoSampleBuffer, let dataImage = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: sampleBuffer, previewPhotoSampleBuffer: previewBuffer) {
print(UIImage(data: dataImage)?.size as Any);
let dataProvider = CGDataProvider(data: dataImage as CFData);
let cgImageRef: CGImage! = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent);
let image = UIImage(cgImage: cgImageRef, scale: 1.0, orientation: UIImageOrientation.right);
self.imageView.image = image;
self.imageView.isHidden = false;
}
}
func didPressTakePhoto() {
stillImageOutputSettings = AVCapturePhotoSettings();
let previewPixelType = stillImageOutputSettings?.availablePreviewPhotoPixelFormatTypes.first!;
let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType,
kCVPixelBufferWidthKey as String: 160,
kCVPixelBufferHeightKey as String: 160];
stillImageOutputSettings?.previewPhotoFormat = previewFormat;
stillImageOutput.capturePhoto(with: stillImageOutputSettings!, delegate: self);
}
func didPressTakeAnother() {
if (didTakePhoto == true) {
imageView.isHidden = true;
didTakePhoto = false;
} else {
captureSession?.startRunning();
didTakePhoto = true;
didPressTakePhoto();
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
didPressTakeAnother();
}
}
有什么建议吗?
提前谢谢!
推荐答案
代码错误.
应该是哪个
if (captureSession?.canAddOutput(stillImageOutput))!{
captureSession?.addOutput(stillImageOutput)
}
这篇关于在iOS10中使用AVCapturePhotoOutput-NSGenericException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!