影石嵌入式软件开发实习一面凉经 音视频方向
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- WebSocket 遇到网络问题会重发吗?它和 TCP 的可靠性是什么关系?
- TLS 的加密过程是怎样的?
- NV12 是什么类型的数据?和 YUV420 以及其他 YUV 格式有什么区别?
- 项目里 OPUS 的压缩率、单个包的时长是多少?和 AAC 相比如何?
- TCP 和 UDP 有什么区别?
- 死锁处理中用 trylock 加释放已有锁的方案时,trylock 的延迟相关问题了解吗?
- H.264 编码中 MPP 除了配置 GOP 还有什么?帧间预测和帧内预测是什么?I 帧有帧间预测吗?
- 线程是怎么创建和运行的?用的什么函数?
- 怎么处理线程的并发?互斥锁、自旋锁和读写锁之间有什么区别?
- Linux 调用 write() 往硬盘写 10 个字节并返回 10,这 10 个字节真的写到硬盘里了吗?
- 除了 FU-A 分片处理 RTP 大包,还有其他方法吗?
- Linux 的虚拟内存是什么样的?运存 16GB、硬盘 512GB,可以申请 1TB 吗?
- SPS 和 PPS 的具体内容有什么?
- static 修饰全局变量或函数,为什么外部文件不可见?
《参考解析》
WebSocket、TCP 与 TLS:WebSocket 是跑在 TCP 之上的应用层协议,自身不做确认和重传,可靠性完全由 TCP 保证——丢包时 TCP 会自动重传,所以「WebSocket 不会重发」和「TCP 可靠」并不矛盾,重传发生在传输层而不是协议层;应用层要做的是心跳(ping/pong)探测连接是否还活着,以及断线后的重连与消息补偿。至于 TLS 握手:客户端 ClientHello(随机数、支持的密码套件)→ 服务端 ServerHello + 证书 → 客户端校验证书链与域名、用 ECDHE 完成密钥交换(具备前向安全)→ 双方由 HKDF 导出会话密钥 → Finished 校验握手完整性,之后全部走对称加密(AES-GCM 或 ChaCha20-Poly1305),这就是为什么非对称只用在握手阶段。
YUV 格式与 H.264 编码:YUV420 表示每 4 个 Y 共用一组 UV,色度被降采样一半。NV12 的排布是 Y 平面加交错 UV 平面(UVUVUV…),I420 是三个独立平面(YYYY…UU…VV…),NV21 则是 VU 交错。NV12 常见于相机输出和硬件编解码器,因为两平面结构对 DMA 友好。H.264 里 I 帧只用帧内预测(参考同一帧内相邻块的纹理),P/B 帧才做帧间预测(运动估计加运动补偿);所以 I 帧没有帧间预测,它是随机的接入点、也是解码的参考基准。MPP 上除了 GOP 还有码率控制模式(CBR/VBR)、QP 范围、profile/level、参考帧数量、slice 模式等,配 GOP 只是最基础的一步。
write 返回 10 与页缓存落盘:返回 10 只说明十个字节被写进了内核页缓存(page cache),并不代表已经落到磁盘,此时掉电数据就没了。要真正落盘得调用 fsync()(刷数据加元数据)或 fdatasync()(只刷数据),或者打开文件时带 O_SYNC;sync() 是全局回写所有脏页,粒度太大。这也是数据库自己做 WAL 和 fsync 策略的原因。
虚拟内存与超量申请:进程看到的是虚拟地址空间,由 MMU 按页表映射到物理页;64 位进程的虚拟地址空间远大于 1TB,所以申请 1TB 完全可能成功——但申请成功不等于能用。Linux 默认允许 overcommit,malloc/mmap 只是登记虚拟区间,真正触碰页面时才分配物理帧,物理内存加 swap 不够时触发 OOM killer。所以「16GB 内存 + 512GB 硬盘能不能申请 1TB」的准确回答是:能申请到地址空间,但要真读写这 1TB 数据,就必须有对应的物理内存和 swap 撑着,否则进程被 OOM 杀掉。
锁的选择与 static 的链接属性:trylock 加释放已有锁是打破死锁的常用手段,但要留意它的延迟特性——拿不到锁立刻返回失败,如果外层用「失败就重试」的忙等,会白白烧 CPU,通常要配随机退避或固定重试间隔。锁的选型:互斥锁会睡眠、适合较长临界区;自旋锁忙等、适合极短临界区且可在中断上下文用;读写锁允许多个读者并发、适合读多写少。至于 static 修饰全局变量或函数,关键不在存储位置而在链接属性——它把符号变成内部链接(internal linkage),只在本编译单元可见,不进动态符号表,所以其他 .c 文件既声明不到、也不会和同名符号冲突;只答「存在静态存储区、生命周期长」是把生存期和链接属性混为一谈了。