【从零手写播放器】第 1 章:走进音视频的世界

0 阅读5分钟

【从零手写播放器】第 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++ 特性和工具做必要的讲解。

小结

本章我们了解了:

  1. 音视频技术在各个领域的广泛应用
  2. 音视频开发技术栈的全景图
  3. 一个视频文件从录制到播放的完整链路
  4. 本教程将使用 FFmpeg + SDL2 + C++ 构建视频播放器
  5. 整个教程的学习路线规划

下一章,我们将深入学习视频的基础知识——理解分辨率、帧率、色彩空间、编码压缩等核心概念。