🎬 FFmpeg入门详解——流媒体直播原理及应用
照着《FFmpeg入门详解——流媒体直播原理及应用》(梅会东 编著,清华大学出版社)做的自学笔记 —— 「FFmpeg 音视频流媒体系列」三部曲**第二部**。姊妹篇《音视频原理及应用》讲的是「画面怎么压成码流」,这一册讲的是「压好的码流怎么送到观众眼前」——一本管编码,一本管传输与分发,两本合起来才是完整的 FFmpeg 技术栈。全书 14 章 146 篇:第 1 章铺底(流媒体为什么能边下边播、直播延迟花在哪);第 2~6 章逐个拆协议——RTSP 遥控器、RTP/RTCP 送货车、RTMP 块流、HLS 切片、HTTP-FLV,TS 的 188 字节包和 FLV 的 Tag 里装了什么全部真解析;第 7 章流媒体开源库;第 8~12 章用五个开源服务器真搭直播平台(Live555、EasyDarwin、Nginx-rtmp、SRS、ZLMediaKit);第 13 章 WebRTC 网页直播;第 14 章综合案例。这本是协议分析课:沙箱里装了 PyAV,真编码、真封装 TS/FLV、真切 HLS、真解析包结构都能实测;需要真服务器的部分用【📋 实操路径】单列完整命令与验证方法。教材实操基于 Ubuntu 18/CentOS 7 与 2019 年前后的软件版本,凡与现状不同处各篇用【⚠️ 2026 现状】单列(Flash 已停用、SRS 6.0 配置差异、ZLMediaKit 改 CMake 等)。大白话、不跳步骤、必带生活比喻、常见误区、可折叠自测题。
前置课程:FFmpeg入门详解——音视频原理及应用(同一系列第一部)、计算机网络、服务器工作原理、Web技术原理。
内容来自我的 Obsidian 自学笔记 · 全 14 章 146 篇完结 ✅
第一章 流媒体与直播基础理论
流媒体简介
下载完再播 4.25 秒才开、流媒体 1…
TCP的三次握手与四次挥手
建连 1 个 RTT、关闭 2 个 RT…
视频流协议与编解码器
三档 CRF 码率 3594/419/3…
常见的流媒体协议
真切 HLS:5 秒素材按 2 秒切出…
视频直播原理与流程
720p 每帧编码 5.8 毫秒,只占总…
通用的视频直播模型
1/4/16 路拉同一份 3 MB,服务…
视频直播系统的模块
真跑编码→TS→HTTP→拉流解码,50…
第二章 RTSP流媒体协议
RTSP支持
一条 OPTIONS 问出 8 个方法…
RTSP特点
一条连接连发四条都走通;有状态所以能 P…
请求消息
请求只有 3 行骨架、无体;必填头域只有…
应答消息
8 个状态码够用;454 Session…
RTSP交互流程
四步走完手上多三样:SDP、Transp…
RTSP重要概念
URL/Session/CSeq/Tra…
RTSP重要方法
PLAY 与 PAUSE 可任意来回,T…
客户端状态机
五个状态四条边;Ready 不是空闲,在…
服务器端状态机
会话表/连接表/流表三张表;心跳回了 2…
VLC作为RTSP流媒体服务器
四步握手总共才 647 字节;真发 2…
安装Wireshark
pcap 全局头 24 字节 + 记录头…
Wireshark抓取本地localhost的包
回环不进网卡所以抓不到;四条请求上行 2…
使用Wireshark抓包分析RTSP交互流程
12 行时间线全落在 1.1 毫秒内;四…
RTSP与HTTP
同样 10 条命令,复用连接比每次新建快…
SDP
m=/a=rtpmap/a=contro…
第三章 RTP与RTCP流媒体协议
RTP格式
固定头 12 字节九字段;序号按包加、时…
RTP封装H.264
720p 真编 405 个 NAL,32…
RTP的会话过程
一路流从 SETUP 到 BYE 的四段…
RTP的抓包分析
三层头共 54 字节,小包开销五成以上…
RTCP的5种分组类型
SR/RR/SDES/BYE/APP 五…
RTCP包结构
SR 里 NTP 与 RTP 时间戳配对…
RTCP的注意事项
总带宽 5%,其中 25% 给发送方、7…
RTCP的抓包分析
复合包 RR+SDES 48 字节;遍历…
RTP/RTCP与RTSP的关系
遥控器/送货车/回执三分工;554 固定…
Windows10+VS2015编译JRTPLIB
两包四步,先编 jthread 再编 j…
Ubuntu18编译JRTPLIB
三个同名 .so 各管一头;链接用无版本…
使用VS2015搭建JRTPLIB开发环境并收发包案例
五步骨架四步是配置;三个必错点都不报错…
RTP与H.264的相关结构体
字段 12 字节 sizeof 却是 1…
使用JRTPLIB发送H.264码流
245 个 NAL 变 261 包,重组…
RTP单扩展头
X 位一置就多 4+N 字节;长度单位是…
RTP多扩展头
区别只在 profile:单向 4 位…
第四章 RTMP流媒体协议
RTMP简介
1935 单连接多路复用;延迟大头在等关…
RTMP握手
六个包 3073 字节;C2 与 S2…
RTMP建立连接
connect 用 AMF0,87 字节…
RTMP建立流
连接管通不通、流管搬什么;streamI…
RTMP播放
onStatus 事务号恒为 0,配不上…
RTMP相关名词解释
连接/流/消息/块四层;csid 是车道…
直播推流
只有 8/9/18 三种消息;RTMP…
直播拉流
首屏大头是等关键帧;GOP 压到 1 秒…
RTMP块流
调大块省的不是带宽而是块数:20 KB…
消息块格式
基本头+消息头+扩展+载荷;流 ID 是…
块基本头
1/2/3 字节三种;64 加第二字节…
块消息头
11/7/3/0 四种格式;六块连发省…
扩展时间戳
3 字节只有 4.66 小时;填满 1…
消息分块流程解析
同 csid 保序、跨 csid 任意交…
协议控制消息
五种,都走 csid 2 与流 0;Se…
用户控制消息
外层类型 4 加内层事件号;Stream…
其他消息类型
负载就是 FLV tag 数据体;聚合消…
第五章 HLS流媒体协议
HLS 的索引文件的嵌套
主列表 150 字节、媒体列表写切片;主…
HLS 服务器端和客户端工作流程
取列表 157 字节 + 3 个切片 1…
HLS 优势及劣势
延迟 = 切片时长 ×(回溯 + 缓冲)…
HLS 主要的应用场景
四步起播 280 毫秒;13 秒的 HL…
m3u8 简介
三个切片总时长 12.0 秒;TARGE…
HLS 播放模式
窗口 3 个喂 7 片:序号从 0 滑到…
TS 文件
9588 = 51 × 188 余 0…
m3u8 格式讲解
标签分五类、常用不到十个;DISCONT…
ES、PES、PS、TS
四层开销 0/14/4 字节;TS 头占…
PS/TS 编码基本流程
125 字节 NAL → 140 字节…
PS/TS 码流小结
1 MB 数据 TS 头 22 KB、P…
TS 包格式
51 个包 PUSI 45 个;连续计数…
TS 码流分析工具
25 包 25 帧、2 个关键帧;最大/…
TS 码流结构分析
PAT 16 字节给出 PMT 的 PI…
PAT 及 PMT 表格式
CRC32 用 MPEG-2 算法 0x…
PS 码流结构
pack 头 20 字节带 SCR;不是…
PS 码流的解析流程
447 字节走成 14+209+129+…
TS 格式与 m3u8 切片
真切 2 片共 17296 字节,各自整…
第六章 HTTP-FLV流媒体协议
HTTP FLV 协议简介
一条连接一个请求拿完;延迟只有一个 GO…
HTTPS 简介
握手 2 RTT 对 1 RTT;AES…
HTTP 请求内容
最小请求 89 字节;必填头只有 Hos…
HTTP 响应内容
小响应头比体长十倍;直播给不了 Cont…
URL 简介
七段各有默认值;没写端口时是 None…
FLV 格式解析
9 字节头加 4 字节长度;2784 字…
FLV 的重要 Tag 说明
首字节 0x17 是关键帧加 H.264…
第七章 流媒体开源库简介
FFmpeg 的模块与命令行工具
FFmpeg 不是「一个程序」,而是一组…
FFmpeg 命令行
难点不在参数多而在参数放的位置;同一个…
FFmpeg 开发包
开发包就是「头文件 + 库文件」,让你不…
Live555
只做一件事:用单线程事件循环跑 RTSP…
VLC 播放器
播放链路只有五段:取字节、拆容器、解编码…
VLC 的功能列表
功能看着很多,归类只有四组;真正决定能不…
VLC 播放网络串流
播网络流只要一个地址,或用一份 m3u…
EasyDarwin 开源项目
骨架来自苹果的 Darwin Strea…
EasyDarwin 商业项目
商业版多出来的不是协议,而是运维能力:集…
EasyDarwin 云平台
成本拆成接入、转发、存储三层;存储是唯一…
SRS
国产开源流媒体服务器里用得最广的一个;核…
ZLMediaKit
卖点是「一进多出」:一路流推上去,五种协…
WebRTC 架构
分三层:应用层给 API、引擎层管音视频…
视频分析
视频链路六段,延迟大头在抖动缓冲;帧大小…
声频分析
音频一包 20 毫秒,是「头部开销」与「…
浏览器支持
同一路流,不同浏览器能给的播放能力完全不…
组成部分
暴露给 JavaScript 的只有三个…
重要 API
一次握手六步:offer、setLoca…
第八章 Live555搭建直播平台
Live555 实现本地视频推流
不是读得快而是按帧率等;720p 201…
openRTSP 客户端流程
五步 426 字节上行、825 字节下行…
Live555 在 Ubuntu 下的源码编译
拓扑排序定编译次序;COMPILE_OP…
Live555 在 Windows 10 下的源码编译
改 win32config 不跑 con…
Live555 点播服务器流程分析
OnDemand 是没人看就不干活;九个…
第九章 EasyDarwin搭建直播平台
主体框架
一个主程序加一张服务表;启动 1.8 毫…
模块分类
按数据流向分四类;转发 1/2/4 路字…
EasyDarwin 的安装部署
配置、端口、容量三件事先查;554 在…
第十章 Nginx搭建直播平台
Nginx 项目简介
1/2/4 个 worker 跑 200…
Windows 10 下安装 Nginx
解压即用不是安装;worker 数等于核…
Windows 10 下安装 OpenSSL
真生成自签证书与握手;TLS 1.3 套…
Ubuntu 18 下安装 Nginx
真解析 nginx -V:13 个参数里…
CentOS 8 下安装 Nginx
dnf 装完还要看 systemd;句柄…
Ubuntu 18 下编译 nginx-rtmp-module
三份源码凑一起;make 成功不等于编好…
Ubuntu 18 下编译 nginx-http-flv-module
加强版与 rtmp 模块指令重名 25…
Windows 10 下编译 nginx-http-flv-module
四样工具缺一不可且报错都在后半段;多数组…
Nginx 配置文件结构
真解析出 8 个块的树:http 与 r…
Nginx 配置文件的指令解析
not allowed here 与 u…
Nginx 配置文件关于 nginx-rtmp-module 配置指令详细讲解
地址里那一段就是 application…
第十一章 SRS搭建直播平台
SRS 项目简介
同样25帧:FLV 10503/TS 1…
在 Ubuntu 18 上安装 SRS
25 个 configure 选项:7…
在 CentOS 7 上安装 SRS
六个依赖本机只找到两个;GCC 4.8…
SRS 集群简介
单机直出要 19.5 Gbps;20 个…
SRS 集群配置
cluster 按 vhost 配不按机…
配置文件的组成结构
17 个键里写了 11 个,只有 6 个…
srs.conf
真解析出 8 个块 20 个键值,最深两…
ingest.conf
2/4/3 秒三个文件排一轮 9 秒;一…
hls.conf
1/2/5 秒切出 10/5/2 片;关…
编译支持 WebRTC 的 SRS
两个 IP 里一个是回环;UDP 800…
推送 RTMP 视频流
真跑一遍:握手上下各 3073,全程上行…
WebRTC 播放视频流
一次交换 658 收 734 字节;of…
第十二章 ZLMediaKit搭建直播平台
Windows 编译配置 ZLMediaKit
五个工具命令缺三个;CMakeLists…
Linux 编译安装 ZLMediaKit
串行 1.5 秒并行 7.5 秒,8 个…
test_httpApi.cpp 文件
真发 getMediaList:请求 1…
test_pusher.cpp 文件
时间轴 960 毫秒实测 961;每帧晚…
lambda 函数介绍
三种写法:全 2、0/1/2、0/1/2…
第十三章 WebRTC网页直播
WebRTC 项目简介
1000 包收发字节一致;UDP 省的是…
NAT 穿透
先发再收才开得了口;锥形 40128→4…
STUN 与 TURN
请求 20 字节回 32 字节,往返 8…
基于 Coturn 项目的 STUN/TURN 服务器搭建
17 行配置 13 条带值 4 条开关…
搭建信令服务器 SignalMaster
RFC 握手样例一字不差;key 24…
安装 Web 服务器 Nginx
六种 MIME 里 .js 与 .m3u…
创建基于 WebRTC 的网页视频会话
offer 3 个视频编码 answer…