前言
Nginx本身是一个非常出色的HTTP服务器,FFMPEG是非常好的音视频解决方案.这两个东西通过一个nginx的模块nginx-rtmp-module,组合在一起即可以搭建一个功能相对比较完善的流媒体服务器.
这个流媒体服务器可以支持RTMP和HLS(Live Http Stream)
安装ffmpeg
安装过程参考我写的另一篇文档:
一、环境准备 yasm源码包下载: wget https://download.lixian.fun/Linux_LNMP_packers/yasm-1.3.0.tar.gz x264源码包下载: wget https://download.lixian.fun/Linux_LNMP_packers/x264.tar.gz ffmpeg源码包下载: wget https://download.lixian.fun/Linux_LN
安装Nginx
安装nginx的方法有很多,编译安装,源码安装
但是需要注意的是:
一定要添加nginx-rtmp-module模块!
一定要添加nginx-rtmp-module模块!
一定要添加nginx-rtmp-module模块!
1、下载nginx-rtmp-module:
nginx-rtmp-module的官方github地址:https://github.com/arut/nginx-rtmp-module
下载使用命令:
git clone https://github.com/arut/nginx-rtmp-module.git
2、安装nginx:
nginx的官方网站为:http://nginx.org/en/download.html
yum -y install openssl openssl-devel pcre-devel wget http://nginx.org/download/nginx-1.8.1.tar.gz tar -zxvf nginx-1.8.1.tar.gz cd nginx-1.8.1 ./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module --with-http_ssl_module make && make install
修改nginx配置文件nginx.conf
rtmp { server { listen 1935; #端口 #RTMP 直播流配置 application rtmplive { live on; } #HLS 直播流配置 application hls { live on; hls on; #开启hls hls_path /tmp/hls; hls_fragment 5s #一个ts 文件的时长 5s } } } 需要在http里面增加一个location配置 location /hls { types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root /tmp; add_header Cache-Control no-cache; }
user nginx; worker_processes 2; error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { use epoll; worker_connections 1024; } #切换自动推送(多 worker 直播流)模式。默认为 off rtmp_auto_push on; #当 worker 被干掉时设置自动推送连接超时时间。默认为 100 毫秒 rtmp_auto_push_reconnect 1s; rtmp { server { listen 1935; #直播流配置 application myapp { live on; } # hls切片 application hls { live on; hls on; hls_path /tmp/hls; } # 拉流 application qiniu { live on; push rtmp://拉流地址; } # 转推 application pull { live on; pull rtmp://转推地址; } # rtmp日志设置 access_log logs/rtmp_access.log ; } } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; gzip on; server { listen 80; server_name localhost; charset utf-8; access_log logs/host.access.log main; location /stat { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; } location /stat.xsl { root /opt/software/nginx-rtmp-module/; } location / { root /opt/www/html; index index.html index.htm; } location /hls { types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root /tmp; add_header Cache-Control no-cache; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } include vhosts/*.conf; }
重启Nginx
nginx -t nginx -s reload
查看Nginx已监听1935端口。
推一个本地的mp4到hls上:
ffmpeg -re -i /root/20210116123635.mp4 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://192.168.1.99:1935/hls
可以使用VLC客户端测试观看hls流测试视频
hls流播放地址为: http://192.168.1.99/hls/index.m3u8
其中,HLS流表现较明显,在nginx的临时目录下,直观的可看到 m3u8索引文件和N多个 .ts文件。m3u8列表会实时更新,且会动态更改当前播放索引切片(.ts)。这种实时更新的机制,不会使得.ts文件长时间存在于Nginx服务器上,且当推流结束之后,该目录下的内容会被全部清除,这样无形中减缓了nginx服务器的压力。HLS协议在服务器端将直播 数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。由此可见,基本上可以认为, HLS是以点播的技术方式来实现直播。由于数据通过HTTP协议传输,所以完全不用考虑防火墙或者代理的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过HLS的这种技术特点,决定了它的延迟一般总是会高于普通的流媒体直播协议。
m3u8索引文件
#EXTM3U m3u文件头,必须放在第一行 #EXT-X-MEDIA-SEQUENCE 第一个TS分片的序列号 #当前索引 #EXT-X-TARGETDURATION 每个分片TS的最大的时长 #EXT-X-ALLOW-CACHE 是否允许cache #EXT-X-ENDLIST m3u8文件结束符 #EXTINF extra info,分片TS的信息,如时长,带宽等
现在我们的流媒体服务器有两个实时流了,一个是rtmp的,另一个是hls的,用流媒体播放器播放一下,流媒体播放器可以用vlc也可以用ffmpeg带的ffplay.手机也是可以播放的。
第一个就是推送的地址: rtmp://serverIp:1935/myapp/test1
第二个是HTTP地址: http://serverIp:8080/hls/test2.m3u8
播放rtmp流或hls流
最简单的测试,可通过VLC播放器,建立网络任务实现播放。所谓的播放,就是从Nginx服务器取到视频流并播放,也称之为“拉流”。需注意的是,HLS是基于HTTP的流媒体传输协议, 端口为8080 ,hls的话用hls on开启hls,并且为hls设置一个临时文件目录 hls_path /tmp/hls;其它更高级的配置可以参看nginx-rtmp-module的readme;而RTMP本身即为实时消息传输协议, 端口为1935。由此决定了客户端访问直播流的方式,见下图:(客户端拉流过程)
拉流地址:
RTMP流:rtmp://localhost:1935/rtmplive/test
HLS流:http://localhost:8080/hls/test.m3u8