【从零手写播放器】第 1 章:走进音视频的世界
本系列教程将带你从零开始,系统学习音视频开发基础知识,并最终使用 FFmpeg C++ API + SDL2 构建一个功能完备的视频播放器。
1.1 音视频技术无处不在
在我们的日常生活中,音视频技术已经无处不在:
- 短视频/长视频平台:抖音、B站、YouTube —— 视频的录制、编码、上传、转码、分发、播放
- 直播:斗鱼、Twitch —— 实时采集、编码、推流、拉流、低延迟播放
- 视频会议:Zoom、腾讯会议 —— 实时音视频采集、编码、传输、解码、渲染
- 监控安防:海康威视 —— 7×24 小时不间断录制、存储、回放
- 流媒体:Netflix、爱奇艺 —— 自适应码率、CDN 分发、DRM 版权保护
- 游戏:游戏录屏、云游戏 —— 画面采集、低延迟编码传输
这些应用背后,都离不开一套核心的音视频技术体系。
1.2 音视频开发的技术栈全景图
音视频开发涉及的技术栈非常广泛,可以从以下几个维度来理解:
作为入门教程,我们将聚焦于框架层(FFmpeg)和应用层(播放器),同时在学习过程中自然地覆盖编解码层和封装层的核心知识。
1.3 一个视频文件从录制到播放的完整链路
理解一个视频文件的"一生",是入门音视频的关键。以一个 MP4 视频文件为例:
录制/采集阶段
摄像头 ──→ 原始视频帧(RGB/YUV)
麦克风 ──→ 原始音频数据(PCM)
摄像头以固定帧率(如 30fps)采集画面,每帧是一张完整的图像。麦克风以固定采样率(如 44100Hz)采集声音波形,输出 PCM 原始音频数据。
编码阶段
原始视频帧 ──→ [H.264 编码器] ──→ 压缩的视频数据(NAL Units)
原始音频数据 ──→ [AAC 编码器] ──→ 压缩的音频数据(AAC Frames)
原始数据量非常大。以 1920×1080 分辨率、30fps、YUV420P 格式为例:
- 每帧大小 = 1920 × 1080 × 1.5 ≈ 3.1 MB
- 每秒数据量 = 3.1 MB × 30 ≈ 93 MB/s
- 一分钟 = 93 × 60 ≈ 5.6 GB
这显然不可接受!编码器通过去除空间冗余(帧内压缩)和时间冗余(帧间压缩),可以将数据压缩到原来的 1/50 甚至更小。
封装阶段
压缩的视频数据 ─┐
├──→ [MP4 封装器] ──→ video.mp4
压缩的音频数据 ─┘
封装器将压缩后的音频和视频数据"打包"到一个容器文件中,同时记录时间戳、索引信息等元数据,使播放器能够正确地同步和定位。
播放阶段(本教程的重点)
播放是上述过程的逆过程:
我们的最终目标,就是用代码实现上述播放流程的每一个环节。
1.4 我们要用到的工具
FFmpeg
FFmpeg 是世界上最强大的开源多媒体框架,几乎所有的视频播放器(VLC、PotPlayer、各大视频网站的播放器)底层都在使用 FFmpeg。它提供了:
- 命令行工具:
ffmpeg(转码)、ffprobe(分析)、ffplay(播放) - 开发库:libavformat、libavcodec、libswscale 等,提供 C API 供我们调用
本教程使用 FFmpeg 的 C API 进行开发(在 C++ 项目中调用)。
SDL2
SDL2(Simple DirectMedia Layer)是一个跨平台的多媒体库,提供了:
- 窗口管理和 2D 渲染
- 音频播放
- 事件处理(键盘、鼠标)
我们用 SDL2 来做视频帧的渲染显示和音频的播放输出。
开发语言
本教程使用 C++17,在调用 FFmpeg C API 的基础上,利用 C++ 的 RAII、智能指针、线程库等特性编写更安全、更清晰的代码。
1.5 本教程的学习路线
整个教程分为五大部分,由浅入深:
第一部分:音视频基础知识(第 1-4 章)
理解视频、音频、容器格式的核心概念
│
▼
第二部分:FFmpeg 开发环境与核心概念(第 5-7 章)
搭建环境,掌握 FFmpeg 核心数据结构和工作流程
│
▼
第三部分:音视频解码实战(第 8-11 章)
学会视频解码、音频解码、SDL2 渲染和音频播放
│
▼
第四部分:构建视频播放器(第 12-16 章)
多线程架构、音视频同步、播放控制、完善 UI
│
▼
第五部分:进阶与扩展(第 17-18 章)
字幕、硬件加速、网络流等进阶话题
最终成果
学完本教程后,你将拥有一个自己亲手编写的视频播放器,具备以下功能:
- 打开并播放本地视频文件
- 音视频同步播放
- 暂停/恢复
- 快进/快退(Seek)
- 音量调节
- 进度条显示与拖拽
- 窗口缩放与画面自适应
1.6 学习前的准备
在正式开始前,请确保你具备以下基础:
| 前置知识 | 要求程度 |
|---|---|
| C/C++ 编程 | 熟悉基本语法,了解指针、内存管理 |
| C++ 多线程 | 了解 std::thread、mutex、condition_variable 的基本用法 |
| Linux 基本操作 | 能使用终端、编译运行程序 |
| CMake | 了解基本用法(不熟悉也没关系,教程中会讲解) |
如果你暂时不满足上述条件,也不用担心——在后续章节中,我会对涉及的 C++ 特性和工具做必要的讲解。
小结
本章我们了解了:
- 音视频技术在各个领域的广泛应用
- 音视频开发技术栈的全景图
- 一个视频文件从录制到播放的完整链路
- 本教程将使用 FFmpeg + SDL2 + C++ 构建视频播放器
- 整个教程的学习路线规划
下一章,我们将深入学习视频的基础知识——理解分辨率、帧率、色彩空间、编码压缩等核心概念。