基于Nginx技术的直播平台
2018-06-22连云港广电传媒集团
陆 亮 连云港广电传媒集团(台)
1.引言
在移动互联网快速发展的背景下,我国媒体融合发展已是大势所趋。今年两会,直播成为人民日报社新媒体中心的新亮点。人民日报社全媒体记者密切分工配合,在两会现场搭建自有的直播系统,实时提供高清直播信号,让受众直击两会现场。根据相关统计,人民日报新媒体中心共推出两会直播48场,总观看量超4360万,总直播时长超50小时。直播无疑已成为媒体获取观看流量的主要抓手。
直播流媒体服务架构如图1所示,主要由推流端、拉流端、媒体服务器所示,三者由推流协议、拉流播放协议依次连接。在推、拉流协议的应用场景中,RTMP可以用在双端,HLS只能用在拉流端。
推流端即主播端,主要通过手机、摄像机、摄像头采集视频数据,麦克风采集音频数据,经过一系列前端信号采集和处理、编码、封装,然后推流到直播流媒体平台,通过CDN网络分发,在拉流播放端的用户可以通过多屏观看及互动,直播流媒体服务组成如图2所示。
图1 直播流媒体服务架构
图2 直播流媒体服务组成
2.关键技术协议
直播流媒体业务有两种协议可供选择:HLS 和RMTP。HLS是苹果公司基于 HTTP 的流媒体传输协议,可支持流媒体的直播和点播,主要应用在iOS 系统,为 iOS 设备(如 iPhone、iPad)提供音视频直播和点播方案。RTMP是 Adobe Systems 公司为Flash 播放器和服务器之间音频、视频和数据传输开发的开放协议,RTMP 是一种设计用来进行实时数据通信的网络协议,主要用来在 Flash/AIR 平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。
2.1 HLS ( HTTP Live Streaming基于 HTTP 的流媒体传输协议)
2.1.1 HLS工作原理
当采集推流端将视频流推送到流媒体服务器时,服务器将收到的流信息每缓存一段时间就封包成一个新的ts文件,同时在服务器建立一个m3u8的索引文件来维护最新几个 ts 片段的索引。当播放端获取直播时,从 m3u8 索引文件获取最新的 ts 视频文件片段播放,从而保证用户在任何时候连接时都会看到较新的内容,实现近似直播的体验。相对于常见的流媒体直播协议,HLS 最大的不同在于直播客户端获取到的并不是一个完整的数据流,而是连续的、短时长的媒体文件,客户端不断地下载并播放这些小文件。这种方式的理论最小延时为一个 ts 文件的时长,一般情况为 2-3 个 ts 文件的时长。HLS的分段策略,基本上推荐是 10 秒一个分片,因此,通常 HLS 直播延时会达到 20-30s,而高延时对于需要实时互动体验的直播来说是不可接受的。HLS 基于短连接 HTTP,HTTP 是基于 TCP 的,这就意味着 HLS 需要不断地与服务器建立连接,TCP 每次建立连接时的三次握手、慢启动过程、断开连接时的四次挥手都会产生消耗。HLS的优点是,数据通过HTTP 协议传输,所以采用 HLS 时不用考虑防火墙或者代理的问题;使用短时长的分片文件来播放,客户端可以平滑地切换码率,以适应不同带宽条件下的播放。
图3 直播协议分类
图4 nginx环境搭建
2.2 RTMP(Real Time Messaging Protocol,实时消息传送协议)
RTMP是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议。它有以下三种变种:
(1)工作在TCP之上的明文协议,使用端口1935;
(2)RTMPT封装在HTTP请求之中,可穿越防火墙;
(3)RTMPS类似RTMPT,但使用的是HTTPS连接;
RTMP协议被Flash用于对象、视频、音频的传输。这个协议建立在TCP协议或者轮询HTTP协议之上。RTMP协议就像一个用来装数据包的容器,这些数据既可以是AMF格式的数据,也可以是FLV中的视音频数据。一个单一的连接可以通过不同的通道传输多路网络流,这些通道中的包都是按照固定大小的包传输的。图3是直播协议的分类。
3.直播平台搭建
近几年,主流的开源直播软件解决方案有Simple-RTMP-Server和nginx-rtmp-module。本文主要介绍nginx-rtmp-module,它依赖于nginx,以第三方模块的形式提供直播功能,推流侧使用RTMP协议,播放侧使用HLS协议。
3.1 Nginx
图5 RTMP statistics页面
图6 OBS参数配置
Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件代理服务器,并在一个BSD-like协议下发行。其特点是占有内存少,并发能力强。为了方便阐述,本文使用Windows环境下的nginx(事实上,linux环境下更能体现nginx的优越性能)。我们在nginx官网下载nginx-1.8.1.zip,解压在根目录下。打开cmd命令窗口,进入nginx所在目录,输入启动命令 start nginx ,在网页中输入localhost即可得nginx欢迎页,如图4所示,至此,nginx服务器搭建成功。
3.2 部署nginx-rtmp-module
通过官网github下载nginx-rtmp-module软件包,解压放置在nginx目录下,修改conf目录下的nginx.conf文件。这些配置参数很重要,是直播功能能否实现的关键。为此,我们给出了详细的参数配置。worker_processes 1;
events {
worker_connections 8192;
}
rtmp {
server{
listen 1935; #服务端口--默认
chunk_size 4096; #数据传输块
的大小--默认
application vod { #设置直播的application名称是 live
play /opt/video/vod;
}
application live{
live on; #live on表示开启直播模式
}
}
}
http {
include mime.types;
default_type application/octet-stream;
sendfile off;
图8 VLC拉流直播视频
图9 PC端直播页面
图10 移动端直播页面
server_names_hash_bucket_size 128;
server {
listen 80;
server_name localhost;
location /stat{
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl{
root nginx-rtmp-module/;
}
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
nginx.conf文件参数配置完成后,重启nginx。访问http://localhost/stat页面,如果我们能得到图5所示界面则配置成功。
3.3 进行直播
直播推流的工具有很多,诸如编码器、推流软件等。本文使用OBS实现推流功能。打开OBS配置参数,如图6 所示。图7为OBS推流界面。
通过VLC软件拉流,如果可以看到直播视频,直播服务器的搭建配置成功,如图8所示。3.4 播放端优化
以上操作是从功能上完成直播拉流。目前,终端设备屏幕尺寸越来越多,不同设备的交互特质也有着巨大的差别,为了能够快速部署以及在各种设备上都有良好的用户体验,我们搭建基于ThinkPHP框架的网站,配置PC、移动两个模块。在ThinkPHP框架的入口文件index.php中添加is_mobile函数,用来实现PC端,移动端的自动切换,下文代码用以实现上述功能。
function is_mobile(){
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$mobile_agents = Array("240x320","acer","phone","sy mbian","windows ce","zte");
//意在说明情况,移动系统不做枚举
$is_mobile = false;
foreach ($mobile_agents as $device) {
//这里把值遍历一遍,用于查找是否有上述字符串出现过
if (stristr($user_agent, $device)) {
//stristr 查找访客端信息是否在上述数组中,不存在即为PC端
$is_mobile = true;
break;
}
}
return $is_mobile;
}
//判断
if(is_mobile()){
// 移动端模块
define('BIND_MODULE','Mobile');
}else{
// PC端模块
define('BIND_MODULE','Home');
}}
当用户访问网站时,系统根据访问终端类型自动切换至相应的模块,模块调出匹配设备屏幕尺寸的网页。通过这样的机制,可以为用户提供良好的视听感受。
4. CDN分发
直播流畅效果受人数、地域、网络状况等因素影响,本地介绍的直播平台支持最大并发数也是有限的。为了应对直播在线人数突增等诸多不稳定因素,我们推荐使用CDN。
CDN即Content Delivery Network (内容分发网络),是一种新型网络构建方式,它是为能在传统的IP网发布宽带丰富媒体而特别优化的网络覆盖层。简单地说,CDN是一个经策略性部署的整体系统,通过用户就近性和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务。内容服务基于缓存服务器,它位于网络的边缘,距用户仅有“一跳”(Single Hop)之遥。同时,代理缓存是内容提供商源服务器(通常位于CDN服务提供商的数据中心)的一个透明镜像。这样的架构使得CDN服务提供商能够代表他们客户,即内容供应商,向最终用户提供尽可能好的体验,为用户提供尽可能少的网络延迟服务。
5.结束语
网络直播作为基于“互联网+媒体”理念应运而生的新生事物,将互联网技术运用到内容开发中来,重新树立“内容为王”的传播理念。网络直播也使得媒体内容拥有更强的针对性、时效性、吸引力、影响力和感染力。