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. 端到端延迟飙升排查顺序

  1. 采集/前处理:是否有 CPU 过载
  2. 编码:是否开启了过慢的预设
  3. 传输:RTT、丢包、带宽是否异常
  4. 接收端:jitter buffer 是否过大
  5. 渲染:是否有 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++工程能力.

全部评论

相关推荐

1.java的集合有哪些?它们分别的特点是什么?①List(有序,可重复,有索引):ArrayList(数组实现,查询快),linkedList(链表实现,增删快),vector(线程安全)②Map(key-value,键值对):HashMap,LinkedHashMap(按插入顺序排序),TreeMap(按key的大小自动排序)③Set(无序,不可重复,无索引):HashSet,LinkedHashSet(按插入顺序排序),TreeSet(按照大小自动排序)2.&nbsp;java的AOP在Spring项目中的实际应用有哪些?所谓AOP,即把重复代码(日志、权限、事务、缓存)抽出来,统一管理,业务代码只关心业务。①日志统一记载,不用每个方法都写log.info()②全局异常处理,统一捕获异常,避免到处try-catch③权限校验(方法层面)④事务管理(@Transactional注解)⑤缓存控制(查询前先查缓存,不存在再执行方法并注入缓存)3.&nbsp;如何理解ai&nbsp;agent?(skill&nbsp;MCP)AI&nbsp;Agent&nbsp;是目标驱动的“自主智能体”,Skill&nbsp;是它的“专业操作手册”,MCP&nbsp;(Model&nbsp;Context&nbsp;Protocol)是它连接外部世界的“标准化接口”。三者协同,让&nbsp;Agent&nbsp;能“思考+做事”。核心架构:LLM(大脑)+&nbsp;规划(拆任务)+&nbsp;记忆(存上下文/经验)+&nbsp;工具(连外部)&nbsp;。4.&nbsp;字节trae&nbsp;solo模式与其它模式Trae&nbsp;Solo&nbsp;模式是&nbsp;AI&nbsp;主导的全流程自动化开发模式,让你用自然语言提需求,AI&nbsp;自动完成从需求拆解、编码、测试到预览部署的全链路工作&nbsp;。5.ai开发的command命令模式(/,以及claude&nbsp;code)/&nbsp;&nbsp;斜杠命令&nbsp;=&nbsp;AI开发的“快捷键面板”,让你精准、高效地指挥AI,从聊天式辅助升级为命令式开发。例如在Claude&nbsp;Code中使用&nbsp;/model&nbsp;:切换AI模型(Haiku/Sonnet/Opus)
点赞 评论 收藏
分享
评论
1
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务