下面是一套16 周、项目驱动的 C++ 音视频学习与实战路线图(面向你已有的 C++ / Qt 桌面开发能力)。
节奏设计为:每周聚焦 1~2 个核心能力 → 当周完成一个可运行的小项目 → 每 4 周形成一次企业级里程碑。
每周都给出:学习目标 / 关键知识点 / 任务清单 / 项目产出与验收标准 / 进阶挑战(可选)。
先导准备(第 0 周,1~3 天完成)
目标: 搭好跨平台开发环境与项目脚手架,后续项目都在此模板上扩展。
工具建议:
-
构建: CMake +(vcpkg 或 conan)管理依赖
-
音视频基础库: FFmpeg(libavformat/codec/filter/util/swresample/swscale)
-
播放/采集: Qt 6(Qt Multimedia 或 QOpenGLWidget + QThread)、PortAudio 或 SDL2
-
日志/测试: spdlog/glog、GoogleTest(或 Catch2)
-
打包: windeployqt/macdeployqt + CPack(或 IFW/NSIS)
任务清单
-
新建通用工程模板:
app/,core/,av/,ui/模块化,启用-Wall -Wextra -O2(Debug 开-g)。 -
通过 vcpkg/conan 拉起 FFmpeg、PortAudio/SDL2、spdlog。
-
建好异步任务基类(
TaskRunner)与有界阻塞队列(BoundedBlockingQueue<T>),统一线程退出/取消语义。 -
写好崩溃日志与异常边界(unix:
backtrace,windows:MiniDump)。 -
在 CI(GitHub Actions 或本地脚本)拉起 Win/Linux 双平台构建。
阶段 I:本地播放与时钟同步(第 1--4 周)
第 1 周|容器与解复用
-
目标: 读媒体容器、遍历流、提取元信息。
-
关键点: 容器 vs 编码、时间基(time_base)、PTS/DTS。
-
任务
-
用
avformat_open_input/avformat_find_stream_info解析本地 MP4/MKV。 -
列出音/视频流参数(分辨率、帧率、采样率、码率、时长、编解码器)。
-
Qt 做一个"媒体探测器"界面:拖文件 → 展示信息(可复制 JSON)。
-
-
项目产出:
MediaProbe小工具。 -
验收: 能稳定识别主流容器(mp4/mov/mkv/flv/ts);错误弹窗不崩。
-
进阶: 支持封面图(
AV_DISPOSITION_ATTACHED_PIC)与多音轨/多字幕统计。
第 2 周|视频解码与 YUV 渲染
-
目标: H.264/H.265 解码、YUV→RGB、屏显。
-
关键点:
avcodec_send_packet/receive_frame新 API、sws_scale、零拷贝策略。 -
任务
-
建立解复用线程、视频解码线程、渲染线程三段流水线。
-
QOpenGLWidget或QVideoSink渲染;支持截图(YUV→RGB)。
-
-
项目产出:
MinimalVideoPlayer(仅视频)。 -
验收: 1080p H.264 能流畅播放(CPU<60%/四核参考),窗口缩放自适应。
-
进阶: 添加缩略图条(固定间隔抽帧生成)。
第 3 周|音频解码与播放
-
目标: AAC/MP3 解码、重采样、音频回放。
-
关键点:
libswresample通道/采样率转换,环形缓冲,播放回调时序。 -
任务
-
音频解码线程 + PortAudio/SDL2 播放;实现音频时钟。
-
可视化音量表(RMS/峰值)与静音检测。
-
-
项目产出:
AudioPlayerCore。 -
验收: 不同采样率与通道布局都能稳定播放,无破音/爆音。
-
进阶: 简单均衡器/增益(
libavfilter)。
第 4 周(里程碑 1)|本地 A/V 播放器(暂停/倍速/拖动/截图)
-
目标: 完成一个正式可用的本地播放器。
-
关键点: A/V 同步(以音频为主时钟或外部主时钟),seek、倍速回放。
-
任务
-
引入主时钟,视频按 PTS 与音频时钟对齐(丢帧/延时策略)。
-
支持播放/暂停/停止、倍速(0.5x~2x)、关键帧快进/后退、拖动预览。
-
-
产出:
QtPlayerPro(安装包 + 使用文档)。 -
验收: 对 24/25/30/60 fps 文件拖动不卡死;音画不同步<40ms。
-
进阶: 封装为 QML 组件,可嵌入其他 Qt 项目。
阶段 II:采集、录制与直播(第 5--8 周)
第 5 周|视频缩放/滤镜与缩略图服务
-
目标: 熟悉
libswscale/libavfilter。 -
任务
-
批量生成缩略图(指定时间点/时间间隔),加水印/时间戳。
-
暴露一个本地 HTTP 接口(Qt HttpServer 或微型库)对外生成缩略图。
-
-
产出:
ThumbService。 -
验收: 1 小时视频 1s/张的抽帧在可接受时间内完成;内存稳定。
-
进阶: 多线程任务队列 + 失败重试。
第 6 周|摄像头/麦克风采集与屏幕录制
-
目标: 掌握采集→编码→封装→落盘闭环。
-
任务
-
Qt Multimedia 或平台 API 采集摄像头 + 麦克风;同时实现屏幕录制。
-
选择编码器(x264/NVENC/QSV/VAAPI 任一)+ AAC,封装 MP4/MKV。
-
-
产出:
QtRecorder(摄像头叠加/画中画 + 屏幕录制)。 -
验收: 1080p30 录制 CPU 可控,音画同步,文件可在 VLC/系统播放器播放。
-
进阶: 录制中断点续录 + 文件切片(每 5 分钟滚动)。
第 7 周|RTMP 推流(直播上行)
-
目标: 实时编码与网络推送。
-
知识点: GOP/关键帧、CBR/VBR、首屏时间、RTMP 握手与重连。
-
任务
-
将摄像头/屏幕推到本地或云端 RTMP(测试可用 nginx-rtmp)。
-
实现网络抖动/断网自动重连、码率与分辨率限速。
-
-
产出:
LivePusher。 -
验收: 30 分钟稳定推流,无明显卡顿;断网 10 秒内自动恢复。
-
进阶: 同时录制本地 FLV/MP4 以便回看。
第 8 周(里程碑 2)|多源直播工具(场景切换 + 叠加)
-
目标: 整合采集、编码、推流,做一个可生产的直播工具。
-
任务
-
多输入源(摄像头/屏幕/媒体文件),场景切换、文本/图层叠加。
-
预设配置(分辨率、码率、GOP)、一键开播/停止、日志与统计。
-
-
产出:
QtLiveStudio(UI 友好,可保存工程)。 -
验收: CPU/GPU 占用可控;开始/结束流无花屏;配置可导入导出。
-
进阶: NVENC/VAAPI/QSV 硬编切换与自动降级。
阶段 III:网络播放、低时延与协议(第 9--12 周)
第 9 周|RTSP 客户端(安防/监控播放)
-
目标: 拉 RTSP(RTP over UDP/TCP),实现抖动缓冲与基本丢包容错。
-
知识点: RTP/RTCP、jitter buffer、乱序重排。
-
任务
-
用 FFmpeg(或 live555)拉流 → 解码 → 渲染;实现可调缓冲时长。
-
显示网络统计(丢包率、RTT、缓冲深度)。
-
-
产出:
RtspViewer。 -
验收: 典型 IPC 流 1080p 流畅;弱网下降级(帧率/缓冲)不崩溃。
-
进阶: 多通道九宫格视图 + 轮巡。
第 10 周|自研 RTP 发送/接收(实验性)
-
目标: 从底层理解打包、时间戳与同步。
-
任务
-
以裸 PCM/H264 为例,编写最小化 RTP 发送端/接收端(UDP)。
-
实现简单 FUA(H264 NALU 分片)与 RTCP SR/RR 统计。
-
-
产出:
RtpToy(命令行 + 简单 UI)。 -
验收: 本地回环/跨机房内网均可收发,统计准确。
-
进阶: 加上 NACK 重传与丢包隐藏(PLC)。
第 11 周|A/V 同步进阶与多路混流
-
目标: 多源混音、画面拼接、正确对齐时间线。
-
任务
-
音频混音器(多轨 → 混合、音量/静音、淡入淡出)。
-
2×2 拼接与自定义布局(OpenGL/Qt Quick)。
-
-
产出:
AVMixer。 -
验收: 任意两路不同帧率/采样率源仍能稳定混合输出。
-
进阶: 将输出同时本地录制 + RTMP 推流。
第 12 周(里程碑 3)|低延迟播放器(本地/RTSP/直播)
-
目标: 面向监控/互动场景的低延迟拉流播放。
-
任务
-
优化解码与渲染队列,控制缓冲深度(<300ms);丢帧与同步策略。
-
UI 显示端到端延迟与帧时间线(帧间隔直方图)。
-
-
产出:
LowLatencyPlayer。 -
验收: 弱网条件下端到端延迟 < 500ms(可调),波动平稳。
-
进阶: 切换解码器(软解/硬解)与渲染后备(OpenGL/Qt VideoSink)。
阶段 IV:实时通话、企业级工程化(第 13--16 周)
第 13 周|回声消除/降噪/自动增益(语音链路)
-
目标: 语音通话前处理(AEC/NS/AGC)。
-
任务
-
集成
webrtc-audio-processing(或同类库),对麦克风流做处理。 -
回放回采抑制(避免啸叫),实现语音激活检测(VAD)。
-
-
产出:
VoicePipeline。 -
验收: 外放+麦同时开启无明显回声;语音清晰度提升。
-
进阶: 降噪级别与 CPU 占用自适应。
第 14 周|WebRTC 一对一通话(客户端)
-
目标: 打通 ICE/STUN/TURN + SRTP,实现实时音视频通话。
-
任务
-
封装 WebRTC Native SDK(或 libdatachannel/GStreamer webrtcbin)至 Qt UI。
-
信令层可先用本地 WebSocket 服务(最简实现)。
-
-
产出:
QtCall(一对一通话,摄像头切换/静音/开关摄像头)。 -
验收: 公网不同网络互通成功率高;切换网络自动重连。
-
进阶: 统计页(码率、rtt、丢包、分辨率、FPS)与日志上报。
第 15 周|录制与点播(HLS/DASH 打包)
-
目标: 做回看/点播能力。
-
任务
-
将摄像头/屏幕或拉流输出切片为 HLS(.m3u8 + .ts/.mp4)或 DASH。
-
生成时间轴索引与缩略图,支持片段级回放与批量导出。
-
-
产出:
VODPackager。 -
验收: 任意时段可精准回放;索引/切片一致性校验通过。
-
进阶: 服务器端简单上传与清理策略。
第 16 周(里程碑 4|毕业项目)|企业级音视频套件
把前 3 个里程碑整合成可交付产品形态,包含:
-
本地播放器(专业回放/标注)、直播工具、低延迟播放器、WebRTC 通话客户端
-
统一: 日志/崩溃上报、配置中心(JSON/YAML)、插件化滤镜、自动更新、安装包
验收:
-
跨平台构建、自动打包(CI);
-
关键路径压测基线(1080p60、CPU/GPU 占用阈值、内存泄漏=0(ASan/Valgrind))。
-
加分: 提供两套主题皮肤与国际化(Qt 翻译)。
每周配套细化(通用要求)
-
代码组织: 解耦模块(Demux、Decode、Render、AudioOut、Net、Mux、Filter、Sync、UI)。
-
线程模型: 每条流水线单向消息 + 队列容量告警;统一停止序。
-
度量指标: FPS、平均/最大延迟、丢帧/丢包率、缓冲深度、CPU/GPU/内存。
-
测试素材: 准备多种封装/编码/帧率/采样率/字幕文件(短 5~10 分钟)。
-
文档: 每周一页 README(依赖、运行、功能、架构图、瓶颈与改进)。
关键实现提醒(易踩坑清单)
-
PTS/DTS 与 time_base: 统一成纳秒或毫秒内部时钟,所有模块用同一单位。
-
释放与异常:
AVPacket/AVFrame成对释放;send/receive 出错要avcodec_flush_buffers。 -
色彩空间: BT.601/709/2020 与全/有限量级;截图与渲染一致性。
-
音频重采样: 通道布局(
AV_CH_LAYOUT_*)与采样格式(AV_SAMPLE_FMT_*)一致;避免反复创建SwrContext。 -
硬编/硬解: 优先纯软实现打通流程,再切换到 NVENC/VAAPI/QSV;做好回退。
-
弱网处理: RTSP/RTMP 都要有重连与超时策略;拉流加抖动缓冲,推流加发送队列与码率控制。
-
UI 卡顿: 所有解码/网络操作都在工作线程;UI 只接收渲染帧与状态。
-
跨平台: 音频后端(WASAPI/ALSA/CoreAudio)差异用 PortAudio/SDL2 抹平。
-
安全: WebRTC/SRTP 密钥轮换;日志中避免输出隐私令牌。
-
打包: Windows 用
windeployqt;macOS 用macdeployqt;Linux 提供AppImage/DEB。
典型代码骨架(解码主循环要点|伪代码)
仅示意新 API 用法,具体异常与边界需完善。
// Demux thread
while (running && av_read_frame(fmtCtx, &pkt) >= 0) {
if (pkt.stream_index == vIndex) videoQueue.push(pkt);
else if (pkt.stream_index == aIndex) audioQueue.push(pkt);
else av_packet_unref(&pkt);
}
// Video decode thread
while (running) {
AVPacket pkt = videoQueue.pop();
avcodec_send_packet(vDecCtx, &pkt);
av_packet_unref(&pkt);
while (avcodec_receive_frame(vDecCtx, frame) == 0) {
// convert pts to ms
int64_t ptsMs = av_rescale_q(frame->best_effort_timestamp, vTimeBase, {1,1000});
VideoFrame vf = convertToRenderFormat(frame, ptsMs); // sws_scale or hw zero-copy
renderQueue.push(std::move(vf));
}
}
// Render thread
while (running) {
auto vf = renderQueue.pop();
// wait until vf.ptsMs <= masterClock.nowMs() + tolerance
render(vf);
}
你的企业级作品集(完成 16 周后可交付)
-
QtPlayerPro: 专业回放(拖动预览/标注/波形/字幕);
-
QtLiveStudio: 多源直播(场景/叠加/推流/录制/硬编);
-
LowLatencyPlayer: 低延迟拉流(可观测网络指标);
-
QtCall: 一对一 WebRTC 通话;
-
VODPackager: HLS/DASH 切片与回放工具。
以上 5 个项目即可覆盖:本地播放、采集录制、直播、弱网播放、实时通话与点播全链路,满足多数企业级桌面端音视频项目要求。
可选"进阶 8 周"(完成后可冲刺更高阶岗位)
-
SRT/QUIC 传输、拥塞控制
-
SFU 客户端(Janus/mediasoup/pion) + 多人会议
-
GPU 加速滤镜(CUDA/OpenCL/Metal)
-
字幕与 OCR、语音转写与关键词检索
-
跨平台安装器/自动更新(差分包)与灰度发布
使用方式建议
-
每周按上面的任务清单逐条打勾;周末提交演示视频 + README + 指标。
-
若某周时间紧,可先保证"项目产出 + 基线验收",再做"进阶挑战"。