HTTP Live Streaming(缩写是 HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议。是苹果公司QuickTime X和iPhone软件系统的一部分。它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U (m3u8) playlist文件,用于寻找可用的媒体流。

HLS只请求基本的HTTP报文,与实时传输协议(RTP)不同,HLS可以穿过任何允许HTTP数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。

此协议详细内容请参考apple官方网站:https://developer.apple.com/resources/http-streaming/

hls的技术细节就不说了,这里搭建hls直播的目的就是想研究下Nginx-rtmp-module针对rtmp直播流实时转换为hls直播流的基本细节。

经过测试,我发现,rtmp直播流会被动态切分为ts片段和一个不断刷新的u3m8文件,我正需要关注这一点,必要时可能对相关代码进行调试。
这里按顺序分几个部分讲述我的搭建步骤:软件编译,nginx配置,rtmp源的提供,html代码修改,客户端播放
1.软件编译
从下面的网址分别下载nginx和nginx-rtmp-module:
http://nginx.org/en/download.html
https://github.com/arut/nginx-rtmp-module

我目前的现状是已经安装好了nginx-1.4.4,需要在它的基础上安装这个模块,可以使用下面的方法增加后续的第三方模块。
进入nginx的源码目录下面
./configure --add-module=/path/to/nginx-rtmp-module --with-http_ssl_module --with-debug
来增加这个模块,然后
make
make install
注意新生成的配置文件不会覆盖原来的配置文件。参见下面的截图

可见,在config时已经看到了这个新加入的模块,下面的截图说明,现在Nginx只针对新添加的模块进行编译

由上图可见,在make install时,对原来已经存在的nginx.conf,只会进行原封不动的复制。这一点比较人性化,特别是在线上运维上,这样我们可以任意增加后续模块,然后基于前一次的nginx.conf进行修改就可以了,超赞。

如果是全新安装,就更简单了,这里略去安装步骤。

下面是我的实战记录(注意我原来使用了google perftools模块,所以以后添加的所有模块需要都加上这个编译)
cd /usr/local/src
git clone https://github.com/arut/nginx-rtmp-module.git
cd ../nginx-1.4.4
./configure --prefix=/usr/local/nginx --with-google_perftools_module --add-module=/usr/local/src/nginx-rtmp-module  --with-http_ssl_module --with-debug
make
make install

2.nginx配置

Nginx可以支持多虚机配置,如果是一个ip或域名多虚机的情况,就是要不同的虚机对应不同的端口服务,而如果是多ip或域名一个虚机的情况,则又不一样。这里的实际情况就是,80和8080分别对应一个http协议的虚机,1935对应一个rtmp协议的虚机。关于hls具体配置项的解释参见

https://github.com/arut/nginx-rtmp-module/wiki/Directives

在原有的nginx.conf中加入如下配置

rtmp {server {listen 1935;chunk_size 4000;#HLS# For HLS to work please create a directory in tmpfs (/tmp/app here)# for the fragments. The directory contents is served via HTTP (see# http{} section in config)## Incoming stream must be in H264/AAC. For iPhones use baseline H264# profile (see ffmpeg example).# This example creates RTMP stream from movie ready for HLS:## ffmpeg -loglevel verbose -re -i movie.avi  -vcodec libx264 #    -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1 #    -f flv rtmp://localhost:1935/hls/movie## If you need to transcode live stream use 'exec' feature.#application hls {live on;hls on;hls_path /usr/local/nginx/html/hls;hls_fragment 5s;}}
}http {server {listen  8080;location /hls {# Serve HLS fragmentstypes {application/vnd.apple.mpegurl m3u8;video/mp2t ts;}root html;expires -1;}}
}

其中rtmp部分与原有的http部分在同一个级别,但是下面的http部分要放到已有的http部分中,也就是增加一个server部分。
然后运行如下命令检查nginx.conf是否有语法错误
service nginx configtest
重新加载配置文件
service nginx reload
运行下面的命令查看nginx状态
service nginx status
然后查看端口
netstat -nlp
注意,这里reload并不能开启这几个服务,需要使用
service nginx restart
来将rtmp服务和hls服务的端口1935和8080都打开,参看下面的截图

3.rtmp源提供
我目前采用ffmpeg来将本地文件处理来模拟产生一个rtmp直播流,现在使用下面的命令来产生一个rtmp直播流
ffmpeg -re -i sample.flv -vcodec copy -acodec copy -f flv rtmp://192.168.90.26/hls/mystream
注意,这里提供rtmp源的机器不一定和nginx在同一台物理主机上,可以是网络上的另一台机器,但是要保证它能与nginx所在的主机建立tcp链接,
也就是nginx主机需要开启rtmp服务的监听端口,这里是1935,当然你也可以修改为其他的端口。

根据nginx.conf中的hls_path配置,这个命令会向192.168.90.26主机的/usr/local/nginx/html/hls下面写入ts片段和m3u8文件,参见下面的截图:

这个目录下的文件会动态刷新,前面写入的ts片段会被后面的ts片段覆盖。当这个直播流播完后,所有相关的ts片段和m3u8文件都将被删除。

4.修改html代码,保存为playhls.html, 这是一个HTML5+HLS视频的例子

<!DOCTYPE html>
<html>
<head><meta http-equiv="content-type" content="text/html; charset=utf-8"><title>HLS Player</title>
</head>
<body>
<video poster="poster.png" height="720" width="1280" controls><source src="http://192.168.90.26:8080/hls/mystream.m3u8" type="application/vnd.apple.mpegurl" /><p class="warning">Your browser does not support HTML5 video.</p>
</video>
</body>
</html> 

这个html文件存放在和m3u8文件相同的目录下面:/usr/local/nginx/html/hls

5.客户端播放
在支持html5的浏览器中,输入如下网址
http://192.168.90.26:8080/hls/playhls.html
但是测试支持html5的浏览器比较糟糕,没有一个可以正常播放的,在android手机上测试百度浏览器,画面出来了,但是播放时出了问题,崩掉了。我使用ipad 4,打开Safari浏览器,
就可以正常播放这个直播的视频了。参见下面的截图。

在vlc中加入如下地址也可以播放
http://192.168.90.26:8080/hls/mystream.m3u8
参见下面的截图,注意直播不能拖动!

6,状态查看
要查看到状态信息,需要在nginx.conf中加入stat模块的相关配置信息,也就是加入下面的几行信息,注意root的值是nginx-rtmp-module所在的目录
location /stat {  
rtmp_stat all;  
rtmp_stat_stylesheet stat.xsl;  
}

location /stat.xsl {  
root /usr/local/src/nginx-rtmp-module/;

}

注意为了得到统计信息,还需要开启下面的控制模块

location /control {  
rtmp_control all;  
}

将它们添加到8080那台http虚机上的配置如下:

rtmp {server {listen 1935;chunk_size 4000;#HLS# For HLS to work please create a directory in tmpfs (/tmp/app here)# for the fragments. The directory contents is served via HTTP (see# http{} section in config)## Incoming stream must be in H264/AAC. For iPhones use baseline H264# profile (see ffmpeg example).# This example creates RTMP stream from movie ready for HLS:## ffmpeg -loglevel verbose -re -i movie.avi  -vcodec libx264 #    -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1 #    -f flv rtmp://localhost:1935/hls/movie## If you need to transcode live stream use 'exec' feature.#application hls {live on;hls on;hls_path /usr/local/nginx/html/hls;hls_fragment 5s;}}
}http {server {listen  8080;location /stat {  rtmp_stat all;  rtmp_stat_stylesheet stat.xsl;  }  location /stat.xsl {  root /usr/local/src/nginx-rtmp-module/;  }  location /control {  rtmp_control all;  }  location /hls {# Serve HLS fragmentstypes {application/vnd.apple.mpegurl m3u8;video/mp2t ts;}root html;expires -1;}}
}

然后,在浏览器中打开
http://192.168.90.26:8080/stat

如果一切正常应该能看到相关的统计信息了,参见下面的截图

如果不添加控制模块的配置,就不能看到统计数据了,参见截图

7.环境搭建后遇到的问题

参考文献
[1].http://blog.csdn.net/kl222/article/details/12968815
[2].http://blog.csdn.net/cjsafty/article/details/9108587
[3].http://blog.csdn.net/cccallen/article/details/8440191
[4].http://www.rosoo.net/a/201111/15273.html
[5].http://blog.raphaelzhang.com/2013/04/video-streaming-and-ffmpeg-transcoding/

使用Nginx-rtmp-module搭建hls直播相关推荐

  1. Nginx Rtmp Module - HLS切片和级联播放

    #Nginx Rtmp Module - HLS切片和播放 1.名词解释 媒体片段文件(.ts): 媒体片段是由源站生成的,基于编码后的媒体源,并且是由一系列的 .ts 格式的文件组成,其中包含了你想 ...

  2. 使用ffmpeg搭建HLS直播系统

    [时间:2018-04] [状态:Open] [关键词:流媒体,stream,HLS, ffmpeg,live,直播,点播, nginx, ssegment] 0 引言 本文作为HLS综述的后续文章. ...

  3. Ubuntu中使用Nginx+rtmp模块搭建流媒体视频点播服务

    1. 背景 不知不觉来到流媒体部门已经一年半多了,也算积攒了不少的流媒体知识,平时工作比较忙,到没有对流媒体技术进行系统性的梳理:最近刚完成一个Git实用指南的技术专栏,放松一周之后,觉得还是得让自己 ...

  4. RTMP服务器搭建实时视频直播

    RTMP服务器搭建&实时视频直播 项目地址: github 使用Docker搭建rtmp服务器 安装docker: curl -sSL https://get.daocloud.io/dock ...

  5. 实时监控、直播流、流媒体、视频网站开发方案流媒体服务器搭建及配置详解:使用nginx搭建rtmp直播、rtmp点播、,hls直播服务配置详解

    注意:这里不会讲到nginx流媒体模块如何安装的问题,只研究rtmp,hls直播和录制相关的nginx服务器配置文件的详细用法和说明.可以对照这些命令详解配置nginx -rtmp服务 一.nginx ...

  6. nginx+rtmp+OBS搭建音视频直播服务

    文章目录 OBS Nginx-rtmp docker方式 野生方式 推流 hls单码流 rtmp多码流 拉流 OBS 下载地址: http://www.obsproject.com.cn/downlo ...

  7. linux搭建直播步骤,linux环境(CentOS-7)搭建HLS直播测试环境

    安装带rtmp的nginx 前提:需要yum update.wget.tar.gcc.pcre.pcre-devel.openssl 1.下载软件: mkdir nginx cd nginx wget ...

  8. nginx rtmp 服务搭建

    环境: centos7.4 64位 下载nginx和rtmp-module: cd /home/yourname wget http://nginx.org/download/nginx-1.15.8 ...

  9. python搭建流媒体服务器_Linux自建直播服务器一:使用Nginx+rtmp模块搭建流媒体服务器...

    技术服务于生活.当在日常遇到问题的时候,需要经常去思考如何解决这个问题. 最近网易的逆水寒开测了,非常荣幸拿到一个资格号,可以来体验一下这款国产巅峰级网游,一个会呼吸的江湖.作为一个极度业余的主播(一 ...

最新文章

  1. 会写代码的AI开源了!C语言写得比Codex还要好,掌握12种编程语言丨CMU
  2. Navicat——MySQL之delimiter默认设置问题
  3. 原型模式codeing
  4. P3288-[SCOI2014]方伯伯运椰子【0/1分数规划,负环】
  5. Google 为什么以 Flutter 作为原生突破口?| 技术头条
  6. PowerManager.WakeLock使用(屏幕恒亮)
  7. html5音频插件js,jquery音乐播放器插件jsRapAudio
  8. 【资源】机器学习 周志华
  9. Excel简单使用宏
  10. 【转】WebMagic-总体流程源码分析
  11. Python机器学习应用之监督学习-上证指数涨跌预测实例
  12. 万花筒写轮眼画法_万花筒写轮眼画法教程
  13. “最牛愤青教授”郑强叫板当代教育
  14. PHP程序输入输出流
  15. Android 模仿H5高斯模糊发光阴影
  16. 喝什么对眼睛好呢!!
  17. 怎样基于power supply class编写PSY driver
  18. 序列检测器(三段式状态机)
  19. MTK平台Android12编译(包括modem)_个人笔记
  20. SDUT Round #4 - 2018 新春大作战 官方题解(纯净版)

热门文章

  1. C++ 笔记(04)— 数据类型(各类型占用内存 sizeof、typedef 声明)
  2. Python学习笔记17:标准库之数学相关(math包,random包)
  3. 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
  4. 在CISCO路由器上配置DHCP与DHCP中继
  5. 怎么在vs2010中使用ActiveX Test Container(转)
  6. 欧拉函数的求法(线性筛法?)
  7. android java 中文乱码_android读写中文如何避免乱码详解
  8. sklearn库安装_没有依赖库也能跑机器学习模型!推荐一个强大工具m2cgen
  9. php mysql函数未定义,PHP MySQLi未定义的方法错误
  10. autodesk许可证服务器,Autodesk软件工作流介绍(十)——配置网络许可服务器的步骤...