文章目录
- 直播应用原理
-
- 一、直播基本架构
- 二、推流端原理
-
- 2.1 采集
- 2.2 编码/封装
- 2.3 推流
- 三、服务器原理
-
- 3.1 转码
- 3.2 协议转换
- 3.3 CDN 分发
- 四、播放端原理
-
- 4.1 拉流
- 4.2 解码/播放
- 五、开播到观看的流程
- 六、直播应用开发任务总览
直播应用原理
一、直播基本架构

直播架构从宏观上分为三端:
- 推流端:采集 → 编码/封装 → 推流
- 服务器端:转码 → 协议转换 → 分发
- 播放端:拉流 → 解码 → 播放
二、推流端原理
2.1 采集
调用设备 API 获取原始音视频数据:
- 视频采集:摄像头输出原始图像数据(YUV 格式),一帧 = 一张图片
- 音频采集:麦克风采集 PCM 原始音频数据(Pulse Code Modulation,原始波形)
2.2 编码/封装
编码
音视频采集后,原始数据量极大,视频(1080P)180MB/秒,音频 88KB/秒,这种数据量非常不适合网络传输,所以需要对数据进行压缩,压缩后的数据可以减少百倍,这个压缩的过程就是编码。
常用的编码格式:
| 视频 | H.264 / H.265 | 删除人眼不敏感的细节,大幅压缩 |
| 音频 | AAC / MP3 | 删除人耳听不到的声音 |
封装
因为音视频是通过摄像头和麦克风两个独立的设备分开采集的,它们有各自的时间戳,为了让它们能够同步,所以需要将其捆绑到一起,这个捆绑的过程就是封装。
常见的封装协议:FLV、MP4、TS、MOV 等
2.3 推流
将封装好的数据以特定协议发送到推流服务器,常见的协议:RTMP、WebRTC、自研协议。
三、服务器原理
将推送过来的数据按照协议(如:RTMP、WebRTC)进行解析,解析后需要对视频流转码和协议转换,最后进行分发,这种服务器称为推流服务器。推流服务器可以自研,也可以使用第三方提供的。
3.1 转码
适配不同网络状况的用户:
原始流(1080p 8Mbps)
↓ 转码
├── 1080p(光纤/WiFi,高清用户)
├── 720p(4G 网络,流畅用户)
└── 480p(弱网,省流量用户)
注意:只能"向下"转,1080p 可以转成 720p,但 720p 不能变成 1080p。
3.2 协议转换
假设推流时,推流端将音视频封装为 FLV 协议,并通过 RTMP 协议发送到服务器。服务器解析 RTMP 后得到的是 FLV 数据,而不同播放设备支持的协议不同,所以需要从 FLV 中取出原始音视频数据(编码压缩后的数据),并重新封装成各种播放端支持的不同协议。
3.3 CDN 分发
通过前面的 转码和协议转换后,数据变为多份,服务器将多份数据分发到全国各地 CDN 节点,用户就近拉取,减少延迟。
假设同一个直播,转成 3个码率 × 2种协议 = 6种流,全部需要推到 CDN 备着:
推流端编码压缩后的音视频流(1080p)
│
├── 1080p ──> Android 支持的协议 ──────> CDN
│ │
│ └── IOS支 持的协议 ─────────> CDN
│
├── 720p ──> Android 支持的协议 ──────> CDN
│ │
│ └── IOS支 持的协议 ─────────> CDN
│
└── 480p ──> Android 支持的协议 ──────> CDN
│
└── IOS支 持的协议 ─────────> CDN
四、播放端原理
4.1 拉流
播放端主动拉取(长连接):
播放端 ────────── HTTP 请求 ──────────> CDN
<───────── TCP 长连接 <─────────
持续返回数据流(不断开)
4.2 解码/播放
从 CDN 拉取到数据后,需要根据数据的协议,从数据中解析出音视频(推流端编码压缩后的数据),然后将压缩后的音视频进行解码,还原成原始的音视频,然后将视频帧送到GPU,将音频帧送到声卡,进行播放。
解码这个过程分为:
- 硬解码:利用 GPU,速度快,但需要硬件支持
- 软解码:利用 CPU,速度慢
五、开播到观看的流程

1. 主播申请开播,服务器返回房间号
↓
2. 前端拿到房间号,拼出推流地址,如:rtmp://push.xxx.com/房间号
↓
3. 主播端用推流地址连接服务器,开始:采集 + 编码 + 封装 + 推流
↓
4. 服务器接收流数据,转码 + 协议转换 + 发送到 CDN,发送到 CDN 前需要根据房间号计算拉流地址,如:http://pull.xxx.com/room123.flv
↓
5. 观众进入直播间,服务器或前端根据主播房间号和观众设备,返回 CDN 拉流地址
↓
6. 观众拉流,开始观看
六、直播应用开发任务总览
直播应用开发中,分为底层技术(采集+编码+封装+推流+转码+协议转换+播放)和业务。
业务取决于自己的需求,比如:房间管理,开/停播流程、UI界面、鉴权等。
底层技术其实都有现成的方案,不需要自己开发,调用即可,以下是底层技术常用的技术栈:
- Android:
- 推流端:
- CameraX(采集音视频)+ FFmpeg-kit(编码、封装、推流)
- 播放端:
- 播放器:IJKPlayer、ExoPlayer、MediaPlayer
- 推流端:
- IOS:
- 推流端:
- AVFoundation(采集音视频)+ FFmpeg-kit(编码、封装、推流)
- 播放端:
- 播放器:AVPlayer、AVKit、IJKPlayer
- 推流端:
- Web:
- 推流端:
- MediaDevices API(采集音视频)+ FFmpeg.wasm(编码、封装、推流)
- 一站式库(采集 + 编码 + 封装 + 推流):Agora SDK(声网) / TRTC SDK(腾讯) / RTC SDK(字节)
- 播放端:
- flv.js / HLS.js / video.js / 厂商 SDK
- 推流端:
- 服务器(接收、转码、协议转换、自身CDN):
- 开源:SRS、ZLMediaKit
- 第三方云服务器:亚马逊、阿里云、腾讯云
- 自研(大厂做法,难度极大)



