短视频的录制大概的方式如图简单分成 3个步骤 1 采集数据, 2 滤镜处理, 3 预览和编码。为什么把预览和编码放在3这个顺序,后面会有提到。目前只需了解大概划分这样划分就可以了。
目前要达成 多段视频录制+美颜大概会采用如下几种方式
方案1 采集数据(自己编码) + 滤镜处理(自己写opengl处理) + 预览(自己写opengl) + 编码(硬件编码)。
方案2 采集数据(自己编码) + 滤镜处理(GPUImage框架) + 预览(GPUImage框架) + 编码(硬件编码)。
方案3 采集数据(GPUImage框架) + 滤镜处理(GPUImage框架+自己需要写部分opengl代码) + 预览(GPUImage框架) + 编码(硬件编码)。
方案4 全套采用GPUImge处理,采集+滤镜+预览+编码流程 全部通过GPUImge框架处理,自己只是需要使用GPUImage即可。
方案5 全套第三方SDK或者部分第三方SDK+GPUImge框架。
以上方案中 方案5不在讨论范围。
方案4 适用非常少的部分场景
你们的APP只是需求场景只是类似GPUImge Demo那种。也就是一段视频录到底,中间没有断开多段视频分段录制,而且对整个视频时长没有严格的要求,那么直接全套用GPUImge即可。对开发人员要求最低。不需要懂太多东西。
方案1
适合所有场景。对人员要求高,需要开发人员熟悉ios采集这块和opengl
重点讨论为什么采用方案2和方案3的理由
GPUImge 录制视频流程处理方式上,存在流程上的问题。GPUImge录制视频的流程上,无法精准获取当前已录制视频的信息(比如你要计算当前录了多少视频等)。如果你需要断点续拍等功能GPUImge是无法满足需求的。你坚持采用GPUImge全套来做,那么做出来的东西是有bug的。
采用2或者3方案都可以,但是对开发人员是有一定要求的(不考虑性能的情况下可以无视了不用往下看了)。
这里列一下需要解决的坑
- 解决精准计算录制视频的信息, 可以参考 SCRecorder https://github.com/rFlex/SCRecorder 这个开源库的存储处理每一帧视频方式。
- 解决音视频同步问题
- 解决 GPUImge 对应流程下加入对应代码的时候 还能保证性能的问题。
- 解决 采集数据 + 滤镜处理 + 预览 + 编码 这些流程中 线程的问题
- 开发人员需要懂 opengl当然是越多越好,如果不理解,可能会遇到性能问题,因为在对应流程里面不考虑各种情况,直接乱用 GPUImge 也是会造成性能下降的。具体可以开启Instruments。看是CPU还是GPU影响性能。
*注意内存泄漏
如果是1个人开发整个流程还好,如果是多人合作,特别是APP开发只采集数据部分,然后就丢个其他人去做剩下流程,而其它人,特别是专门做编解码的也不太了解IOS平台环境那种的。很可能会因为线程控制不好,各种加锁, 导致处理每一帧的时候 CPU占用时长过高(楼主见过乱加锁导致每一帧CPU处理近100毫秒),拉低帧率。或者是对opengl不熟悉直接采用全套GPUImge来调试 demo,然后合并代码的时候才发现各种性能问题。以上是各种方案可能出现的坑或者适用场景。