【问题标题】:How to configure AVCaptureSession for high res still images and low res (video) preview?如何为高分辨率静止图像和低分辨率(视频)预览配置 AVCaptureSession?
【发布时间】:2016-06-26 13:38:04
【问题描述】:

我想使用AVCaptureSession 捕捉高分辨率静止图像。因此AVCaptureSession预设设置为Photo

到目前为止,这运行良好。在 iPhone 4 上,最终静止图像的最大分辨率为 2448x3264 像素,预览(视频)分辨率为 852x640 像素。

现在,由于会分析预览帧以检测场景中的对象,因此我想降低它们的分辨率。如何才能做到这一点? 我尝试将宽度/高度较低的AVVideoSettings 设置为AVCaptureVideoDataOutput,但这会导致以下错误消息:

AVCaptureVideoDataOutput setVideoSettings:] - videoSettings dictionary contains one or more unsupported (ignored) keys: (AVVideoHeightKey, AVVideoWidthKey

因此,这似乎不是配置AVCaptureVideoDataOutput / AVCaptureVideoDataOutputSampleBufferDelegate 接收的预览帧大小的正确方法。您知道如何配置预览帧的分辨率吗?

欢迎任何建议, 谢谢。

【问题讨论】:

  • 您可以从缓冲区获取图像并将图像大小调整到不会影响检测对象的程度。
  • 感谢您的提示。我已经尝试过了,但是将原始数据转换为 CV 库(处理场景中的对象检测的库)支持的格式的性能也相当 CPU/内存密集。所以我首选的方法是告诉 iOS 减少预览帧的数据。

标签: ios camera avfoundation avcapturesession


【解决方案1】:

如果要手动指定设置,则需要在AVCaptureDevice 上设置activeFormat。这将隐式设置会话预设为AVCaptureSessionPresetInputPriority

activeFormat 采用 AVCaptureDeviceFormat,但您只能从 AVCaptureDevice.formats 列表中选择一个。您需要浏览列表并找到适合您需求的列表。具体来说,检查highResolutionStillImageDimensions 是否足够高以进行所需的静态捕获,并且formatDescription(需要使用CMFormatDescription* 函数检查,例如CMVideoFormatDescriptionGetDimensions)与您所需的预览设置相匹配。

【讨论】:

  • 感谢您的建议。似乎高分辨率静止图像比视频预览略大。以下是一些支持的最低视频分辨率及其“高”静止图像分辨率:视频:192x144 - 静止图像:192x192,视频:352x288 - 静止图像:352x352,视频:480x360 - 静止图像:480x480。看起来这种方式行不通。还有其他想法吗?
【解决方案2】:

仅作记录:我最终在瞄准相机时在预设Low 中配置了AVCaptureSession。触发快门后,应用程序切换到预设Photo,执行对焦运行并拍照。这样拍照需要 1 到 2.5 秒,虽然不是很好,但至少是一种解决方法。

【讨论】:

    【解决方案3】:

    要降低AVCaptureVideoDataOutput 的输出大小,您可以将比特率设置为较低,从而产生较小的样本大小。

    AVCaptureVideoDataOutput 的常用键是:

    AVVideoAverageBitRateKey
    AVVideoProfileLevelKey
    AVVideoExpectedSourceFrameRateKey
    AVVideoMaxKeyFrameIntervalKey
    

    例如:

    private static let videoCompressionOptionsMedium = [AVVideoAverageBitRateKey : 1750000,
                                                        AVVideoProfileLevelKey : AVVideoProfileLevelH264BaselineAutoLevel,
                                                        AVVideoExpectedSourceFrameRateKey : Int(30),
                                                        AVVideoMaxKeyFrameIntervalKey : Int(30)]
    

    【讨论】:

    • 您确定这些设置会影响预览帧的分辨率吗?
    • 不,但分辨率不会像比特率那样影响输出大小..我认为这是您的问题,因为您似乎只想降低分辨率以减小大小。
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    相关资源
    最近更新 更多