1. 高通Camera编码架构总览

各位同学好,我是老张。做高通Camera编码这块,算起来也有七八年了。今天咱们先聊聊整体架构——说白了,就是搞清楚视频数据从镜头进来,到最后变成H.264/H.265码流,中间到底经历了什么。

我记得刚接触高通平台时,最头疼的就是搞不清硬件和软件的分工。你想想看,一个视频帧从Sensor出来,经过ISP、内存、编码器,再到文件存储,中间任何一个环节出问题,画面就可能花掉、卡顿或者延迟。所以,先把Pipeline理清楚,后面调试起来才不慌。

1.1 整体Pipeline:从Sensor到编码输出

先看一张整体流程图,我习惯把Camera编码Pipeline分成四个阶段:

核心流程: Sensor采集 → ISP处理 → 内存暂存 → 编码压缩 → 文件/网络输出

高通Camera编码Pipeline总览 Sensor ISP处理 内存(DDR) 编码器 输出 说明:编码器可以是VPU(硬件)或GPU(软件),取决于平台和场景 实际项目中,编码前通常还有图像裁剪、旋转、格式转换等预处理 各阶段关键参数 Sensor: 分辨率/帧率 RAW10/RAW12/RAW16 ISP: YUV420/NV12 HDR/多帧合成 内存: 带宽/延迟 ION/DMA-BUF 编码: 码率/GOP H.264/H.265

这个流程看起来简单,但实际项目中每个环节都有坑。比如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 软件栈分层

软件栈这块,我习惯从下往上分四层。每一层都有它的职责,也有它的坑。

  1. Kernel驱动层:负责硬件寄存器操作、中断处理、内存管理。高通平台对应的是 msm_vidc 驱动。
  2. HAL层(硬件抽象层):封装底层接口,提供标准化的编码API。高通叫 mm-video-v4l2。
  3. Framework层:Android的MediaCodec、Stagefright等。应用层开发者主要接触这一层。
  4. 应用层: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的某个环节做文章。基础打牢,后面才走得快。