Qt 面试(一)

  1. 排查内存泄漏、线程死锁、野指针
  2. 数据可视化开发
    1. 使用 Qt QCharts、QPainter、GraphicsView 实现数据可视化,开发折线图、仪表盘等图表组件,完成服务器 CPU、内存、磁盘指标实时渲染展示。
    2. 多线程分离数据采集与 UI 绘制,配合互斥锁保护共享数据,解决高频刷新带来的界面卡顿、数据错乱问题。
    3. 对接后端接口获取指标数据,驱动图表动态更新,支持历史数据回溯与异常告警可视化展示。
  3. 音视频同步
    1. init_ffmpegplay(); 初始化 std::atomic<double> *audio_clock;
    2. 在音频和视频解码线程传入同一个指针
    3. 音频线程 设置 audio_clock.store
      1. 在解码时,获取pts(单位:s,frame的播放时刻)
      2. 获取新的packet前,使用m_queue中剩余的字节数计算当前的播放时间
        1. double bytes = m_queue.size(); // 计算缓冲区中剩余字节数
        2. double byte_per_sec = 44100 *2 *2; // 计算每秒播放的字节数
        3. double queue_sec = bytes / byte_per_sec; // 计算剩余字节需要的播放时间
        4. double current_time = pts - queue_sec; // 从解码开始到当前帧所需的播放时间 - 剩余字节所需的时间 = 已经播放的时间(当前播放时间)
    4. 视频线程 使用audio_clock.load
      1. audio_clock > video_clock 音频比视频快,丢帧
      2. audio_clock < video_clock 视频比音频快,msleep() 等待
  4. 线程安全队列
    1. QMutex m_mutex;
    2. QMutexLocker locket(&m_mutex);
  5. 解决 seek 花屏
    1. 使用 AVSEEK_FLAG_ANY 跳到任意帧(P/B)导致缺失参考数据导致花屏
      解决方法: 使用 AVSEEK_FLAG_BACKWARD 跳到 目标时间最近的I帧(关键帧)
    2. 旧数据残余
      解码器中有seek之前的数据
      解决办法:avcodec_flush_buffers(video_codec_ctx);
      avcodec_flush_buffers(audio_codec_ctx);
      数据包队列有seek之前残留的数据
      解决办法: packetQueue.clear();
    3. 音视频时钟没有重置
      audio_clock.store(0.0);
      video_clock.store(0.0);
    4. 面试:
      实现精准 seek 进度跳转:
      seek 时使用AVSEEK_FLAG_BACKWARD回退到最近 I 关键帧,清空 PacketQueue 数据包队列,调用avcodec_flush_buffers清空音视频解码器缓存,重置音视频时钟,丢弃目标时间之前多余帧,解决 seek 花屏、时序错乱问题。
  6. 音画不同步
    1. 为什么? 音频时钟不对
  7. 库封装
    1. 库封装:把功能代码(函数、类、逻辑)打包成静态库 / 动态库 ,对外只暴露头文件,隐藏内部实现源码,实现代码复用、源码保护、模块解耦。
    类型 后缀 Linux Windows 特点
    静态库 .a .a .lib 编译期把库代码复制进可执行文件;运行不再依赖库文件;程序体积大;更新库需要重新编译程序
    动态库(共享库) .so .dll 运行时加载;程序体积小;更新库不用重编译程序;发布必须附带库文件
    1. 封装核心思想

      头文件 (.h/.hpp):对外接口,放类声明、函数声明、宏。给调用方

      源文件 (.cpp/.c):内部实现,不对外分发。编译生成库文件。不给调用方

      调用者只包含头文件,链接库文件,看不到内部 cpp 源码。

    2. 静态库封装

      1. 使用静态库ar工具

      2. 步骤

        gcc a.c -o a.o -c
        gcc b.c -o b.o -c
        ar rcs libab.a a.o b.o

    3. 动态库封装
      gcc -fPIC -shared -o liba.so a.c // -o 后放库文件

相关推荐
Sayai7 小时前
ComfyUI+混元视频实战:12G 显存跑 13G 模型,5 分钟出片(国产开源,附模型与工作流)
人工智能·aigc·音视频·comfyui·hunyuanvideo·混元视频
ACP广源盛139246256739 小时前
项目评估记录:4K 视频墙方案调研,GSV9001E @ACP参数与工程问题记录
硬件架构·音视频·硬件工程·视频·国产芯片
架构师伯子明13 小时前
QT+OpenGL(3):FBO离屏渲染
开发语言·qt
AI视频工具指南15 小时前
怎么用 AI 做一两分钟的小故事视频?从结尾倒推故事
人工智能·aigc·音视频
AI视频工具指南15 小时前
AI短剧怎么做?一个矛盾怎样接着讲三集
人工智能·aigc·音视频
酷虎软件16 小时前
视频加字幕怎么制作
java·前端·音视频
mengzhi啊16 小时前
把数据存入sql数据库。qt,c++。
数据库·sql·qt
码点滴16 小时前
67000 星的开源语音引擎:用 VoiceStudio 搭建本地语音克隆与多语言配音流水线
开源·音视频
开开心心就好17 小时前
手机虚拟化学实验室,混合燃烧都能模拟
jupyter·智能手机·ffmpeg·计算机外设·电脑·音视频·visual studio
VidDown18 小时前
上线三个月后的第一次事故:一个 Django 服务的日志、监控与故障复盘
数据库·python·django·wpf·音视频·视频编解码