跟着 OBS 学音视频
# 跟着 OBS 学音视频
一套面向零基础初学者的音视频入门课程,以开源项目 OBS Studio (opens new window) 的真实源码为活教材。 不需要任何专业音视频背景,我们从「一张图片、一段声音」讲起,每一个概念都带你回到 OBS 的真实代码里印证。
# 这门课为谁而写
- 想入门音视频,却被一堆术语(YUV、码率、I 帧、RTMP……)劝退的开发者
- 会一点 C / C++,想看懂一个工业级音视频项目是怎么搭起来的人
- 用过 OBS,好奇「点一下『开始直播』,屏幕上的画面到底经历了什么」的人
# 一条主线
整门课只围绕一句话展开:
一帧画面 / 一段声音,是如何从「采集 → 合成 → 编码 → 封装 → 推流 / 录制」走完整条流水线的。

# 每一课的结构
每课固定三步走,概念不悬空、源码不照搬、学完能验证:

# 课程路线图

# 目录
# 模块 0 · 开始之前
建立全局地图,把环境跑起来,消除「源码这么大从哪看」的恐惧。
- 第 0 课:开篇 —— 课程地图与一条主线 ✅
- 第 1 课:认识 OBS 与它的源码全景 ✅ —— 编译运行 + 目录全景
# 模块 1 · 音视频的「原材料」
在碰 OBS 复杂代码前,先建立对像素和声波的物理直觉。
- 第 2 课:视频的本质就是连续的图片 ✅ —— 像素、分辨率、帧、帧率
- 第 3 课:颜色是怎么被存进电脑的 ✅ —— RGB、YUV、色彩空间
- 第 4 课:声音的本质就是一串数字 ✅ —— 采样率、位深、声道、PCM
- 第 5 课:裸数据有多可怕 ✅ —— 体积计算,引出「为什么必须编码」
# 模块 2 · OBS 的世界观(核心架构)
理解 OBS 用哪几个核心概念把整个系统组织起来。这是读懂后续一切的钥匙。
- 第 6 课:一切皆 Source(源) ✅ ——
obs_source抽象 - 第 7 课:对象怎么生、怎么死 ✅ —— 引用计数、弱引用、
obs_data - 第 8 课:模块之间怎么说话 ✅ —— 信号与回调(signal / proc handler)
- 第 9 课:插件是怎么被加载的 ✅ —— 模块系统
obs_module
# 模块 3 · 画面是怎么来的(视频链路)
跟着一帧画面,走完采集 → GPU 处理 → 合成 → 输出的全过程。
- 第 10 课:采集第一帧画面 ✅ —— 屏幕 / 摄像头采集
- 第 11 课:GPU 与图形子系统 ✅ —— 纹理、D3D11 / OpenGL / Metal 后端
- 第 12 课:给画面加特效 —— 滤镜与着色器 ✅ ——
.effect - 第 13 课:场景与合成 ✅ —— scene / scene item
- 第 14 课:从合成结果到一帧成品 —— 视频管线与转场 ✅ —— video-io 输出管线、转场
# 模块 4 · 声音是怎么处理的(音频链路)
理解音频这条与视频并行、却必须严丝合缝对齐的流水线。
- 第 15 课:采集声音 —— 系统声音与麦克风 ✅ —— WASAPI、
obs_source_output_audio - 第 16 课:混音与「对齐」—— 多路混合、音视频同步 ✅ ——
mix_audio、缓冲对齐、A/V 同步 - 第 17 课:音量、电平表与监听 —— fader / volmeter ✅ —— dB、推子曲线、峰值/RMS、监听
# 模块 5 · 压缩:编码
把「为什么必须压缩」讲透,并认识编码器。
- 第 18 课:视频为什么能被压缩这么狠 —— I/P/B 帧、关键帧、GOP ✅ —— 冗余、帧类型、关键帧、GOP
- 第 19 课:编码器的统一接口 ——
obs_encoder✅ ——obs_encoder_info登记表、x264 vs NVENC 同表 - 第 20 课:视频编码器实战对比 —— x264 vs NVENC / QSV ✅ —— CPU vs 显卡芯片、preset、怎么选
- 第 21 课:音频编码与码率怎么选 —— AAC / Opus、CBR / VBR ✅ —— 音频编码、码率、CBR/VBR/CQP
# 模块 6 · 打包与送出(输出链路)
编码后的数据如何被装进文件或发往直播服务器。
- 第 22 课:容器格式 —— MP4 / MKV / FLV / TS,
obs_output✅ —— 容器vs编码、封装、obs_output - 第 23 课:录制到文件 —— mux 复用 ✅ —— 子进程、libavformat 三部曲、多轨
- 第 24 课:推流到服务器 —— RTMP 协议 ✅ —— RTMP 背景、连接握手、FLV、丢帧保命
- 第 25 课:直播平台是怎么接入的 ——
obs_service✅ —— 数据驱动、services.json、OAuth(模块 6 完)
# 模块 7 · 把它们串起来(前端与全链路)
从界面视角回看全局,然后完整走一遍数据旅程。
- 第 26 课:界面是怎么搭起来的 ——
OBSApp、OBSBasic✅ —— Qt 背景、启动序列、UI↔引擎双向桥 - 第 27 课:界面如何驱动引擎 ——
obs-frontend-api、属性面板 ✅ —— 稳定API/门面、事件回调、数据驱动UI - 第 28 课:全链路总复盘 —— 追踪一帧的完整旅程 ✅ —— 一帧的一生、全课收官(模块 7 完)
# 模块 8 · 动手与进阶
从「读懂」走向「能改」,并指明继续深入的方向。
- 第 29 课:写你的第一个插件 —— 一个简单的视频滤镜 ✅ —— 从零搭一个亮度滤镜(6 块拼图)
- 第 30 课:不写 C++ 也能扩展 —— Lua / Python 脚本 ✅ —— 脚本=调 libobs API、SWIG、魔法函数
- 第 31 课:接下来去哪 —— 调试、读源码方法、进阶主题地图 ✅ —— 万能钥匙、日志调试、进阶地图(全课完 🎉)
# 约定
- 源码引用统一写作
路径:行号的形式(如libobs/obs.h:57),方便对照阅读。 - 本课程基于的源码版本:
libobsAPIv32.0.4(见libobs/obs-config.h)。
⚠️ 关于向上游贡献:OBS 官方在
CONTRIBUTING.rst中明确不接受主要由 AI 生成的代码提交。本课程把源码当作学习材料来阅读和讲解,与「提交 AI 生成的 PR」是两回事 —— 请勿将课程里的演示代码不加理解地提交到上游。
上次更新: 2026/07/14, 21:26:15
本留言区仅对应当前文章,欢迎补充观点、提出问题或帮助修正文中疏漏。 留言由 GitHub/Gitalk 提供,需要使用 GitHub 登录。
社区交流
讨论与留言