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文件,我正需要关注这一点,必要时可能对相关代码进行调试。可见,在config时已经看到了这个新加入的模块,下面的截图说明,现在Nginx只针对新添加的模块进行编译
由上图可见,在make install时,对原来已经存在的nginx.conf,只会进行原封不动的复制。这一点比较人性化,特别是在线上运维上,这样我们可以任意增加后续模块,然后基于前一次的nginx.conf进行修改就可以了,超赞。
如果是全新安装,就更简单了,这里略去安装步骤。
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中的hls_path配置,这个命令会向192.168.90.26主机的/usr/local/nginx/html/hls下面写入ts片段和m3u8文件,参见下面的截图:
HLS Player
这个html文件存放在和m3u8文件相同的目录下面:/usr/local/nginx/html/hls
}
注意为了得到统计信息,还需要开启下面的控制模块
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;}}
}
然后,在浏览器中打开
如果一切正常应该能看到相关的统计信息了,参见下面的截图
如果不添加控制模块的配置,就不能看到统计数据了,参见截图
web网页程序修改 打开gStudio之后,点击菜单栏中Help->Contents。先把这个诡异的编程语言看一遍吧。这里搬一些东西出来。 GoDB简介 从第一副图片中,我们可以看出,从源文件到可执行文件的过程。 从第二幅图我们可以了解到GoDB是如何跨平台的。 编程语言的话: GBasic is a variant of th...
vim /etc/init.d/nginx 粘贴 #!/bin/bash # nginx Startup script for the Nginx HTTP Server # it is v.0.0.2 version. # chkconfig: - 85 15 # description: Nginx is a high-...
1.下载nginx 方法一 wget http://nginx.org/download/nginx-1.11.6.tar.gz 方法二 http://nginx.org/en/download.html在Nginx官网手动下载 2.解压nginx的gz包 tar -zxvf nginx-1.11.6.t...
本文档记录了完全使用最新源码来编译安装nginx最新版1.10.3,所有的依赖也是最新的,便于第三方nginx模块开发 假定使用root身份安装 目前最新的源码地址汇总 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz http:/...
为了自己的ThinkPad T420上面的Ubuntu可以使用openresty开发,我特地记录一下安装过程: 安装依赖包 apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl make build-essential 下载源码并...
根据工作需要,现在需要安装nginx服务器,本来可以直接安装别人制作好的rpm包的,但是本着爱折腾和时刻尝鲜的精神,我决定从官网下载最新的nginx源码来安装,下面记录了我的安装过程。 下面的安装假定是以root用户登录并执行 1.安装依赖库 这些依赖库主要有g++、gcc、openssl-devel、pcre-devel和zl...