• 欢迎访问显哥博客,本网站纯属学习技术,绝无商业用途,欢迎小伙伴们共同学习!研究技术!QQ:52249909 加我QQ
  • 世界75亿人,这么小的概率,能认识你,是我一生的幸运,不妨加个QQ接触一下:52249909 加我QQ

Nginx搭建流媒体服务器详解(RTMP和HLS)【显哥出品,必为精品】

技术栈 lixian 4年前 (2021-01-21) 5115次浏览 0个评论 扫描二维码
文章目录[隐藏]

Nginx搭建流媒体服务器详解(RTMP和HLS)【显哥出品,必为精品】

前言

Nginx本身是一个非常出色的HTTP服务器,FFMPEG是非常好的音视频解决方案.这两个东西通过一个nginx的模块nginx-rtmp-module,组合在一起即可以搭建一个功能相对比较完善的流媒体服务器.

这个流媒体服务器可以支持RTMP和HLS(Live Http Stream)
Nginx搭建流媒体服务器详解(RTMP和HLS)【显哥出品,必为精品】

安装ffmpeg

安装过程参考我写的另一篇文档:

Centos7 编译安装ffmpeg带libx264 (附带源码包)【显哥出品,必为精品】 | 显哥博客

一、环境准备 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

Nginx搭建流媒体服务器详解(RTMP和HLS)【显哥出品,必为精品】

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。由此决定了客户端访问直播流的方式,见下图:(客户端拉流过程)

Nginx搭建流媒体服务器详解(RTMP和HLS)【显哥出品,必为精品】

拉流地址:

RTMP流:rtmp://localhost:1935/rtmplive/test

HLS流:http://localhost:8080/hls/test.m3u8


本站博主 , 版权所有丨如未注明 , 均为原创
转载请注明原文链接:Nginx搭建流媒体服务器详解(RTMP和HLS)【显哥出品,必为精品】
喜欢 (4)

您必须 登录 才能发表评论!