前言
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





