目前市场上的产品主要分为两种:一种是像花椒、映客、斗鱼、YY等的泛娱乐化直播,一种是思科、声网之类的实时互动直播。一般情况下实时互动直播会与PSTN网络相连,所以实时互动直播必须达到电话级别的传输要求,一般不超过400ms。

泛娱乐化直播架构

在泛娱乐化直播架构中有信令服务器集群来负责创建房间、聊天、赠送礼物…,当直播端需要直播时直接向信令服务器发送请求,信令服务器向请求端返回推流的地址,然后直播端开始像CDN网络推送数据流(流媒体CDN与传统CDN有些不同),然后当观众需要观看直播时,使用同样的方式请求直播地址,然后在流媒体CDN拉取数据流,具体如图所示:

万人直播网络架构与CDN网络_第1张图片

实时互动直播架构

众所周知,实时互动直播架构对传输效率要求高,因此客户端使用UDP协议向媒体服务器推流,由于要保证服务器7x24小时的服务,所以通过私有网络建立了服务器集群,直播端向媒体服务器推流。由于使用了多个直播服务节点,所以需要控制中心来控制这些节点以达到负载均衡、健康评估等的目的。每个节点通过内总线向控制中心发送心跳包,控制中心通过心跳包来分析服务节点的健康状况来做出相应的决策。使用内总线的原因一是为了数据的安全性,二是为了数据的时效性。那么有时候实时互动也需要多人观看,所以上面讲解的泛娱乐化直播架构与实时互动直播架构进行融合。在CDN流媒体网络与内总线之间有一层服务节点最重要的作用是将直播端的RTP转换为RTMP数据向CDN推流,由此得知内总线的主要作用就是提高数据吞吐量和保证数据实时安全,具体如下图所示:

万人直播网络架构与CDN网络_第2张图片

流媒体CDN网络与传统CDN网络

虽然各大CDN厂商都提供CDN服务,但是流媒体CDN与传统CDN网络有很大的差别,但是要弄明白区别首先要了解什么是CDN:CDN就是内容分发网络的简称,主要用来加速用户访问数据的速度和承载源站点大部分访问压力。一个CDN网络大致上分为三层:

  • 边缘节点:用户访问边缘节点,边缘节点在主干接点拉去数据。
  • 主干接点:是边缘节点与源站点的中间层,负责分发源站点的内容到边缘节点。
  • 源站点:内容提供商的服务器集群。

具体见下图:

万人直播网络架构与CDN网络_第3张图片

一般情况下,内容提供商有多个服务器来负载均衡,并且CDN提供区域的CDN边缘节点来提供服务,众多的边缘节点和源节点之间通过主干节点连接,主干节点之间一般通过光纤直接互联,如下图所示:

万人直播网络架构与CDN网络_第4张图片

通过上文介绍,我们已经清楚CDN网络基本架构,那么传统CDN与流媒体CDN的区别是:

传统CDN网络是客户端请求某一站点的数据,首先请求源站点的数据,如果源站点有数据就直接返回,如果没有就会直接通过主干节点请求源站点直接返回,并且边缘节点缓存该数据以便下一次客户端去请求加速,也就是说传统CDN网络有热点数据这一说。

流媒体CDN网络采用的推送+拉去的数据分发策略,也就是内容提供商将数据推送到主干节点,然后边缘节点在主干节点拉取数据,用户请求边缘节点的数据拉取数据流。

搭建一个简单的直播系统

ffmpeg

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。

ffplay

ffplay是一个使用了 ffmpeg 和 sdl 库的、一个简单的可移植的媒体播放器。

Nginx

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行,同时Nginx也支持流媒体服务。

Step.1 安装Nginx服务器和RTMP模块:

brew install nginx-full --with-rtmp-module

Step.2 配置Nginx服务:

# 文件路径:/usr/local/etc/nginx/nginx.conf
vim /usr/local/etc/nginx/nginx.conf

# 修改配置文件: 
rtmp {
    server {
        listen 1935;
        chunk_size 4096; # 传输数据块的大小
        # 创建了一个应用
        application live {  
            live on;
            record off;   # 关闭录制
            allow play all;
        }
    }
}

# 热加载配置文件:
nginx -s reload

Step.3 推流到服务器

ffmpeg -re -i ***帝国-矩阵危机.mp4 -c copy -f flv rtmp://127.0.0.1/live/hacker-three

Step.4 拉取数据

ffmpeg -i rtmp://127.0.0.1/live/hacker-three -c copy dump.flv
ffplay rtmp://127.0.0.1/live/hacker-three