F5社区-F5技术交流中心

N+增强能力系列 | 视频直播HLS与RTMP

2020-09-03 17:18:05

Vincent Wang

有很多客户问我们NGINX商业版与开源版本到底有什么区别,在官方网站有一个对比列表,但看完之后感觉好像还是没有get到其增强的精髓。为了更好的让大家了解NGINX Plus增强的能力及其应用场景,特编发《NGINX Plus增强能力系列专题》。本系列一共包含10篇内容,为了精简,我们没有包含那些显而易见的增强例如dashboard,而是更聚焦商业版本的关键能力与场景。本专题内容由数位专家参与。


NGINX Plus增强能力系列专题目录:

视频直播HLS与RTMP

代理缓存状态统计与清理

动态KV模块

NGINX实现动态黑白名单访问控制

主动健康检查

NGINX集群

JWT认证

API接口

会话级log记录

http_upstream与stream_upstream


下面我们就进入《NGINX Plus增强能力系列专题》的首篇“视频直播HLS与RTMP”,作者朱杰。

朱杰,F5解决方案顾问,拥有10多年的服务器、存储、以及云计算大数据的IT从业经验,熟悉web及移动应用的开发及运维,长期致力于为客户提供优质的服务交付。具有丰富及广泛的行业知识,对业务的运营及运维有着深刻的理解。曾作为公有云的高级产品经理,设计大型共有云服务UI/UE整体架构及运营体系。


视频点播直播—推拉流

视频点播直播有两个关键词,推流和拉流,那么什么是推拉流呢?推流,指的是把采集阶段封包好的内容传输到服务器的过程;拉流是指服务器已有直播内容,用指定地址进行拉取的过程。


上图清晰的说明了推拉流的过程,在上图上丰富一下,就形成了当下主流的直播点播的架构示意图了:

1. ngx_http_hls_module 是什么

随着直播行业大火,游戏、乐秀、教育、发布会等直播类产品层出不穷,能够满足各方人员的需求。国内常见的直播协议有几个:RTMP、HLS、HTTP-FLV,下面我们来介绍一下RTMP与HLS。


RTMP,全称 Real Time Messaging Protocol,即实时消息传送协议。Adobe 公司为 Flash 播放器和服务器之间音视频数据传输开发的私有协议。工作在 TCP 之上的明文协议,默认使用端口 1935。协议中的基本数据单元成为消息(Message),传输的过程中消息会被拆分为更小的消息块(Chunk)单元。最后将分割后的消息块通过 TCP 协议传输,接收端再反解接收的消息块恢复成流媒体数据。


RTMP 主要有以下几个优点:RTMP 是专为流媒体开发的协议,对底层的优化比其它协议更加优秀,同时它 Adobe Flash 支持好,基本上所有的编码器(摄像头之类)都支持 RTMP 输出。现在 PC 市场巨大,PC 主要是 Windows,Windows 的浏览器基本上都支持 Flash。另外RTMP适合长时间播放,曾经有过测试,联系 100 万秒,即 10 天多连续播放没有出现问题。最后 RTMP 的延迟相对较低,一般延时在 1-3s 之间,一般的视频会议,互动式直播,完全是够用的。


当然 RTMP 并没有尽善尽美,它也有不足的地方。一方面是它是基于 TCP 传输,非公共端口,可能会被防火墙阻拦;另一方面,也是比较坑的一方面是 RTMP 为 Adobe 私有协议,很多设备无法播放,特别是在 iOS 端,需要使用第三方解码器才能播放。


HLS (HTTP Live Streaming) 则是苹果公司基于 HTTP 的流媒体传输协议。主要应用于 iOS 设备,包含(iPhone, iPad, iPod touch) 以及 Mac OSX 提供音视频直播服务和录制内容(点播)等服务。


相对于常见的流媒体协议,HLS 最大的不同在于它并不是一下请求完整的数据流。它会在服务器端将流媒体数据切割成连续的时长较短的 ts 小文件,并通过 M3U8 索引文件按序访问 ts 文件。客户端只要不停的按序播放从服务器获取到的文件,从而实现播放音视频。


