我正在制作实时相机滤镜应用程序。
我使用AVCaptureVideoDataOutput
将样本缓冲区传递到MTKView
以进行预览,并使用AVCapturePhotoOutput
传递照片。
我的应用程序具有一些用于捕获照片的长宽比选项。 (包括16:9和4:3)
我想做的是使预览全屏显示(即16:9,但也可以这样做),尽管用户选择了4:3选项。
我正计划在预览中显示边框线,以便用户可以确定照片的输出尺寸。
我需要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代码= -11800“该操作可能 未完成” UserInfo = {NSLocalizedFailureReason =未知错误 发生(-16800),NSLocalizedDescription =无法执行该操作 已完成,NSUnderlyingError = 0x280013720 {Error Domain = NSOSStatusErrorDomain Code = -16800“(null)”}}
我认为这是因为我在会话完成对新预设的更新之前调用了capturePhoto
方法。
当我在self.photoOutput.capturePhoto
之后1或2秒钟调用commitConfiguration()
方法时,它会起作用。
那么,有什么办法可以使我了解AVCaptureSession
更新的完成,还是有更好的解决方案来处理视频数据输出和照片输出之间的不同宽高比?
答案 0 :(得分:1)
为视频和照片输出不同宽高比的最佳方法是在AVCapturePhotoCaptureDelegate委托中处理照片图像数据。您可以执行以下操作。在didFinishProcessingPhoto函数中,您可以裁剪图像并从中创建jpeg数据。您还需要将照片元数据复制到此jpeg数据中。然后,在didFinishCaptureFor函数中,您可以将该数据保存到照片库中。
$areaFolder = (int)\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
\TYPO3\CMS\Core\Configuration\ExtensionConfiguration::class)
->get('xref', 'areaFolder');
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::makeCategorizable(
'xref',
'tx_xref_domain_model_project',
'areas',
array(
'label' => 'Areas',
'exclude' => FALSE,
'fieldConfiguration' => array(
'foreign_table_where' => ' AND sys_category.pid = ' . (string) $areaFolder,
)
)
);
我已经让您填写savePhotoData()函数。