声网C++软件开发二面 面经

1. 简单介绍一下你自己和你最有挑战性的项目

回答框架:

  • 教育背景和核心技术能力
  • 项目背景和技术架构
  • 遇到的核心技术挑战
  • 解决方案和创新点
  • 项目成果和个人成长

2. 如果让你设计一个全球化的实时音视频系统,你会怎么设计

答案:

需求分析

  • 支持全球用户,低延迟(<300ms)
  • 高并发(百万级在线)
  • 高可用(99.99%)
  • 弱网对抗

架构设计

客户端 → 接入层(边缘节点) → 媒体服务器集群 → 其他客户端
                ↓
        信令服务器 + 调度中心
                ↓
        监控系统 + 质量分析

核心模块

  1. 全球部署:多地域:北美、欧洲、亚太、南美边缘节点:靠近用户,降低延迟骨干网:地域间专线
  2. 智能调度:就近接入:GeoDNS + 延迟探测负载均衡:根据服务器负载动态分配质量路由:选择最优传输路径
  3. 媒体服务器:SFU架构:选择性转发,不解码支持多路流:大流、小流、屏幕共享级联:跨地域传输优化
  4. 弱网对抗:自适应码率:根据带宽动态调整FEC(前向纠错):冗余数据NACK(重传):关键帧重传Jitter Buffer:平滑抖动
  5. 质量监控:实时监控:延迟、丢包率、卡顿率质量评分:MOS(Mean Opinion Score)告警系统:异常自动告警

关键技术

  • WebRTC:标准协议栈
  • QUIC:替代TCP,降低延迟
  • 编解码:H.264、VP8、AV1
  • 音频处理:回声消除、降噪、增益控制

3. 说说你对WebRTC的理解,ICE、STUN、TURN是什么

答案:

WebRTC核心组件

  • MediaStream:音视频流
  • RTCPeerConnection:P2P连接
  • RTCDataChannel:数据通道

NAT穿透

ICE(Interactive Connectivity Establishment)

  • 交互式连接建立
  • 收集候选地址(Candidate)
  • 尝试多种连接方式
  • 选择最优路径

STUN(Session Traversal Utilities for NAT)

  • 获取公网IP和端口
  • 客户端向STUN服务器查询
  • 用于P2P直连

TURN(Traversal Using Relays around NAT)

  • 中继服务器
  • P2P失败时使用
  • 所有流量经过TURN服务器
  • 成本高,延迟大

连接建立流程

  1. 收集候选地址:Host:本地地址Server Reflexive:STUN获取的公网地址Relay:TURN中继地址
  2. 交换候选地址(通过信令服务器)
  3. 连接性检查:尝试所有候选地址对发送STUN Binding Request选择最优路径
  4. 建立连接:P2P直连(最优)TURN中继(备选)

优化策略

  • 优先使用P2P,降低成本
  • TURN服务器就近部署
  • 多路径探测,快速切换

4. 如何实现音视频的自适应码率

答案:

自适应码率目的

  • 根据网络带宽动态调整码率
  • 保证流畅性,避免卡顿
  • 提升用户体验

带宽探测

  1. 基于丢包率:丢包率高:降低码率丢包率低:尝试提高码率
  2. 基于延迟:延迟增加:网络拥塞,降低码率延迟稳定:可以提高码率
  3. GCC算法(Google Congestion Control):基于延迟梯度计算发送速率和接收速率差异动态调整码率

码率调整策略

class BitrateController {
    int currentBitrate;
    int minBitrate = 200;  // kbps
    int maxBitrate = 2000; // kbps
    
public:
    void adjustBitrate(float packetLoss, int rtt) {
        if (packetLoss > 0.05) {
            // 丢包率超过5%,降低码率
            currentBitrate = currentBitrate * 0.85;
        } else if (packetLoss < 0.02 && rtt < 100) {
            // 网络良好,尝试提高码率
            currentBitrate = currentBitrate * 1.05;
        }
        
        // 限制范围
        currentBitrate = clamp(currentBitrate, minBitrate, maxBitrate);
        
        // 通知编码器调整
        encoder->setBitrate(currentBitrate);
    }
};

多流策略

  • 大流(高清):高码率
  • 小流(标清):低码率
  • 接收端根据网络选择订阅哪个流

编码器配置

  • 动态调整分辨率
  • 动态调整帧率
  • 动态调整量化参数(QP)

实际应用

  • 移动网络:码率波动大,需要快速响应
  • WiFi:相对稳定,可以激进提升
  • 弱网:优先保证流畅,降低分辨率

5. 如何处理音视频的丢包和抖动

答案:

丢包处理

  1. FEC(Forward Error Correction):前向纠错发送冗余数据接收端用冗余数据恢复丢失包优点:无需重传,延迟低缺点:增加带宽
  2. NACK(Negative Acknowledgment):接收端发现丢包,请求重传发送端重传丢失的包优点:精确恢复缺点:增加延迟
  3. PLC(Packet Loss Concealment):丢包隐藏用前一帧数据填充音频:插值、重复视频:帧复制、运动补偿

抖动处理

Jitter Buffer(抖动缓冲区)

