【发布时间】:2018-12-17 19:20:39
【问题描述】:
我正在制作实时相机滤镜应用。
我使用AVCaptureVideoDataOutput 将samplebuffer 传递给MTKView 用于渲染预览,AVCapturePhotoOutput 用于捕获照片。
我的应用有一些用于拍摄照片的纵横比选项。 (包括16:9和4:3)
尽管用户选择了 4:3 选项,但我想做的是以全屏尺寸(即 16:9,但更接近此尺寸的任何东西也可以)进行预览。
我打算在预览中显示边框线,以便用户可以确定照片输出大小。
我需要 16:9 预设选项,例如 1280*720 用于预览和照片预设选项以拍摄照片。
我想出了几个主意。
拥有两个具有不同预设的
AVCaptureSessions--> 不利于性能使用 1280*720 预设拍摄并将照片输出裁剪为 4:3 纵横比 --> 低分辨率照片
在调用
photoOutput.capturePhoto方法之前切换预设。 --> 预览立即冻结,因为AVCaptureSession必须更新
我决定选择 3,但它给了我一个错误。
(如果有更好的方法,请告诉我)
这是我的代码。
@IBAction func takePhoto(_ sender: UIButton) {
captureSessionQueue.async {
var photoSettings = AVCapturePhotoSettings()
photoSettings.isHighResolutionPhotoEnabled = true
// switch preset from .hd1280*720 to .photo
self.session.beginConfiguration()
if self.session.canSetSessionPreset(.photo) {
self.session.sessionPreset = .photo
}
self.session.commitConfiguration()
self.photoOutput.capturePhoto(with: photoSettings, delegate: self)
self.session.beginConfiguration()
self.session.sessionPreset = .hd1280*720
self.session.commitConfiguration()
}
}
错误是,
Error Domain=AVFoundationErrorDomain Code=-11800 "该操作可能 未完成” UserInfo={NSLocalizedFailureReason=未知错误 发生 (-16800), NSLocalizedDescription=操作不能 完成,NSUnderlyingError=0x280013720 {错误 Domain=NSOSStatusErrorDomain Code=-16800 "(null)"}}
我认为这是因为我在会话完成更新到新预设之前调用了capturePhoto 方法。
当我在commitConfiguration() 之后 1 或 2 秒调用 self.photoOutput.capturePhoto 方法时,它会起作用。
那么,有什么方法可以让我知道AVCaptureSession 更新的完成情况,还是有更好的解决方案来处理视频数据输出和照片输出之间的不同纵横比?
【问题讨论】:
标签: swift avfoundation avcapturesession