一、推流基础概念:什么是推流?直播推流的整体架构
大家好,我是你们这趟 FFmpeg 推流之旅的向导。今天咱们聊点最基础,但也最核心的东西——推流到底是什么?
说白了,推流就是把你在电脑或手机上采集到的画面和声音,实时地、连续地发送到服务器上去。你想想看,平时看直播,主播那边的画面为什么能几乎同步到你手机上?靠的就是这个“推”的动作。
我记得刚入行那会儿,有个同事把推流和拉流搞混了。他问我:“为什么我往服务器发数据,观众还是看不到?”我告诉他,你只负责把数据“推”上去,观众那边得从服务器“拉”下来。一个主动,一个被动,方向完全不同。
核心一句话:推流是直播的“源头活水”,没有推流,后面所有环节都是空谈。
1.1 直播推流的整体架构
一个完整的直播系统,其实就五个环节:采集 → 编码 → 推流 → 分发 → 播放。我习惯把这五个环节比作一条流水线,任何一个环节出问题,观众看到的都是“卡顿”或“黑屏”。
下面这张图,是我自己画的一个架构图,你可以先有个整体印象:
1.2 每个环节到底在干什么?
咱们一个一个拆开来看。我尽量用大白话讲,但该有的技术细节一个都不会少。
1. 采集
采集就是获取原始的音视频数据。视频来自摄像头、屏幕录制或本地文件;音频来自麦克风、系统声音或混音。
嗯,这里要注意:采集到的数据是未经压缩的。比如一个 1080p 的画面,一帧就有好几 MB,直接传的话,带宽根本扛不住。所以必须压缩。
我的经验:采集环节最容易出问题的是设备兼容性。我曾经在项目中遇到过,某款 USB 摄像头在 Windows 上能正常采集,换到 Linux 上就死活认不出来。后来发现是驱动问题,换成 V4L2 接口才搞定。
2. 编码
编码就是把原始数据压缩成更小的体积。视频编码最常用的是 H.264,音频编码最常用的是 AAC。
为什么需要编码?我给你算笔账:
| 分辨率 | 原始数据(30fps) | H.264 编码后 | 压缩比 |
|---|---|---|---|
| 1080p | ~1.5 Gbps | ~4-8 Mbps | 约 200:1 |
| 720p | ~700 Mbps | ~2-4 Mbps | 约 200:1 |
| 480p | ~300 Mbps | ~1-2 Mbps | 约 200:1 |
你看,不编码的话,1.5 Gbps 的带宽,普通家庭宽带根本撑不住。编码之后降到几 Mbps,这才有了直播的可能。
3. 推流
编码完的数据,需要封装成某种协议,然后发送到服务器。这就是推流。
常见的推流协议有:
- RTMP:Adobe 家的老牌协议,延迟低,兼容性好,目前最主流。
- SRT:基于 UDP 的协议,抗丢包能力强,适合不稳定的网络环境。
- RTSP:常用于安防监控和 IP 摄像头。
- HLS:苹果家的协议,基于 HTTP,延迟较高,但穿透性好。
避坑指南:我曾经在项目中用 RTMP 推流,结果发现服务器端只支持 HLS 拉流。推上去的 RTMP 流,服务器需要转封装成 HLS 才能分发给观众。这个转封装过程会引入额外延迟,如果你做的是低延迟直播(比如互动连麦),一定要提前确认协议链路的兼容性。
4. 分发
服务器收到推流后,不会只发给一个观众。它会通过 CDN(内容分发网络)把流复制到多个边缘节点。观众从离自己最近的节点拉流,这样延迟最低,体验最好。
分发环节的核心是“就近调度”和“负载均衡”。你想想看,如果所有观众都从同一个服务器拉流,那台服务器早就被挤爆了。
5. 播放
最后一步,观众打开播放器,从 CDN 边缘节点拉取流数据,解码、渲染,最终看到画面、听到声音。
播放器需要支持对应的协议和编码格式。比如你推的是 RTMP + H.264 + AAC,那播放器就必须能解析 RTMP 协议,并解码 H.264 和 AAC。
1.3 推流与拉流的区别
很多新手容易把这两个概念搞混。我直接给你列个表,一目了然:
| 对比项 | 推流 | 拉流 |
|---|---|---|
| 方向 | 从客户端到服务器(上行) | 从服务器到客户端(下行) |
| 主动方 | 推流端(主播) | 拉流端(观众) |
| 协议 | RTMP、SRT、RTSP | HLS、DASH、RTMP |
| 带宽要求 | 上行带宽(通常较小) | 下行带宽(通常较大) |
| 典型场景 | OBS 推流到服务器 | 播放器从 CDN 拉流 |
说白了,推流是“送”,拉流是“取”。你作为主播,负责把数据送上去;观众负责从服务器取下来看。
1.4 一个简单的推流命令
说了这么多理论,咱们来点实际的。用 FFmpeg 推流,其实就一行命令:
ffmpeg -re -i input.mp4 -c:v libx264 -b:v 2000k -c:a aac -b:a 128k -f flv rtmp://your-server/live/stream-key
我来拆解一下这条命令:
-re:以原始帧率读取输入文件,模拟实时推流。不加这个参数,FFmpeg 会以最快速度处理完,那就不是直播了。-i input.mp4:输入文件,可以是本地视频、摄像头设备或网络流。-c:v libx264:视频编码器,用软件编码 H.264。-b:v 2000k:视频码率,设为 2 Mbps。-c:a aac:音频编码器,用 AAC。-b:a 128k:音频码率,设为 128 kbps。-f flv:封装格式,RTMP 推流通常用 FLV 封装。rtmp://...:推流目标地址。
我的建议:刚开始学推流,别一上来就推摄像头。先用本地视频文件测试,把命令跑通了,再换成摄像头设备。这样排查问题会容易很多。
1.5 本章小结
好了,咱们把推流的基础概念和整体架构捋了一遍。总结一下:
- 推流就是实时发送音视频数据到服务器。
- 直播系统由采集、编码、推流、分发、播放五个环节组成。
- 编码是压缩的关键,没有编码就没有直播。
- 推流协议选型要结合场景,RTMP 最通用,SRT 抗丢包强。
- FFmpeg 推流命令其实不复杂,关键参数就那几个。