1. 高通Camera编码架构总览
各位同学好,我是老张。做高通Camera编码这块,算起来也有七八年了。今天咱们先聊聊整体架构——说白了,就是搞清楚视频数据从镜头进来,到最后变成H.264/H.265码流,中间到底经历了什么。
我记得刚接触高通平台时,最头疼的就是搞不清硬件和软件的分工。你想想看,一个视频帧从Sensor出来,经过ISP、内存、编码器,再到文件存储,中间任何一个环节出问题,画面就可能花掉、卡顿或者延迟。所以,先把Pipeline理清楚,后面调试起来才不慌。
1.1 整体Pipeline:从Sensor到编码输出
先看一张整体流程图,我习惯把Camera编码Pipeline分成四个阶段:
核心流程: Sensor采集 → ISP处理 → 内存暂存 → 编码压缩 → 文件/网络输出
这个流程看起来简单,但实际项目中每个环节都有坑。比如ISP输出的格式,有的平台默认是NV12,有的却是NV21,编码器如果不匹配,颜色就全乱了。
1.2 硬件编解码单元:VPU vs GPU
高通平台里,编码任务主要由两个硬件单元承担:VPU(Video Processing Unit)和GPU(Graphics Processing Unit)。很多人搞不清它们的关系,我简单说说。
| 对比项 | VPU(硬件编码器) | GPU(通用计算) |
|---|---|---|
| 功耗 | 极低(专用硬件) | 较高(通用核心) |
| 延迟 | 低(硬连线) | 中(需驱动调度) |
| 编码质量 | 固定(硬件IP决定) | 灵活(可调算法) |
| 典型场景 | 录像、直播、视频通话 | 游戏录屏、特效编码 |
| 高通平台 | Venus(视频核心) | Adreno(GPU核心) |
我的经验: 绝大多数Camera编码场景,用VPU就够了。GPU编码虽然灵活,但功耗和发热在手机上扛不住。我曾经在一个4K 60fps的项目里试过GPU编码,手机烫得能煎鸡蛋——后来老老实实切回VPU。
高通平台上的VPU,内部叫Venus。它是一颗独立的硬件IP,专门做视频编解码。Venus有自己的固件、DMA引擎和码流缓冲区,基本不占用CPU资源。你想想看,录4K视频时CPU占用率只有个位数,这就是硬件编码的魅力。
1.3 软件栈分层
软件栈这块,我习惯从下往上分四层。每一层都有它的职责,也有它的坑。
- Kernel驱动层:负责硬件寄存器操作、中断处理、内存管理。高通平台对应的是
msm_vidc驱动。 - HAL层(硬件抽象层):封装底层接口,提供标准化的编码API。高通叫
mm-video-v4l2。 - Framework层:Android的MediaCodec、Stagefright等。应用层开发者主要接触这一层。
- 应用层:Camera App、第三方录像软件等。
我遇到过最典型的问题:应用层调了MediaCodec的setParameters,但底层驱动根本没收到。为什么?因为HAL层把参数过滤掉了。所以调试时,一定要从下往上逐层确认。
避坑指南: 我曾经在一个项目里,上层设置了编码码率2Mbps,但实际码流跑出来只有800kbps。查了两天才发现,是HAL层的一个码率控制策略把目标码率给覆盖了。所以,不要相信上层传的参数,一定要抓码流分析实际输出。
1.4 与高通平台的关系
高通平台和Camera编码的关系,说白了就是硬件IP + 驱动 + 框架的绑定。不同芯片平台,编码能力差异很大。
| 平台系列 | 编码能力 | 典型芯片 |
|---|---|---|
| 骁龙8 Gen系列 | 8K 30fps H.265 / 4K 120fps H.264 | SM8550, SM8650 |
| 骁龙7系列 | 4K 60fps H.265 / 4K 30fps H.264 | SM7475, SM7550 |
| 骁龙6系列 | 4K 30fps H.265 / 1080p 60fps H.264 | SM6450, SM6475 |
| 骁龙4系列 | 1080p 60fps H.264 | SM4350, SM4450 |
嗯,这里要注意:编码能力不只是看分辨率。同样支持4K 60fps,有的平台只能做Baseline Profile,有的可以做High Profile。码率控制精度、B帧支持、ROI编码这些特性,不同平台差别也很大。
一句话总结: 高通Camera编码架构 = Venus硬件 + msm_vidc驱动 + mm-video HAL + MediaCodec框架。搞懂这四层的关系,后面调试优化才能有的放矢。
好了,这一章先到这里。架构层面的东西,看起来有点虚,但后面每一章都会回到这张图上。你想想看,后面讲码率控制、讲ROI、讲低延迟编码,其实都是在Pipeline的某个环节做文章。基础打牢,后面才走得快。