这个公众号会路线图 式的遍历分享音视频技术:音视频基础(完成) → 音视频工具(完成) → 音视频工程示例(完成) → 音视频工业实战(进行中)。
视频录制阶段除了开始采集音视频数据,做滤镜、美颜、特效等前处理,还会做音视频编码、封装、文件存储。在这个阶段我们主要关注以下性能指标:
- 录制成功率,在视频录制过程中没有发生错误的比例。
- 录制流畅度相关:
- 录制卡顿率,在视频录制过程中帧率低于设定最低值的时长占比。
- 录制平均采集帧率,录制阶段相机采集的帧率。
- 录制平均处理帧率,录制阶段相机采集后经过图像处理后的帧率。
- 录制平均渲染帧率,录制阶段图像处理完成后预览渲染帧率。
- 录制视频平均帧率,录制出来的视频的平均帧率。
- 录制视频平均码率,录制出来的视频的平均码率。
1、录制成功率优化
手机设备上的应用要使用相机和麦克风进行视频和音频采集是需要向用户申请权限的,所以优化权限申请流程确保权限正常是优化录制成功率的第一步。
此外,可以设置一定的重试流程,当遇到录制报错,可以重试录制流程。
另外,需要统计录制出错的细分错误码,这样就能更好的定位录制失败的原因进行针对性的优化。
2、录制流畅度优化
视频录制过程包括采集音视频数据,做滤镜、美颜、特效等图像处理,这些部分的优化类似采集预览流畅度优化,所以策略也类似。不同的是,视频录制还包括音视频编码、封装、文件存储,所以还需要从后面这些部分寻找优化空间。
视频录制流程如下:
视频录制流程
2.1、采集优化
在音视频采集过程中,可以从下面几方面优化:
- 视频优先使用
YUV
源数据,优化内存及图像处理性能; - 不同设备智能选择分辨率 + 帧率,可手动实现丢帧模块控制帧率;
- 采集线程模型优化:使可并发的任务跑在不同的线程上;使用缓冲区组合生产消费者模型,各个模块可以并行,而且性能兼容性更好。
2.2、图像处理优化
图像处理过程,可以尝试下面的优化措施:
- 采集到前处理的数据进行下采样,这样可以提升前处理模块的处理速度。
- 视频数据对齐分辨率,防止多次采样消耗性能。
- 视频数据对齐下采样的方式(RGB、YUV),防止多次数据格式转换消耗性能。
- 做图像的裁剪、缩放、尺寸变化时要注意优化性能。可以使用 libyuv 来做常规的图像处理,一些 libyuv 版本甚至做过汇编级别的优化来提升图像处理的性能。
- GPU 和 CPU 要尽量少做数据拷贝,性能比较差。可以使用系统能力来实现 GPU 和 CPU 的内存共享来做相关的优化。下面是几种数据拷贝方式的特点:
-
glReadPixel
:通过 OpenGL 将 RGBA 数据转换为 I420,将 I420 拷贝到 CPU 更快。 -
PBO
:依赖机型,性能不稳定,但在部分机型速度更快。可以先做 Benchmark,再根据数据情况在不同的机型上适配使用。 -
CVPixelBuffer
:iOS 平台支持的一种解码输出的数据结构,支持 GPU 与 CPU 数据共享。
-
2.3、编码优化
编码流程可以尝试下面的优化措施:
- 编码器优先使用硬件编码,出错后软件编码兜底。
- 可以使用编码器复用池来优化启动速度。
- 不同设备智能编码分辨率 + 码率,码率可通过
PSNR
、VMAF
等评估方式找到最优码率甜点。 - 尽量使用异步编码,性能更加流畅。
- 优先使用
H.265
编码,相同清晰度可降低码率。H.265
对比H.264
可降低30%
以上码率:
H.265 vs. H.264
2.4、封装优化
大部分的视频生产是封装为 MP4 格式,封装流程可以尝试下面的优化措施:
-
MOOV
前置,优化播放秒开速度。 - 音视频时间戳做好交错,优化播放秒开与卡顿。
- 可以根据需求考虑封装格式使用
FMP4
,FMP4
格式可支持分段并发上传。 -
FMP4
不需要一个MOOV Box
来进行初始化,FMP4
的MOOV Box
只包含了一些 Track 信息。 -
FMP4
的视频/音频 Metadata 信息与数据都存在一个个MOOF
、MDAT
中,它是一个流式的封装格式。
-
FMP4 vs. MP4
2.5、线程模型优化
把采集、特效、编码、封装放在同一个线程,随着功能越来越强,计算越来越重,会影响到最终的输出帧率。要优化可以改为多线程加上 buffer
控制的线程模型。可以使用多线程模型:
- 采集线程:使用系统相机能力实现图像采集。
- 特效线程:根据是否包含
AI
处理管理 CPU 线程。 - CPU 处理线程:跑一些 AI 模型任务;
- GPU 处理线程:跑一些图像处理任务。
- 编码线程:单独开启编码线程提高帧率。
- 封装线程:单独开启封装线程,使用缓存,处理音视频交错,提升封装和文件写入速度。
- 完 -
推荐阅读