核心概念:直播系统架构

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

视频直播服务器搭建
(图片来源网络,侵删)
  1. 推流端

    • 内容来源:摄像头、手机、电脑、专业编码器等。
    • 功能:采集音视频数据,进行编码(通常是H.264/H.265视频 + AAC音频),然后通过RTMP协议推送到直播服务器。
  2. 直播服务器

    • 核心功能:接收推流端的流,进行转码、录制、截图等处理,然后将流分发给大量观众。
    • 关键协议
      • 接收推流:RTMP (Real-Time Messaging Protocol) 是目前最主流的推流协议。
      • 分发拉流
        • HLS (HTTP Live Streaming):基于HTTP,兼容性极好,几乎所有设备(iOS, Android, PC浏览器)都支持,但有较高延迟(通常5-10秒)。
        • WebRTC:低延迟(毫秒级),但技术复杂,主要用于实时互动场景,如视频会议、在线教育。
        • FLV:基于Flash,延迟比HLS低,但已逐渐被淘汰。
  3. 播放端

    • 功能:从直播服务器拉取流,并进行播放。
    • 形式:网页(使用VLC.js, Video.js等库)、手机App(iOS/Android)、桌面客户端等。
  4. CDN (Content Delivery Network)

    视频直播服务器搭建
    (图片来源网络,侵删)
    • 功能:将直播流分发到离用户最近的边缘节点,降低延迟、减轻源站压力、提升播放流畅度。
    • 重要性:对于面向公众的直播,CDN几乎是必需品,可以自建CDN,但成本极高,通常使用第三方CDN服务(如阿里云、腾讯云、七牛云等)。

方案选择

根据你的技术能力、预算和需求,可以选择不同的搭建方案。

方案类型 优点 缺点 适用场景
云服务方案 快速、省心、高可用,无需关心底层硬件和运维,按需付费,弹性伸缩。 成本较高,长期使用费用不菲,定制化程度低。 初创公司、个人主播、对上线速度要求高、不想投入运维精力的团队
自建服务器方案 成本可控(硬件一次性投入)、完全可控、可深度定制、无厂商绑定。 技术门槛高,需要专业的运维人员,初期投入大,扩容麻烦,自建CDN成本极高。 有一定技术实力、追求极致性价比、有特殊定制化需求、数据隐私要求极高的大型企业
混合方案 结合云和自建的优势,将核心/私有内容放在自建服务器,将公网分发交给云CDN。 架构复杂,需要解决两者之间的协同问题。 业务复杂,有部分核心或私有直播内容,同时需要公网流量分发的企业

对于大多数用户,我强烈推荐从【云服务方案】开始。 它能让你用最小的精力快速验证想法和上线服务。


云服务方案(最推荐)

这是目前最主流、最高效的方式,你只需要关注业务逻辑,而不用关心底层基础设施。

以阿里云为例,步骤如下:

  1. 注册并实名认证:访问阿里云、腾讯云、华为云等官网,完成注册和实名认证。

  2. 购买直播服务

    • 在控制台搜索“直播”或“视频直播”服务。
    • 开通服务,并购买相应的套餐,通常包含:
      • 直播域名:用于分发流。
      • 转码模板:将你的推流转码成不同清晰度(如720p, 480p),以适应不同网络环境的用户。
      • 录制/截图:自动保存直播内容。
  3. 配置直播

    • 在直播控制台,创建一个直播空间
    • 配置转码模板,例如设置一个高清(720p)和一个标清(480p)模板。
    • 获取你的推流地址,这个地址通常由 推流码率直播域名推流密钥 组成,格式类似:rtmp://your-domain/live/your-stream-key请务必妥善保管推流密钥!
  4. 使用推流软件进行推流

    • OBS Studio:免费、开源、跨平台的推流软件,强烈推荐。
    • 下载并安装OBS。
    • 在OBS中,设置 -> 直播 -> 服务选择“自定义...”。
    • 服务器填写你的 rtmp://... 地址,串流密钥填写你的 your-stream-key
    • 在OBS中添加你的视频源(摄像头、屏幕、图片等)。
    • 点击“开始推流”。
  5. 在播放端观看

    • 云服务会自动将你的RTMP流转换成HLS流。
    • 在播放端(如网页、VLC播放器)使用HLS地址播放,HLS地址通常为:https://your-domain/live/your-stream-key.m3u8
    • 云服务商通常也会提供一个播放器,你可以直接生成一个HTML页面来测试。

优点:整个过程可能只需要30分钟,你就可以拥有一个功能完备的直播系统。


自建服务器方案(进阶)

如果你选择自建,通常会选择开源软件组合,最经典、最成熟的组合是 Nginx + RTMP模块

准备工作

  • 一台云服务器或物理机
    • 操作系统:推荐使用 Ubuntu 20.04 LTSCentOS 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步:推流与播放

  1. 推流

    • 使用OBS,服务器地址填写 rtmp://你的服务器公网IP:1935/live
    • 串流密钥可以自定义,test_stream
    • 开始推流。
  2. 播放

    • HLS播放地址为:http://你的服务器公网IP/hls/test_stream.m3u8
    • 你可以在 /usr/local/nginx/html/hls 目录下看到生成的 .ts (视频切片) 和 .m3u8 (播放列表) 文件。
    • 在网页中嵌入一个支持HLS的播放器(如Video.js)来播放这个地址。

进阶功能

  • 转码:自建方案实现转码比较复杂,通常需要配合 FFmpeg,Nginx本身不转码,你需要用FFmpeg拉取Nginx的RTMP流,进行转码后再推送到另一个Nginx应用中。
  • 录制:在 nginx.confapplication live 中设置 record on;record_path /path/to/recordings;
  • CDN:自建服务器后,如果要做公网分发,强烈建议再接入一家第三方CDN服务,将你的Nginx服务器作为源站,把流推到CDN,再由CDN分发给用户,这样你的源站压力会小很多。

总结与建议

  1. 新手入门:直接选择云服务方案,它能让你快速上手,将精力集中在内容创作和用户体验上,而不是底层运维,阿里云、腾讯云的文档和教程都非常完善。

  2. 技术进阶/有特殊需求:选择自建服务器方案,这个过程虽然复杂,但能让你深入理解直播的每一个环节,并且拥有完全的控制权,从Nginx-RTMP开始是很好的起点。

  3. 关于延迟

    • RTMP:用于推流,延迟最低(1-3秒)。
    • HLS:用于播放,延迟较高(5-10秒),但兼容性无敌。
    • WebRTC:延迟最低(<1秒),但技术复杂,主要用于对实时性要求极高的场景。
    • 如果需要更低延迟,可以考虑 SRTRTMPS 等协议,或者研究 WebRTC 的集成。
  4. 安全:无论哪种方案,都要注意安全,保护好你的推流密钥,不要泄露,在自建服务器上,配置防火墙,只开放必要的端口(如1935, 80, 443)。

希望这份详细的指南能帮助你成功搭建自己的视频直播服务器!