音视频工程长期写作总纲:我的知识体系骨架与专栏线路图
前言:为什么我要先搭“骨架”,而不是继续零散写
当一个人开始系统学习音视频时,很容易进入一种状态:
- 今天看一点 H.264
- 明天看一点 FFmpeg
- 后天又跳去看 RTSP / RTP
- 再往后开始接触 OpenCV、GStreamer、CUDA、WebRTC、AAC、弱网优化
表面上看,学过的东西越来越多;但实际上,知识很容易变成一地散点。
最后常见的问题是:
- 每个词都见过,但串不起来
- 每个模块都懂一点,但没有主干
- 写博客时题目很多,但容易越写越散
- 面试时能说几个名词,但很难讲出完整链路
- 做项目时遇到问题,不知道它属于采集层、编码层、协议层、渲染层,还是系统优化层
所以,在这个阶段,比继续堆选题更重要的一件事是:
先把整个音视频工程知识体系的核心骨架定下来。
这篇文章的目的不是讲某一个具体技术点,而是作为我后续长期写作的总纲,明确:
- 这个专栏到底要覆盖哪些方向
- 哪些内容属于核心骨架,必须优先写透
- 每篇文章的跨度应该怎么控制,避免一篇里塞太多东西
- 后续所有笔记、博客、图示、代码示例,应该沿着什么主线持续扩展
我希望这不是一个“随手写博客”的系列,而是一套能不断生长的音视频工程知识地图。
一、这个专栏到底在写什么
这个专栏的核心目标,不是简单整理 API,也不是只做面试八股,而是围绕 音视频工程全链路,逐步建立一套能够服务于:
- 基础学习
- 工程理解
- 项目实践
- 面试表达
- 后续深入研究
的长期知识体系。
为了避免体系失控,我先给这个专栏设定一个明确边界。
1.1 专栏主线
整个专栏围绕下面这条主链路展开:
flowchart LR
A[采集设备 / 本地文件 / 网络流] --> B[图像与音频基础]
B --> C[编码与码流结构]
C --> D[封装与解封装]
D --> E[传输协议与网络]
E --> F[解码 / 渲染 / 播放]
F --> G[工程框架与工具]
G --> H[系统优化 / 弱网 / 实时性]
H --> I[车载 / 推理 / SDK / 项目表达]
换句话说,这个专栏不是单讲 FFmpeg,也不是单讲 H.264,而是把下面这些方向放进同一个系统里理解:
- 图像基础与像素格式
- 视频编码与音频编码
- 封装格式与媒体容器
- RTSP / RTP / RTMP / WebRTC
- FFmpeg / GStreamer
- 摄像头采集链路与车载视频链路
- 硬件编解码、OpenGL、CUDA、ONNX Runtime
- jitter buffer、弱网优化、系统性能调优
- 面试表达、项目表达、SDK 设计与落地
1.2 写作原则
后续所有文章,都尽量遵守下面三个原则。
原则一:一篇只解决一个核心问题
一篇文章可以有关联内容,但不应该跨度过大。
比如:
- “RTSP / RTP / RTCP 三者关系”可以是一篇
- “WebRTC 全栈原理 + 弱网优化 + jitter buffer + 回声消除”就明显太大了
原则二:先搭骨架,再填细节
先把主干主题写出来,让整张知识地图可见;再逐篇深入,补:
- 关键代码
- 架构图
- 时序图
- 典型问题
- 性能分析
原则三:每篇都尽量落回工程语境
不只回答“它是什么”,更要回答:
- 它在整条链路里处于哪一层
- 它和上下游模块怎么连接
- 工程里为什么经常在这里出问题
- 面试里该怎么讲
二、整个体系先分成哪几大模块
在真正细化文章之前,先把大模块划清楚。
我最终决定把整个专栏先收成下面 10 个一级模块。
这样既足够大,也不会无限发散。
模块 A:总览与系统世界观
- 音视频系统整体链路
- 从采集到显示的完整主线
- 各层模块职责与系统边界
模块 B:图像基础、像素格式与色彩空间
- RGB / YUV / NV12 / YUV420P
- 色彩空间、采样格式、内存布局
- OpenCV / FFmpeg / 摄像头数据格式衔接
模块 C:视频编码与码流结构
- H.264 / H.265
- I/P/B 帧、GOP、预测结构
- NALU、SPS、PPS、VPS、Annex B、AVCC
模块 D:音频基础与音频编码
- PCM、采样率、位宽、声道
- AAC、Opus 等音频编码
- 音视频同步与音频处理基础
模块 E:容器、封装与时间戳
- MP4 / FLV / TS / MKV
- mux / demux
- PTS / DTS / time_base
- 转封装与转码
模块 F:流媒体网络与传输协议
- RTP / RTCP / RTSP
- RTMP
- WebRTC
- jitter buffer、弱网与实时传输问题
模块 G:FFmpeg 与 GStreamer 工程框架
- FFmpeg 核心对象与主流程
- filter graph
- GStreamer pipeline
- 两套框架的工程思维差异
模块 H:采集设备、Camera Pipeline、车载系统与业务链路
- 本地摄像头采集链路
- Camera pipeline 搭建
- Sensor 调试与图像链路联调
- 录像、拍照、回放等典型业务
- 车载摄像头主链路与附属链路
- SDK 开发与平台封装
模块 I:硬件加速、GPU、渲染与推理部署
- 软编码 / 硬编码
- 显卡支持差异
- CUDA / OpenGL / ONNX Runtime
- 视频流上的推理部署
模块 J:链路优化、弱网与项目表达
- 弱网优化
- jitter buffer
- 缓冲区 / 队列 / 背压
- 面试表达
- 项目系统设计与复盘
这 10 个模块,已经足以覆盖我后续希望长期沉淀的主体方向。
但模块只是地图,真正决定写作节奏的,还是下面的 核心骨架文章。
三、什么叫“核心骨架文章”
这里我专门定义一下。
所谓核心骨架文章,指的是:
- 它本身是一个关键枢纽主题
- 它能连接多个后续主题
- 它的跨度不能过大,但要足够基础、足够关键
- 它写完之后,后面的细分文章就有了明确落点
换句话说,骨架文章不是“把所有东西一篇讲完”,而是:
先把柱子立起来。
后面更细的内容,比如:
- RTX 30/40 系列 NVENC 差异
- WebRTC 带宽估计算法
- AAC ADTS 头解析
- 某款摄像头 SDK 封装细节
都应该挂靠在这些主柱上,而不是一开始就散着写。
四、第一阶段必须先写稳的核心骨架
我希望这套专栏后续很大,但第一阶段不应该先全面铺开,而要先把最重要的主干定稳。
我把第一阶段的核心骨架,收成 16 篇主文章。
它们的特点是:
- 主题明确
- 单篇跨度可控
- 能形成完整主干
- 后续可以自然拆出更多支线
下面按模块给出正式题目。
A 组:总览与系统认知骨架
1. 如果面试官问你视频从采集到显示,你该怎么讲
定位: 全专栏总入口文章。
作用: 建立整条视频链路的整体画面,后续所有主题都可以回链到这篇。
不宜扩太大: 不展开算法细节,不深挖协议细节,不深入具体 API。
2. 音视频系统到底在处理什么:从数据形态到工程链路的整体认知
定位: 总览补强篇。
作用: 讲清原始数据、压缩数据、封装数据、网络传输数据、解码后数据分别是什么。
不宜扩太大: 不代替具体编码篇或协议篇。
B 组:图像基础与像素格式骨架
3. 从像素格式到色彩空间,系统理解 RGB、YUV、NV12 与 YUV420P
定位: 图像基础核心骨架。
作用: 统一解释像素格式、色彩空间、采样方式和常见工程格式。
不宜扩太大: 不深入 HDR、色彩管理全体系,不展开 GPU 渲染。
4. 为什么视频系统普遍偏爱 YUV:从采样、存储到编码输入的工程取舍
定位: 上一篇的补强与工程解释篇。
作用: 讲清 RGB 与 YUV 在视频工程里的根本差异。
不宜扩太大: 不展开编码器算法,不展开 OpenCV 全部色彩转换。
C 组:视频编码核心骨架
5. 从原始视频到压缩码流,彻底理解 H.264/H.265 的基础知识
定位: 编码基础篇。
当前状态: 已完成。
作用: 建立编码世界观。
6. 一文讲清 I 帧、P 帧、B 帧、GOP 与视频预测结构
定位: 预测结构独立骨架篇。
作用: 把 I/P/B 与 GOP 从“大而全的编码篇”里拆出来单独讲透。
不宜扩太大: 不展开 NALU、SPS/PPS、Annex B。
7. 从分块到 NALU,一文讲清 H.264/H.265 的编解码流程与码流结构
定位: 编解码流程核心篇。
当前状态: 已完成。
作用: 把流程和码流结构串起来。
8. SPS、PPS、VPS、Annex B、AVCC 到底是什么关系
定位: 码流组织独立骨架篇。
作用: 专门解决码流组织与参数集问题。
不宜扩太大: 不讲完整网络协议,不讲完整封装层。
D 组:音频基础骨架
9. 音频系统基础入门:采样率、位宽、声道数与 PCM 到底怎么理解
定位: 音频地基篇。
作用: 给整个专栏补齐音频底层认知。
不宜扩太大: 不展开 AAC 内部编码算法。
10. AAC 在音视频工程中的位置:从 PCM 到压缩音频的主线理解
定位: 音频编码骨架篇。
作用: 让专栏具备完整音视频链路,不再只有视频没有音频。
不宜扩太大: 不扩展 Opus/WebRTC 语音细节。
E 组:封装与时间戳骨架
11. 什么是容器,什么是码流:MP4、FLV、TS 与裸流不要再混了
定位: 封装层核心骨架。
作用: 解决“码流”和“容器”混淆问题。
不宜扩太大: 不展开完整 RTP 封装细节。
12. FFmpeg 时间戳体系入门:PTS、DTS、time_base 到底怎么理解
定位: 时间戳骨架篇。
作用: 这是后面 FFmpeg、封装、B 帧、弱网、同步问题的总入口。
不宜扩太大: 不讲完整同步算法。
F 组:协议与传输骨架
13. RTP、RTCP、RTSP 三者到底是什么关系
定位: 实时传输协议骨架篇。
作用: 给实时流媒体打地基。
不宜扩太大: 不展开 WebRTC 整体框架,不深入 jitter buffer 算法。
14. RTMP 与 WebRTC 的核心区别:为什么它们适合完全不同的场景
定位: 直播与实时互动分野篇。
作用: 帮助建立对不同协议体系的场景认知。
不宜扩太大: 不深入 ICE/STUN/TURN 全细节。
15. jitter、丢包、乱序与 jitter buffer:弱网下实时音视频到底在对抗什么
定位: 弱网与实时性骨架篇。
作用: 后续所有弱网优化文章都挂在这里。
不宜扩太大: 不把全部 WebRTC 拥塞控制都塞进来。
16. 从本地摄像头到网络推流,一条最小视频链路怎么搭起来
定位: 协议、编码、封装、推流的综合落地骨架篇。
作用: 把采集、编码、封装、推流、播放串成第一条最小实战链路。
不宜扩太大: 不加入完整车载、多路 AI、复杂弱网适配。
G 组:FFmpeg 与 GStreamer 骨架
17. 从 AVPacket 到 AVFrame,H.264/H.265 在 FFmpeg 中是如何承上启下的
定位: FFmpeg codec 层骨架篇。
当前状态: 已完成。
作用: 连接编码知识与 FFmpeg 工程主线。
18. FFmpeg filter graph 入门:从 scale、fps、overlay 到完整滤镜链
定位: 滤镜链骨架篇。
作用: 解决 frame 层处理和 filter 思维问题。
不宜扩太大: 不深入复杂自定义 filter 开发。
19. GStreamer 的 pipeline 思维是什么:它和 FFmpeg 的差别到底在哪
定位: GStreamer 骨架篇。
作用: 建立第二套主流媒体框架的系统观。
不宜扩太大: 不一上来就讲复杂插件开发。
H 组:采集、Camera Pipeline、车载与工程场景骨架
20. 熟悉视频采集设备,到底需要理解哪些关键问题
定位: 采集设备认知骨架篇。
作用: 讲清采集设备、格式、驱动、缓存和链路衔接。
不宜扩太大: 不展开完整车载链路。
21. Camera Pipeline 是怎么搭起来的:从 Sensor 到图像输出的主链路
定位: Camera pipeline 核心骨架篇。
作用: 讲清 sensor、ISP、格式转换、缩放、编码前处理等模块关系,把 Camera 从“设备”提升到“系统链路”层来理解。
不宜扩太大: 不把具体厂商 ISP 细节和所有驱动接口全塞进来。
22. Sensor 调试到底在调什么:曝光、帧率、格式、时序与稳定性问题怎么定位
定位: Camera 联调骨架篇。
作用: 把 sensor 调试从“玄学经验”整理成结构化问题域。
不宜扩太大: 不展开每一家 sensor 芯片寄存器手册。
23. 录像、拍照、回放三条业务链路,到底该怎么拆开理解
定位: 典型视频业务骨架篇。
作用: 讲清录像、抓拍、回放虽然都围绕视频数据,但链路重点和系统约束完全不同。
不宜扩太大: 不把播放器内核和完整文件系统实现全讲进去。
24. 车载摄像头视频链路是怎么跑起来的
定位: 车载方向核心骨架篇。
作用: 打出你自己的辨识度,把通用音视频知识拉回你的业务场景。
不宜扩太大: 不把所有车载产品形态和 AI 任务都塞进来。
25. 为什么音视频系统特别强调队列、缓冲区和背压机制
定位: 系统工程骨架篇。
作用: 解决“会写功能但不懂系统稳定性”的问题。
不宜扩太大: 不展开完整操作系统调度细节。
I 组:硬件加速、GPU 与推理骨架
26. 软编码和硬编码到底差在哪,不只是速度问题
定位: 编码实现路线骨架篇。
作用: 建立软编/硬编/延迟/画质/资源的 trade-off 认知。
不宜扩太大: 不展开所有厂商 API 细节。
27. 为什么不同型号显卡支持不一样:硬件编解码能力到底由什么决定
定位: 显卡能力差异骨架篇。
作用: 把 NVENC / NVDEC / QSV / VAAPI 等路线的差异认知立起来。
不宜扩太大: 不深入每一代显卡参数表。
28. 从视频帧到推理结果,OpenCV、CUDA、ONNX Runtime 怎么串成一条链路
定位: 视频 AI 工程骨架篇。
作用: 把视频处理、GPU、推理部署三块接起来。
不宜扩太大: 不把模型训练内容塞进来。
五、为什么核心骨架先定这 25 篇
看到这里,可能会觉得 25 篇还是很多。
但如果从整个音视频工程的大图来看,这 25 篇其实已经是刻意压缩后的结果。
因为它们刚好覆盖了下面这些真正不可缺的主柱:
- 总览与系统链路
- 图像基础
- 视频编码
- 音频基础
- 容器与时间戳
- 实时协议与弱网
- FFmpeg / GStreamer
- 采集与车载
- 硬编硬解与推理部署
更重要的是,它们的粒度已经尽量控制在:
- 一篇能讲透一个核心问题
- 又不会小到只剩一个零散知识点
所以从长期专栏角度,这一批足够像“主干”。
后续所有更细的文章,都可以作为这些骨架文章的支线继续展开。
六、核心骨架确定后,后续支线怎么长出来
骨架文章先写稳,不代表后面不深入。相反,后面真正深入的内容,应该作为“二级支线”继续长出来。
例如:
围绕第 15 篇,可以继续拆出:
- jitter buffer 的基本算法设计
- 自适应 jitter buffer 的思路
- WebRTC 弱网恢复常见机制
- 丢包、乱序、重传、NACK、FEC 的工程取舍
围绕第 18 篇,可以继续拆出:
- FFmpeg 中 scale 滤镜详解
- overlay 和 drawtext 的工程用法
- filter graph 中多输入多输出怎么走
- 硬件 filter 与软件 filter 的数据流差异
围绕第 21 篇,可以继续拆出:
- 车载系统中的录像链路
- 车载系统中的预览链路
- 抓拍与 AI 分析链路如何并行
- 车载视频系统的主链路与附属链路拆分
围绕第 25 篇,可以继续拆出:
- ONNX Runtime C++ 推理部署实践
- OpenCV 与 CUDA 图像预处理优化
- 视频流上的目标检测链路设计
- 推理结果叠加显示的渲染路径
也就是说,骨架不是终点,而是目录树的一级节点。
七、后续写作时的统一约束条件
为了让这个专栏持续写下去时不散,我给自己定一套统一约束。
7.1 每篇文章尽量回答 6 个问题
- 这个主题在整个音视频系统里处于哪一层
- 它解决什么问题
- 它和上下游模块怎么连接
- 工程里通常怎么落地
- 常见坑是什么
- 面试里该怎么讲
7.2 每篇至少包含以下内容中的 2 类以上
- 架构图
- 时序图
- 关键代码片段
- 常见问题排查图
7.3 每篇尽量采用统一结构
- 前言
- 问题背景
- 核心概念
- 主链路分析
- 工程落地
- 常见问题
- 面试表达
- 总结
7.4 优先写“高串联、高复用、高辨识度”的主题
优先级判断标准:
- 能连接多个模块的,优先
- 能服务面试表达的,优先
- 能体现你的方向特色的,优先
- 能自然延展出支线专题的,优先
7.5 文章之间尽量互相引用
这样整个专栏最终会更像一个知识网络,而不是单篇合集。
八、第一阶段的实际写作顺序建议
虽然核心骨架已经定了,但实际写作仍然需要有节奏。
如果按“先搭地基,再搭主干,再进入工程深化”的思路,我建议第一阶段优先按下面顺序推进。
第一批,先把总入口和最关键基础打稳
- 如果面试官问你视频从采集到显示,你该怎么讲
- 从像素格式到色彩空间,系统理解 RGB、YUV、NV12 与 YUV420P
- 一文讲清 I 帧、P 帧、B 帧、GOP 与视频预测结构
- 什么是容器,什么是码流:MP4、FLV、TS 与裸流不要再混了
- FFmpeg 时间戳体系入门:PTS、DTS、time_base 到底怎么理解
第二批,把实时传输主线搭起来
- RTP、RTCP、RTSP 三者到底是什么关系
- RTMP 与 WebRTC 的核心区别:为什么它们适合完全不同的场景
- jitter、丢包、乱序与 jitter buffer:弱网下实时音视频到底在对抗什么
- 从本地摄像头到网络推流,一条最小视频链路怎么搭起来
第三批,把工程辨识度打出来
- FFmpeg filter graph 入门:从 scale、fps、overlay 到完整滤镜链
- Camera Pipeline 是怎么搭起来的:从 Sensor 到图像输出的主链路
- Sensor 调试到底在调什么:曝光、帧率、格式、时序与稳定性问题怎么定位
- 录像、拍照、回放三条业务链路,到底该怎么拆开理解
- 车载摄像头视频链路是怎么跑起来的
- 软编码和硬编码到底差在哪,不只是速度问题
- 从视频帧到推理结果,OpenCV、CUDA、ONNX Runtime 怎么串成一条链路
这样推进,会比无差别铺开更稳。
九、这篇总纲在整个专栏中的位置
这篇文章本身不会去深入讲某个具体技术点。
它真正的作用,是成为后续整个音视频工程专栏的“目录页”和“路线约束”。
此外,Camera 这一大块后续我也会单独作为重点分支持续扩展,尤其包括:
- Camera pipeline 搭建
- Sensor 调试与联调方法
- ISP 前后图像链路理解
- 录像、拍照、回放三类业务链路拆分
- Camera 与编码、推流、AI 分析之间的衔接
后面再写新的文章时,我都可以回到这篇看两件事:
- 这个新题目属于哪根主骨架
- 它应该是骨架文章,还是某一骨架下的支线深化文章
这样一来,后续不管是写:
- RTSP
- RTMP
- WebRTC
- GStreamer
- AAC
- OpenGL
- CUDA
- ONNX Runtime
- 车载摄像头链路
- SDK 开发
- 弱网优化
都不会再是“临时起意写一篇”,而是在同一张地图里继续填图。
总结
如果后续这个专栏真的要一直写下去,那么最重要的一步,不是先把所有主题都写出来,而是先把主干定住。
这篇文章做的,就是这件事。
我最终把整个音视频工程长期专栏,先收敛成:
- 10 个一级模块
- 28 篇核心骨架文章
- 一套统一的写作约束条件
- 一套分阶段推进的写作顺序
后面所有更细的内容,都应该挂靠在这些骨架文章之下,持续扩展。
如果说之前的几篇文章是在“局部开工”,那么从这篇开始,这个系列才算真正进入:
按体系长期建设。