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

2020-09-28 11:25:21 +08:00
 LinChiSin

据我所知,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 相机开发大佬,有没有其他高效低耗的方案,满足我的低功耗获取两路不同分辨率视频流的需求。

提前跪谢。

1438 次点击
所在节点    iOS
7 条回复
across
2020-09-28 11:33:11 +08:00
以前做过一次 AR 类型的,原生端是用 OpenGL/Metal,通过 Framebuffer 方式给 Unity 引擎图片的...
搜了下 GPUImage 也有 GPUImageFramebuffer 类,估计也是类似的流程。
fffang
2020-09-28 11:59:57 +08:00
建议不要通过获取两路不同分辨率视频这条路,就取 1080P 的 pixel 用于渲染。另一方面,将这些 pixel copy 一份,开一个线程,转成指针,再通过遍历采样的方式,转成 480P 的,输出给另外一路。
LinChiSin
2020-09-28 15:28:34 +08:00
@fffang 感谢回答! 1080P 转 480P 有什么好的方案推荐吗?前面说的几种方案,性能都不太好呀。
LinChiSin
2020-09-28 15:29:11 +08:00
@across GPUImage 有什么 resize 的接口吗,现在只看到剪裁的接口,没有压缩的接口哎。
across
2020-09-28 15:35:53 +08:00
@LinChiSin framebuffer 是创建两个缓冲区 AB,直接通过 gpu,将数据从 A 画到 B,中间自己控制。 我之前是自己写 shader 的,gpuimage 不知道怎么封装的。
sharpy
2020-09-28 16:04:08 +08:00
你可以自己写 FBO,一般来说相机处理都这样嘛,录制的时候就是一路给预览渲染,一路给编码器。
fffang
2020-09-28 16:50:27 +08:00
@LinChiSin 直接写像素啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/711191

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX