【问题标题】:AVFoundation: Get CMSampleBuffer from Preview View (while recording at the same time)AVFoundation:从预览视图中获取 CMSampleBuffer(同时录制)
【发布时间】:2021-05-07 13:10:48
【问题描述】:

我正在尝试创建具有以下功能的相机捕获会话:

  1. 预览
  2. 照片拍摄
  3. 视频捕捉
  4. 实时帧处理 (AI)

虽然前两件事不是问题,但我还没有找到单独制作后两件事的方法。

目前,我使用单个AVCaptureVideoDataOutput 并首先运行视频录制,然后在同一个函数中在同一个队列中进行帧处理。 (见代码herehere

唯一的问题是视频捕获捕获 4k 视频,我真的不希望帧处理器接收 4k 缓冲区,因为这会非常慢并阻止视频录制(丢帧)。

理想情况下,我想创建一个 AVCaptureDataOutput 用于 4k 视频录制,另一个接收较低(预览?)分辨率的帧 - 但您不能在同一捕获会话中使用两个 AVCaptureDataOutputs。

我想也许我可以“挂钩”预览层以从那里接收 CMSampleBuffers,就像 captureOutput(...) 函数一样,因为它们是预览大小的分辨率,有谁知道这是否可能?

【问题讨论】:

    标签: ios swift objective-c avfoundation


    【解决方案1】:

    对于这样的事情,我建议实现自定义渲染器流程。 你只需要一个 AVCaptureDataOutput,无需 iOS 提供的系统 PreviewLayer。

    • 将配色方案设置为 YUV(比 BGRA 更紧凑)
    • 在 AVCaptureDataOutput 中获取 CMSampleBuffer
    • 将 CMSampleBuffer 发送到金属纹理。
    • 在 Metal 中创建调整大小的低分辨率纹理
    • 高分辨率纹理发送到渲染器在 MTKLView 中绘制它
    • 低分辨率纹理发送到 CVPixelBuffer,然后您可以将其转换为 CGImage、CGImage、Data。
    • 将低分辨率图像发送到神经网络

    我在 Medium 上有文章:link。您可以将其用作示例。

    【讨论】:

    • 这是一个聪明的想法,但与 PreviewLayer 现在的工作方式相比,引入了额外的延迟(通过调整缓冲区大小等) - 我想我将无法运行 60 、120 甚至 240 FPS 视频录制,你不觉得吗?
    • PreviewLayer 工作正常,但如果您想自定义处理,应用程序应该将图像从相机到 GPU 预处理 2 次。方法修复自定义呈现它既困难又昂贵,但它为您提供了更多智能优化方法。
    猜你喜欢
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    相关资源
    最近更新 更多