据我所知,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 相机开发大佬,有没有其他高效低耗的方案,满足我的低功耗获取两路不同分辨率视频流的需求。
提前跪谢。
1
across 2020-09-28 11:33:11 +08:00
以前做过一次 AR 类型的,原生端是用 OpenGL/Metal,通过 Framebuffer 方式给 Unity 引擎图片的...
搜了下 GPUImage 也有 GPUImageFramebuffer 类,估计也是类似的流程。 |
2
fffang 2020-09-28 11:59:57 +08:00
建议不要通过获取两路不同分辨率视频这条路,就取 1080P 的 pixel 用于渲染。另一方面,将这些 pixel copy 一份,开一个线程,转成指针,再通过遍历采样的方式,转成 480P 的,输出给另外一路。
|
5
across 2020-09-28 15:35:53 +08:00
@LinChiSin framebuffer 是创建两个缓冲区 AB,直接通过 gpu,将数据从 A 画到 B,中间自己控制。 我之前是自己写 shader 的,gpuimage 不知道怎么封装的。
|
6
sharpy 2020-09-28 16:04:08 +08:00
你可以自己写 FBO,一般来说相机处理都这样嘛,录制的时候就是一路给预览渲染,一路给编码器。
|