class JitterBuffer {
    queue<Packet> buffer;
    int targetDelay = 50; // ms
    int maxDelay = 200;   // ms
    
public:
    void addPacket(Packet packet) {
        buffer.push(packet);
        
        // 动态调整缓冲区大小
        int currentDelay = calculateDelay();
        if (currentDelay < targetDelay) {
            // 延迟太小,增加缓冲
            targetDelay += 10;
        } else if (currentDelay > maxDelay) {
            // 延迟太大,减少缓冲
            targetDelay -= 10;
        }
    }
    
    Packet getPacket() {
        if (buffer.size() < targetDelay / packetInterval) {
            return nullptr; // 缓冲不足,等待
        }
        
        Packet packet = buffer.front();
        buffer.pop();
        return packet;
    }
};

自适应Jitter Buffer

  • 根据网络抖动动态调整
  • 延迟小:减少缓冲,降低延迟
  • 抖动大:增加缓冲,保证流畅

关键帧请求

  • 丢包严重时,请求关键帧(IDR)
  • 快速恢复画面

6. 如何设计一个高性能的媒体服务器

答案:

架构选择

SFU(Selective Forwarding Unit)

  • 选择性转发
  • 不解码,只转发
  • 低延迟,低CPU
  • 适合多人会议

设计要点

  1. 高性能IO:epoll + 非阻塞IO多Reacto

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++八股文全集 文章被收录于专栏

本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。

全部评论

相关推荐

不会做题的小熊:我感觉我就算是找不到工作,我也不会作弊进去,作弊进去感觉一方面是自己不踏实,其次就是都靠作弊了,那后面肯定工作的心态是不一样的,没有一种内驱力。
点赞 评论 收藏
分享
1.8&nbsp;腾讯官网直投,凌晨把综合测评答完了(2h)。1.13&nbsp;网易互娱官网直投。1.15&nbsp;腾讯一面面邀。1.20&nbsp;早上腾讯一面技术面,感觉良好,下午两位面试官加了微信,邀请二面。1.22&nbsp;腾讯二面总监面(难度直线飙升),压力测试加摸底式技术追问,对线了很久,应对得最不从容的一次。结束后脑袋嗡嗡作响,对自己的表现感到不满意,心情比较难过。1.23&nbsp;早上网易&nbsp;HR&nbsp;加好友并发了&nbsp;JD&nbsp;,看了一下是人工智能+TA方向,感觉不错。HR&nbsp;表示主管刷到我的作品集视频,希望走提前一点的流程,但偏日常实习,婉拒,表示想先走官网看看。1.23&nbsp;下午腾讯一面面试官邀请语音通话并发了两道测试题(意思是二面已过),让我二选一,面试官开玩笑说都做完也可以。悬着的心终于放下了。当晚网易官网测试题直发(但与腾讯测试题时间冲突)。1.24&nbsp;疯狂熬夜,基本完成腾讯第一道测试题,同时找到了第二道题的思路,决定两道题都做,继续攻坚克难(平均每天4h睡眠)。1.26&nbsp;腾讯测试题工程文件、技术文档、视频演示提交,处于身心俱疲状态。当晚收到第二题的迭代要求,ddl27号晚上,强撑继续熬夜肝。1.27&nbsp;早上腾讯测试题迭代版提交。1.29&nbsp;腾讯两道测试题都顺利通过。收到网易测试题邮件催促,然而几乎零进度。比较疲惫。1.30&nbsp;早上腾讯&nbsp;HR&nbsp;面,当天云证。不太满意自己网易测试题的效果,截止日已到,遗憾放弃提交笔试。2.3&nbsp;网易又一位&nbsp;HR&nbsp;电话联系,希望另外给我发测试题,表示可以让我先去腾讯实习,网易的&nbsp;Offer&nbsp;入职时间灵活,可以暑期再入职,并可提供转正机会。反复博弈,本身欣赏网易氛围且有认识网易的小伙伴,欣然接受。晚上&nbsp;HR&nbsp;和业务沟通后表示给我免笔试(受宠若惊)。2.4&nbsp;网易一面面邀。2.6&nbsp;网易一面,虽然有些算法没答上来,但是作品集相关的问题答得没问题,当天过了。感觉面试官像主管,而且真的是把我的B站视频大概看了一下,连我以前喜欢玩什么游戏都知道,气氛一下变得融洽了起来。晚上邮件二面面邀。2.9&nbsp;腾讯官网流程卡在录用评估一个多星期了,比较焦虑。由于行程安排需要,并且临近春节,在群里友好催了一下腾讯二位面试官,结果秒发邮件,无&nbsp;OC&nbsp;直接&nbsp;Offer&nbsp;!戴上红围脖啦~2.10&nbsp;网易二面。因为没做笔试题,所以几乎还是和一面一样追问作品集,但只追问了一两个技术比较复杂的demo,相比一面,问题深度多上了几个level,而且比较发散,会考虑到实际开发的可能遇到的难题。两位面试官,几乎只是一位面试官在问,另一位面试官只在反问环节进行了解答。2.12&nbsp;网易方面最早联系我的那位&nbsp;HR&nbsp;邀请微信语音通话,表示网易方面想要给我发&nbsp;Offer&nbsp;,但是考虑到我这边已经有腾讯&nbsp;Offer&nbsp;了,需要我取舍一下,并反复强调网易的福利,继续博弈,婉拒了网易,希望暑期能够有机会再次合作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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