相较 RTMP 而言,使用 HLS 在 HTML5 页面上实现播放非常简单:


<video src=”example.m3u8” controls></video>



HLS 的优势:


Apple 的全系列产品支持:由于 HLS 是苹果提出的,所以在 Apple 的全系列产品包括 iPhone、 iPad、safari 都不需要安装任何插件就可以原生支持播放 HLS, 现在 Android 也加入了对 HLS 的支持。


穿透防火墙。基于 HTTP/80 传输,有效避免防火墙拦截


性能高。通过 HTTP 传输, 支持网络分发,CDN 支持良好,且自带多码率自适应,Apple 在提出 HLS 时,就已经考虑了码流自适应的问题。


HLS 的劣势:


实时性较弱,HLS 的延迟基本在 3s+ 以上


文件碎片。特性的双刃剑,ts 切片较小,会造成海量小文件,对存储和缓存都有一定的挑战




在Nginx Plus 里,Nginx_http_hls_module是专门针对HLS的扩展模块。




2. 配置方法

1.  Nginx OSS rtmp module 配置


1.1 安装nginx依赖软件


yum -y install gcc gcc-c++ autoconf automake make

yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel



1.2 安装nginx与rtmp模块


//首先进入local目录

cd /usr/local


//下载nginx

wget http://nginx.org/download/nginx-1.13.12.tar.gz


//解压

tar zxvf nginx-1.13.12.tar.gz


//创建nginx安装目录与模块目录

mkdir -p /usr/local/nginx/module


//创建视频数据存放文件

mkdir -p /usr/local/nginx/myapp


//进入/usr/local/nginx/module目录

cd /usr/local/nginx/module


//下载nginx-rtmp-module(没有安装git的请安装,执行语句的时候没有git会提示你)

git clone  https://github.com/arut/nginx-rtmp-module.git

//下载后的文件夹名称叫做nginx-rtmp-module


//进入解压后的nginx目录中,指定nginx安装目录并且指定了安装的模块

cd /usr/local/nginx-1.13.12/

./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx/module/nginx-rtmp-module


//编译并安装

make && make instal


//启动nginx

/usr/local/nginx/sbin/nginx



1.3 配置nginx与nginx-rtmp-module


//在nginx-rtmp-module中带有一个nginx.conf的配置文件,把它覆盖到nginx中的配置文件

cp /usr/local/nginx/module/test/nginx.conf /usr/local/nginx/conf

询问你是否覆盖,输入y 并回车


//编辑nginx配置文件,使用vim打开

vim /usr/local/nginx/conf/nginx.conf

//修改的地方一共有三处分别是

1、rtmp节点下的在live on;下加入

    hls on;

    hls_path /usr/local/nginx/myapp;


2、在http节点下,修改两个root的路径。


1.4 Html文件修改

