我想使用AVCaptureSession
捕获高分辨率静止图像。因此AVCaptureSession
预设设置为 Photo
。
到目前为止,这运作良好。在iPhone 4上,最终静止图像分辨率为最大2448x3264像素,预览(视频)分辨率为852x640像素。
现在,由于分析预览帧以检测场景中的对象,因此我想降低其分辨率。如何做到这一点?我尝试将宽度/高度较低的AVVideoSettings
设置为 AVCaptureVideoDataOutput
,但这会导致以下错误消息:
AVCaptureVideoDataOutput setVideoSettings:] - videoSettings dictionary contains one or more unsupported (ignored) keys: (AVVideoHeightKey, AVVideoWidthKey
因此,这似乎不是配置AVCaptureVideoDataOutput
/AVCaptureVideoDataOutputSampleBufferDelegate
接收的预览帧大小的正确方法。您知道如何配置预览帧的分辨率吗?
欢迎任何建议,谢谢。
如果要手动指定设置,则需要在AVCaptureDevice
上设置activeFormat
。这将隐式将会话预设设置为 AVCaptureSessionPresetInputPriority
。
activeFormat
需要AVCaptureDeviceFormat
但您只能从AVCaptureDevice.formats
列表中获取一个。您需要浏览列表并找到适合您需求的列表。具体来说,检查highResolutionStillImageDimensions
是否足够高以进行所需的静止图像捕获,并且formatDescription
(需要使用CMFormatDescription*
功能进行检查,例如CMVideoFormatDescriptionGetDimensions
)是否与所需的预览设置相匹配。
仅供记录:我最终在瞄准相机时以预设Low
配置AVCaptureSession
。一旦触发快门,应用程序就会切换到预设Photo
,执行对焦运行并拍照。这样,拍照需要 1 到 2.5 秒,这不是很好,但它至少是一种解决方法。
要降低AVCaptureVideoDataOutput
输出的大小,您可以将比特率设置为较低,从而产生较小的样本量。
AVCaptureVideoDataOutput
常用的密钥包括:
AVVideoAverageBitRateKey
AVVideoProfileLevelKey
AVVideoExpectedSourceFrameRateKey
AVVideoMaxKeyFrameIntervalKey
例如:
private static let videoCompressionOptionsMedium = [AVVideoAverageBitRateKey : 1750000,
AVVideoProfileLevelKey : AVVideoProfileLevelH264BaselineAutoLevel,
AVVideoExpectedSourceFrameRateKey : Int(30),
AVVideoMaxKeyFrameIntervalKey : Int(30)]