核心概念:直播系统架构
在开始搭建之前,先理解一个标准的直播系统包含哪些部分,这能帮助你更好地规划整个项目。

-
推流端:
- 内容来源:摄像头、手机、电脑、专业编码器等。
- 功能:采集音视频数据,进行编码(通常是H.264/H.265视频 + AAC音频),然后通过RTMP协议推送到直播服务器。
-
直播服务器:
- 核心功能:接收推流端的流,进行转码、录制、截图等处理,然后将流分发给大量观众。
- 关键协议:
- 接收推流:RTMP (Real-Time Messaging Protocol) 是目前最主流的推流协议。
- 分发拉流:
- HLS (HTTP Live Streaming):基于HTTP,兼容性极好,几乎所有设备(iOS, Android, PC浏览器)都支持,但有较高延迟(通常5-10秒)。
- WebRTC:低延迟(毫秒级),但技术复杂,主要用于实时互动场景,如视频会议、在线教育。
- FLV:基于Flash,延迟比HLS低,但已逐渐被淘汰。
-
播放端:
- 功能:从直播服务器拉取流,并进行播放。
- 形式:网页(使用VLC.js, Video.js等库)、手机App(iOS/Android)、桌面客户端等。
-
CDN (Content Delivery Network):
(图片来源网络,侵删)- 功能:将直播流分发到离用户最近的边缘节点,降低延迟、减轻源站压力、提升播放流畅度。
- 重要性:对于面向公众的直播,CDN几乎是必需品,可以自建CDN,但成本极高,通常使用第三方CDN服务(如阿里云、腾讯云、七牛云等)。
方案选择
根据你的技术能力、预算和需求,可以选择不同的搭建方案。
| 方案类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 云服务方案 | 快速、省心、高可用,无需关心底层硬件和运维,按需付费,弹性伸缩。 | 成本较高,长期使用费用不菲,定制化程度低。 | 初创公司、个人主播、对上线速度要求高、不想投入运维精力的团队。 |
| 自建服务器方案 | 成本可控(硬件一次性投入)、完全可控、可深度定制、无厂商绑定。 | 技术门槛高,需要专业的运维人员,初期投入大,扩容麻烦,自建CDN成本极高。 | 有一定技术实力、追求极致性价比、有特殊定制化需求、数据隐私要求极高的大型企业。 |
| 混合方案 | 结合云和自建的优势,将核心/私有内容放在自建服务器,将公网分发交给云CDN。 | 架构复杂,需要解决两者之间的协同问题。 | 业务复杂,有部分核心或私有直播内容,同时需要公网流量分发的企业。 |
对于大多数用户,我强烈推荐从【云服务方案】开始。 它能让你用最小的精力快速验证想法和上线服务。
云服务方案(最推荐)
这是目前最主流、最高效的方式,你只需要关注业务逻辑,而不用关心底层基础设施。
以阿里云为例,步骤如下:
-
注册并实名认证:访问阿里云、腾讯云、华为云等官网,完成注册和实名认证。
-
购买直播服务:
- 在控制台搜索“直播”或“视频直播”服务。
- 开通服务,并购买相应的套餐,通常包含:
- 直播域名:用于分发流。
- 转码模板:将你的推流转码成不同清晰度(如720p, 480p),以适应不同网络环境的用户。
- 录制/截图:自动保存直播内容。
-
配置直播:
- 在直播控制台,创建一个直播空间。
- 配置转码模板,例如设置一个
高清(720p)和一个标清(480p)模板。 - 获取你的推流地址,这个地址通常由
推流码率、直播域名和推流密钥组成,格式类似:rtmp://your-domain/live/your-stream-key。请务必妥善保管推流密钥!
-
使用推流软件进行推流:
- OBS Studio:免费、开源、跨平台的推流软件,强烈推荐。
- 下载并安装OBS。
- 在OBS中,设置 -> 直播 -> 服务选择“自定义...”。
- 服务器填写你的
rtmp://...地址,串流密钥填写你的your-stream-key。 - 在OBS中添加你的视频源(摄像头、屏幕、图片等)。
- 点击“开始推流”。
-
在播放端观看:
- 云服务会自动将你的RTMP流转换成HLS流。
- 在播放端(如网页、VLC播放器)使用HLS地址播放,HLS地址通常为:
https://your-domain/live/your-stream-key.m3u8。 - 云服务商通常也会提供一个播放器,你可以直接生成一个HTML页面来测试。
优点:整个过程可能只需要30分钟,你就可以拥有一个功能完备的直播系统。
自建服务器方案(进阶)
如果你选择自建,通常会选择开源软件组合,最经典、最成熟的组合是 Nginx + RTMP模块。
准备工作
- 一台云服务器或物理机:
- 操作系统:推荐使用 Ubuntu 20.04 LTS 或 CentOS 7/8。
- 硬件配置:
- CPU:核心数很重要,因为转码是CPU密集型任务,建议至少4核起步,根据并发用户数增加。
- 内存:建议8GB以上。
- 带宽:带宽是关键!假设你推一个1080p/4Mbps的流,要支持100个并发,至少需要 4Mbps * 100 = 400Mbps 的带宽,并且还要考虑HLS切片等开销,建议购买独享带宽。
- 域名:用于访问你的直播服务。
- 公网IP地址。
搭建步骤(以Ubuntu 20.04 + Nginx-RTMP为例)
第1步:安装依赖
sudo apt update sudo apt install -y build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev
第2步:下载并编译Nginx及RTMP模块
# 创建工作目录 mkdir ~/nginx-rtmp && cd ~/nginx-rtmp # 下载Nginx源码 wget http://nginx.org/download/nginx-1.22.1.tar.gz tar -zxvf nginx-1.22.1.tar.gz # 下载RTMP模块 git clone https://github.com/arut/nginx-rtmp-module.git # 进入Nginx目录并编译 cd nginx-1.22.1 ./configure --add-module=../nginx-rtmp-module --with-http_ssl_module make sudo make install
编译成功后,Nginx会被安装到 /usr/local/nginx/ 目录下。
第3步:配置Nginx
编辑Nginx的配置文件 nginx.conf:
sudo vim /usr/local/nginx/conf/nginx.conf
在文件末尾的 http 块外面,添加以下RTMP配置:
# RTMP服务配置
rtmp {
server {
listen 1935; # RTMP默认端口
chunk_size 4096;
application live {
live on; # 开启直播
record off; # 不录制,根据需求开启
# 推流认证(可选但推荐)
# on_publish http://localhost:8080/auth;
# allow publish 127.0.0.1; # 只允许特定IP推流
# deny publish all;
}
# HLS应用,用于将RTMP流转换为HLS流
application hls {
live on;
hls on;
hls_path /usr/local/nginx/html/hls; # HLS切片存放目录
hls_fragment 3s; # 每个切片时长
hls_playlist_length 60s; # 播放列表时长
}
}
}
# HTTP服务配置,用于提供HLS流和播放器页面
http {
# ... (保留原有的http配置) ...
server {
listen 80;
location /hls {
# 跨域设置,如果播放器和服务器不在一个域名下需要
add_header 'Access-Control-Allow-Origin' '*' always;
# 设置HLS流地址
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /usr/local/nginx/html;
add_header Cache-Control no-cache;
}
location / {
root /usr/local/nginx/html;
index index.html;
}
}
}
第4步:创建HLS目录并设置权限
sudo mkdir -p /usr/local/nginx/html/hls sudo chown -R nobody:nobody /usr/local/nginx/html
第5步:启动Nginx
# 进入Nginx的sbin目录 cd /usr/local/nginx/sbin # 启动 sudo ./nginx # 检查是否启动成功 sudo netstat -an | grep 1935 # 应该能看到1935端口被监听 sudo netstat -an | grep 80 # 应该能看到80端口被监听
第6步:推流与播放
-
推流:
- 使用OBS,服务器地址填写
rtmp://你的服务器公网IP:1935/live。 - 串流密钥可以自定义,
test_stream。 - 开始推流。
- 使用OBS,服务器地址填写
-
播放:
- HLS播放地址为:
http://你的服务器公网IP/hls/test_stream.m3u8。 - 你可以在
/usr/local/nginx/html/hls目录下看到生成的.ts(视频切片) 和.m3u8(播放列表) 文件。 - 在网页中嵌入一个支持HLS的播放器(如Video.js)来播放这个地址。
- HLS播放地址为:
进阶功能:
- 转码:自建方案实现转码比较复杂,通常需要配合
FFmpeg,Nginx本身不转码,你需要用FFmpeg拉取Nginx的RTMP流,进行转码后再推送到另一个Nginx应用中。 - 录制:在
nginx.conf的application live中设置record on;和record_path /path/to/recordings;。 - CDN:自建服务器后,如果要做公网分发,强烈建议再接入一家第三方CDN服务,将你的Nginx服务器作为源站,把流推到CDN,再由CDN分发给用户,这样你的源站压力会小很多。
总结与建议
-
新手入门:直接选择云服务方案,它能让你快速上手,将精力集中在内容创作和用户体验上,而不是底层运维,阿里云、腾讯云的文档和教程都非常完善。
-
技术进阶/有特殊需求:选择自建服务器方案,这个过程虽然复杂,但能让你深入理解直播的每一个环节,并且拥有完全的控制权,从Nginx-RTMP开始是很好的起点。
-
关于延迟:
- RTMP:用于推流,延迟最低(1-3秒)。
- HLS:用于播放,延迟较高(5-10秒),但兼容性无敌。
- WebRTC:延迟最低(<1秒),但技术复杂,主要用于对实时性要求极高的场景。
- 如果需要更低延迟,可以考虑 SRT、RTMPS 等协议,或者研究 WebRTC 的集成。
-
安全:无论哪种方案,都要注意安全,保护好你的推流密钥,不要泄露,在自建服务器上,配置防火墙,只开放必要的端口(如1935, 80, 443)。
希望这份详细的指南能帮助你成功搭建自己的视频直播服务器!