1.4.1 修改文件/usr/local/nginx/module/nginx-rtmp-module/test/www/index.html,修改ip以及端口。


        sources: [

            {

                file: "rtmp://10.1.10.146:1935/myapp?carg=1/mystream?sarg=2"

            }


1.4.2修改文件/usr/local/nginx/module/nginx-rtmp-module/test/www/record.html,修改ip以及端口。


var flashvars =

{

    'streamer':                     'rtmp://10.1.10.146:1935/myapp',

    'file':                         'mystream',

    'type':                         'camera',

    'controlbar':                   'bottom',

    'stretching':                   'none',

    'frontcolor':                   '86C29D',  // text & icons                  (green)

    'backcolor':                    '849BC1',  // playlist background           (blue)

    'lightcolor':                   'C286BA',  // selected text/track highlight (pink)

    'screencolor':                  'FFFFFF',  // screen background             (black)

    'id':                           'playerID',

    'autostart':                    'true'

};


重新加载配置,使用命令/usr/local/nginx/sbin/nginx -s reload;


1.5   推流(以直播为例)

1.5.1     下载OBS与VLC软件;

1.5.2     打开OBS软件,在设置中选择串流→自定义服务器,配置如下:


1.5.3     OBS软件,点击添加源,新建视频捕捉设备;


1.5.4     点击推流,然后在浏览器中输入http://10.1.10.146:8080;


至此,服务端的推流部分完成,你会发现有趣的是,直播网页比你obs里的动作慢3秒,有兴趣的可以去了解一下原理。


1.6   拉流(以点播为例)

1.6.1     修改nginx.conf文件,添加点播播放目录:

rtmp {

    server {

        listen 1935;

        application vod {

            play /usr/local/nginx/vod;

        }

重启nginx服务

#nginx -s reload

1.6.2     拷贝测试视频文件至此目录:

➜  scp TS.MP4  root@10.1.10.146:/usr/local/nginx/vod


1.6.3     打开VLC,进行拉流工作,打开网络地址,配置如下:


即可正常观看视频文件。



2.  Nginx Plus ngx_http_hls_module 配置

ngx_http_hls_module是NGINX PLUS的模块,他的功能主要有:

A.支持mp4,mov文件的点播;

B.支持缓存,调整缓存大小,能够实现MP4视频seeking功能(拖动进度条);

C.支持URI附加参数,能够对视频进行操作;

2.1 安装Nginx Plus (略)

2.2 配置nginx.conf文件,添加如下代码;


location / {

    hls;

    hls_fragment

    hls_buffers

    hls_mp4_buffer_size

    hls_mp4_max_buffer_size 5m;

    root /var/video/;

}


2.3 重启nginx进程;


#nginx -s reload


2.4 拷贝测试mp4文件到/var/video目录下(注意验证文件的可执行性/nginx用户与用户组权限);

2.5 拷贝测试mp4文件到/var/video目录下;

2.6 在客户端安装VLC,用VLC拉流播放,并可以对视频进行时间剪辑等操作;

http://10.1.10.146:8080/1.mp4.m3u8?offset=1.000&start=1.000&end=2.200

http://10.1.10.146:8080/1.mp4m3u8?len=8.000

http://10.1.10.146:8080/1.mp4.ts?start=1.000&end=2.200



3. 应用场景与价值

对于直播和点播场景来说,能够简化配置,操作与调度视频流,帮助视频开发应用快速发布与运维。对于企业的数字化转型,客户教育,员工培训,价值传递,线上获客等具有积极作用。



4. 与Nginx OSS 的区别

OSS只有RTMP的第三方模块,通过RTMP来实现HLS的功能

N+有HLS的独立模块,能够实现在列表URI与分片URI上增加额外的参数,方便开发设计



NGINX   PLUS/hls module

NGINX   OSS/rtmp module

协议

http/https

rtmp/http/https

Directives

HLS   缓冲区设置

URL转发参数

HLS   分片

HLS   MP4 缓冲区设置

HLS   MP4 最大缓冲区设置



5. Demo (见视频)

PS:直播技术绕不开的视频转码和切片技术本文未提及,可安装ffmpeg程序对视频文件进行切片,有兴趣的小伙伴可以自行尝试。

NGINX PLUS增强模块与指令


发布评论 加入社群

发布评论

郑蕾 2020-09-07 11:34:58 0

不错,期待更新

刘京玲 2020-09-10 11:02:04 0

凤广11 2020-09-11 10:26:02 0

涨知识了!

相关文章

博文精选 | nginx 性能优化 -- 配置解析

F5小安

2022-07-21 10:35:06 512

博文精选 | 漫画 Nginx 的 subfilter

F5小安

2022-05-27 13:57:18 409

博文精选 | 一篇文章搞定 Nginx 反向代理与负载均衡

F5小安

2022-05-26 10:31:14 917

Login

手机号
验证码
© 2019 F5 Networks, Inc. 版权所有。京ICP备16013763号-1