C++ 音视频开发 常考面试题总结
1. H.264/H.265/AV1 选型决策指标
- 场景:RTC(低延迟) vs VOD(高压缩)
- 码率收益:AV1 > H.265 > H.264
- 编码复杂度:AV1 > H.265 > H.264
- 硬件适配:H.264 最广,AV1 硬件支持仍在普及
- 授权风险:H.265 有专利池,AV1 开源无授权
2. 编码器速度与画质权衡调参
- GOP 长度:直播短 GOP(2s),点播长 GOP(10s)
- B 帧策略:点播多 B 帧提压缩,直播少 B 帧降延迟
- 码控模式:CBR(直播稳定码率)、VBR(点播画质优先)、CRF(恒定画质)
3. 花屏、绿屏、马赛克问题调试流程
- 查 PTS/DTS 时间戳是否对齐
- 查解码日志是否有错误帧
- 查色彩空间、像素格式是否匹配
- 查内存对齐与越界问题
4. 色彩空间与色度抽样对编解码的影响
- BT.601(标清)、BT.709(高清)、BT.2020(超高清/HDR)
- 4:2:0 是主流,压缩率高;4:4:4 画质好但码率高
- HDR(PQ/HLG)需要 10bit 以上位深,编解码复杂度更高
5. FFmpeg 二次开发封装经验
- 复用解复用器、编码器上下文,避免重复初始化
- 滤镜链(Filter Graph)统一管理,减少冗余计算
- 硬编坑:VAAPI/MediaCodec/VideoToolbox 平台差异大,需要适配层
// FFmpeg 硬编初始化示例 (H.264 via VAAPI)
AVCodecContext* init_h264_vaapi(AVBufferRef* hw_device_ctx, int width, int height, int bitrate) {
const AVCodec* codec = avcodec_find_encoder_by_name("h264_vaapi");
AVCodecContext* ctx = avcodec_alloc_context3(codec);
ctx->width = width;
ctx->height = height;
ctx->time_base = (AVRational){1, 25};
ctx->framerate = (AVRational){25, 1};
ctx->pix_fmt = AV_PIX_FMT_VAAPI;
ctx->hw_device_ctx = av_buffer_ref(hw_device_ctx);
ctx->bit_rate = bitrate;
avcodec_open2(ctx, codec, nullptr);
return ctx;
}
6. 端到端延迟飙升排查顺序
- 采集/前处理:是否有 CPU 过载
- 编码:是否开启了过慢的预设
- 传输:RTT、丢包、带宽是否异常
- 接收端:jitter buffer 是否过大
- 渲染:是否有 vsync 等待
7. 弱网丢包 15% 场景的抗丢包策略
- NACK:小范围丢包,重传请求
- FEC:中等丢包,前向纠错,冗余度 20-30%
- RED:高丢包,冗余编码,保护关键帧
- 带宽回退:动态降码率、分辨率,避免拥塞
8. ABR 自适应码率算法核心
- 带宽估计:滑动窗口平滑,避免抖动
- 缓冲阈值:低缓冲降码率,高缓冲提码率
- 质量切换:平滑过渡,避免播放震荡
9. jitter buffer 设计要点
- 抖动估计:基于 RTP 时间戳计算网络抖动
- 重排序:按时间戳排序,处理乱序包
- 最大缓存:平衡时延与丢包恢复,直播 200-400ms
// 简化版 Jitter Buffer 帧排序
struct Frame { uint32_t ts; vector<uint8_t> data; };
vector<Frame> jitter_buffer;
void insert_frame(Frame f) {
auto it = lower_bound(jitter_buffer.begin(), jitter_buffer.end(), f,
[](const Frame& a, const Frame& b) { return a.ts < b.ts; });
jitter_buffer.insert(it, f);
}
Frame get_frame(uint32_t play_ts) {
if (jitter_buffer.empty() || jitter_buffer[0].ts > play_ts) return {};
Frame f = jitter_buffer[0];
jitter_buffer.erase(jitter_buffer.begin());
return f;
}
10. WebRTC 核心协议栈
- SRTP:媒体数据加密
- DTLS:密钥交换与身份验证
- ICE:NAT 穿透,建立 P2P 连接
- SCTP:可靠数据通道
- NAT 穿透失败:回退 TURN 服务器转发
11. 网络拥塞控制实践
- GCC:基于丢包和延迟,适合 RTC 场景
- BBR:基于带宽探测,适合大文件传输
- RTC 与点播差异:RTC 优先低延迟,点播优先吞吐量
12. 音频处理链(AEC/NS/AGC/ANS)模块顺序
- 推荐顺序:AEC → NS → AGC → ANS
- 处理帧长:10-20ms,与采样率匹配
- 采样率变换:统一到 48kHz 后再处理,避免多次重采样
13. AEC 回声残留优化
- 精确估计远端信号延迟
- 双讲检测,避免抑制近端语音
- 自适应回声路径变化
- 适配不同音频设备的采集特性
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++ 常考面试题总结 文章被收录于专栏
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.