保伦电子安卓开发二面面经(全程问编解码)
- 轮次
- 二面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 自我介绍
- 你们项目是监控摄像机的项目,有没有了解视频编码这块?
- H.264 编码原理是什么?
- H.264 编码的流程是怎样的?
- B 帧和 P 帧的区别?
- GOP 是什么?
- GOP 长度怎么来的,编码时怎么控制?
- YUV420 和 I420 有什么区别?
- 视频采集采的是 RGB 还是 YUV?
- 1080p 的 I420 数据,一帧占多少字节?
- SPS 是什么?
- 视频宽高存在哪里?
- 视频宽高是直接存的吗,还是要怎么算的?
- SPS 和 PPS 有什么区别,两者会一起出现吗?
- C++ 水平怎么样,有做过项目吗,平时工作什么时候用?
- AVC 和 SVC 有什么区别?
- 哪里人?
- 对于工作城市有什么想法?
- 之前离职原因?
《参考解析》
-
H.264 编码原理:核心是去掉三类冗余——空间冗余(帧内预测,用邻近已编码像素预测当前块)、时间冗余(帧间预测,用运动估计 + 运动补偿从参考帧找相似块,只传残差和运动矢量)、以及统计冗余(整数 DCT 变换 + 量化 + 熵编码,CABAC/CAVLC)。再叠加环路滤波去块效应。整条链路的取舍点在于码率、画质和延迟三者互斥。
-
编码流程:输入 YUV 帧先分宏块(H.264 是 16×16 宏块,可细分到 4×4 子块)→ 选择帧内或帧间预测模式 → 得到残差 → 变换与量化 → 熵编码输出码流;同时残差要反量化反变换、加上预测值重建图像,经去块滤波后作为后续帧的参考帧(这就是编码器里一定有「解码环路」的原因)。
-
I/B/P 帧:I 帧只做帧内预测、可独立解码,是随机访问点;P 帧只参考前面的帧,做单向预测;B 帧同时参考前后帧、做双向预测,压缩率最高但需要缓存后续帧,会增加编解码延迟,所以实时通信场景常禁用 B 帧。
-
GOP:Group of Pictures,从一个 I 帧到下一个 I 帧之前的一组帧。GOP 越长大致码率越低,但随机访问(拖动进度、频道切换)的间隔越长、出错后的恢复越慢;直播为了秒开通常把 GOP 压到 1–2 秒,点播可以放到几秒。编码时通过编码器的
gop_size/keyint参数控制,配合场景切换检测可以强制插 I 帧。 -
YUV420 与 I420:YUV420 是一类色度二次采样方式的统称——每 2×2 个亮度像素共用一组 U、V。I420 是其中一种具体的内存排布(也叫 YU12):先存全部 Y,再存全部 U,最后存全部 V,三个平面分开。容易混的是 YV12(U、V 顺序对调)、NV12(UV 交错成一个平面)、NV21(VU 交错)。安卓 Camera 预览常见的输出是 NV21,编码前一般要转成 I420。
-
1080p I420 一帧多少字节:1080p 是 1920×1080 个亮度像素,Y 平面 1920×1080 = 2073600 字节;U、V 各是四分之一,各 518400 字节;合计 2073600 × 1.5 = 3110400 字节,约 2.97 MB(≈ 3 MB)。
-
SPS 与 PPS:SPS(Sequence Parameter Set)描述一个序列的全局参数——分辨率、帧率、位深、色度格式、参考帧数量、profile/level;PPS(Picture Parameter Set)是图像级参数——熵编码方式、量化参数初值、slice 分组等。两者都在 IDR 帧之前出现,且必须一起出现:解码器拿到码流时先解析 SPS 建立序列上下文,再用 PPS 得到具体图像的编码配置;缺了任何一个都没法正确解码,所以封装格式里通常把带 SPS/PPS 的 extradata 单独存一份。
-
宽高存在哪里、是不是直接存:宽高不是以「1920×1080」这样的裸字段存在码流里的,而是编码在 SPS 里,字段名是
pic_width_in_mbs_minus1和pic_height_in_map_units_minus1,单位是宏块(16 像素),解析出来要分别加 1 再乘 16;高度还要结合frame_mbs_only_flag判断是否需要除以 2(场编码的情况)。用 FFmpeg 可以直接从 SPS 里读出来,不用解完整帧。 -
AVC 与 SVC:AVC 就是 H.264,一帧画面只编一个码流。SVC 是可分层视频编码,一次编码产出多层——时域分层(帧率)、空域分层(分辨率)、质量分层(SNR),接收端按自身带宽和解码能力抽掉上层、只解基础层也能看,本质上用少量码率冗余换适应网络抖动的能力。SVC 的代价是编码复杂度和同画质下略高的码率,在会议和屏幕共享场景更常见。