C++音视频八股文(实战问题)
1. 视频播放出现花屏的可能原因有哪些?
- 丢包或数据损坏:网络传输丢包、文件损坏、存储介质错误导致解码数据不完整,解码器无法正确重建图像
- 参考帧丢失:P帧和B帧依赖参考帧,如果参考帧(I帧或前面的P帧)丢失或解码失败,后续帧会出现错误累积
- 解码器错误:解码器bug、不支持的编码特性、硬件解码器兼容性问题导致解码异常
- 时间戳错误:PTS/DTS错乱导致帧显示顺序错误,B帧在参考帧之前显示
- 内存问题:解码缓冲区不足、内存越界、野指针导致数据被破坏
- 编码问题:编码器bug、非标准编码、参数设置错误产生的异常码流
- 硬件问题:显卡驱动问题、GPU过热、硬件故障导致渲染错误
- 格式不匹配:像素格式转换错误、色彩空间不匹配、stride计算错误
2. 视频播放卡顿的可能原因有哪些?如何优化?
- 解码性能不足:CPU/GPU性能不够,解码速度跟不上播放速度。优化方法是使用硬件解码、降低分辨率、减少并发解码数
- 网络带宽不足:下载速度慢于播放速度,缓冲区耗尽。优化方法是增加缓冲时间、使用自适应码率、CDN加速
- 磁盘IO瓶颈:硬盘读取速度慢、磁盘碎片、多进程竞争IO。优化方法是使用SSD、预读缓存、异步IO
- 缓冲区设置不当:缓冲区太小导致频繁等待。优化方法是增大缓冲区、使用环形缓冲区、预加载
- 渲染性能问题:显卡性能不足、渲染线程阻塞、垂直同步限制。优化方法是降低渲染分辨率、使用硬件加速渲染、优化渲染流程
- 音视频同步问题:同步算法不当导致频繁丢帧或等待。优化方法是优化同步策略、动态调整播放速度
- 系统资源竞争:其他进程占用CPU、内存不足导致频繁换页。优化方法是提高进程优先级、关闭后台程序、增加内存
- 线程调度问题:线程优先级低、锁竞争、上下文切换频繁。优化方法是优化线程模型、减少锁使用、使用无锁队列
3. 如何实现视频的快进和快退?
- 关键帧定位:使用av_seek_frame或avformat_seek_file定位到目标时间附近的关键帧,flags参数设置为AVSEEK_FLAG_BACKWARD向后查找关键帧
- 精确定位:先定位到关键帧,然后解码到目标帧。如果需要精确到某一帧,必须从最近的关键帧开始逐帧解码
- 时间戳计算:将目标时间转换为对应流的时间戳,使用av_rescale_q进行time_base转换
- 索引优化:对于频繁seek的场景,可以预先建立关键帧索引表,记录每个关键帧的位置和时间戳,加快定位速度
- 缓冲区清理:seek后需要清空解码器缓冲区,调用avcodec_flush_buffers,避免旧数据干扰
- 双向seek:快退时使用AVSEEK_FLAG_BACKWARD,快进时使用AVSEEK_FLAG_ANY或不设置flags
- GOP考虑:seek精度受GOP大小影响,GOP越大seek越不精确,可能需要解码更多帧
4. 如何实现视频的倍速播放?
- 改变PTS:使用setpts滤镜修改时间戳,加速用setpts=PTS/2(2倍速),减速用setpts=PTS*2(0.5倍速)
- 音频处理:音频也需要变速,使用atempo滤镜,范围是0.5-2.0,超过范围需要级联多个atempo
- 播放器实现:播放器控制渲染速度,根据PTS和系统时间计算,乘以速度系数决定何时显示下一帧
- 跳帧策略:高倍速播放时可以跳过非关键帧,只解码和显示关键帧,减少解码压力
- 音画同步:变速时需要保持音视频同步,调整音频播放速度或视频显示速度
- 实时变速:播放过程中动态改变速度,需要平滑过渡避免卡顿,可以使用插值算法
- 性能考虑:高倍速需要更高的解码性能,可能需要降低质量或使用硬件加速
5. 如何处理视频文件的旋转信息?
- 读取旋转信息:从视频流的metadata中读取rotate字段,或从display
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++八股文全集 文章被收录于专栏
本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。

