V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LinChiSin
V2EX  ›  iOS

求助 iOS 相机大佬:如何高效低耗获取后置镜头两路不同分辨率的视频流输出?

  •  
  •   LinChiSin · 2020-09-28 11:25:21 +08:00 · 1470 次点击
    这是一个创建于 1544 天前的主题,其中的信息可能已经有所发展或是发生改变。

    据我所知,iOS 13 以前( WWDC 2019 允许同时获取后置两个摄像头),苹果 AVCaptureSession 只允许按一个镜头输出一个指定分辨率的输出流,但现在有需求:

    1 、获取 1080P 的输出流用于渲染,并且需要用 pixelBuffer 的格式,因此最好是需要用到 AVCaptureVideoDataOutputSampleBufferDelegate 中 didOutputSampleBuffer 回调方法。

    2 、获取 480P (最好是 480480,但 640480P 也可以接受)的输出流用于图像处理,同样也需要用 pixelBuffer 的格式

    按照目前的限制,只有一路固定分辨率的视频流,尝试了一下几种方案:

    1 、CoreImage 先压缩再剪裁:对 1080P,30FPS 的视频帧图片按短边进行压缩,再保留中间区域进行裁剪。参考 https://stackoverflow.com/questions/51445776/how-to-scale-resize-cvpixelbufferref-in-objective-c-ios/51527859 。可行,但性能效果差,CPU 性能消耗高。

    2 、OpenCV 先压缩再裁剪:类似第一种方案,只不过是将前端 CoreImage 方案换成了后端 OpenCV 方案。性能依然差

    3 、GPUImage 方案 ( https://github.com/BradLarson/GPUImage ),但暂时调研不深。只知道 GPUImage 是一套完善的滤镜处理方案,据说能利用 GPU 进行图片处理,从而降低 CPU 性能消耗。但目前已知只提供一个 GPUImageCropFilter 裁剪滤镜,没法进行压缩,最大程度保留图片范围。并且,GPUImage 貌似无法提供一个 pixelBuffer 输出接口。

    综上。求教 iOS 相机开发大佬,有没有其他高效低耗的方案,满足我的低功耗获取两路不同分辨率视频流的需求。

    提前跪谢。

    7 条回复    2020-09-28 16:50:27 +08:00
    across
        1
    across  
       2020-09-28 11:33:11 +08:00
    以前做过一次 AR 类型的,原生端是用 OpenGL/Metal,通过 Framebuffer 方式给 Unity 引擎图片的...
    搜了下 GPUImage 也有 GPUImageFramebuffer 类,估计也是类似的流程。
    fffang
        2
    fffang  
       2020-09-28 11:59:57 +08:00
    建议不要通过获取两路不同分辨率视频这条路,就取 1080P 的 pixel 用于渲染。另一方面,将这些 pixel copy 一份,开一个线程,转成指针,再通过遍历采样的方式,转成 480P 的,输出给另外一路。
    LinChiSin
        3
    LinChiSin  
    OP
       2020-09-28 15:28:34 +08:00
    @fffang 感谢回答! 1080P 转 480P 有什么好的方案推荐吗?前面说的几种方案,性能都不太好呀。
    LinChiSin
        4
    LinChiSin  
    OP
       2020-09-28 15:29:11 +08:00
    @across GPUImage 有什么 resize 的接口吗,现在只看到剪裁的接口,没有压缩的接口哎。
    across
        5
    across  
       2020-09-28 15:35:53 +08:00
    @LinChiSin framebuffer 是创建两个缓冲区 AB,直接通过 gpu,将数据从 A 画到 B,中间自己控制。 我之前是自己写 shader 的,gpuimage 不知道怎么封装的。
    sharpy
        6
    sharpy  
       2020-09-28 16:04:08 +08:00
    你可以自己写 FBO,一般来说相机处理都这样嘛,录制的时候就是一路给预览渲染,一路给编码器。
    fffang
        7
    fffang  
       2020-09-28 16:50:27 +08:00
    @LinChiSin 直接写像素啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3004 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:47 · PVG 18:47 · LAX 02:47 · JFK 05:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.