Citrons

【实战】使用nginx与nginx-rtmp-module搭建流媒体服务器进行直播
在前天(2019.4.15)看见了爱慕爱慕大佬整的直播,就自己也试着整了一个,然后我按照爱慕大佬给的教程,emmm...
扫描右侧二维码阅读全文
17
2019/04

【实战】使用nginx与nginx-rtmp-module搭建流媒体服务器进行直播

在前天(2019.4.15)看见了爱慕爱慕大佬整的直播,就自己也试着整了一个,然后我按照爱慕大佬给的教程,emmmm都整不出来,QAQ~~~~然后就自己瞎整了一天给整了出来,废话不多说,教程如下:


运行环境&所需软件

  1. 一台干净的服务器(当然,也可以在自己原来的服务器上面整,我这样只是为了好讲解)
  2. CentOS7.5(为什么不推荐6.5或者其他呢?因为他们好像什么都没有,比如yun、wget和tar都没有,都需要自己安装,太麻烦了)
  3. Nginx1.8.1(用其他的也行)
  4. nginx-rtmp-module(这玩意是必需品)
  5. openssl(这个没有安装Nginx的时候好像会报错)
  6. OBS(全名Open Broadcaster Software,是一款大多数主播在用的推流软件)

让我们一起开始奇妙的流媒体之旅吧!


下载nginx-rtmp-module

nginx-rtmp-module的官方github地址:https://github.com/arut/nginx-rtmp-module
使用命令:
git clone https://github.com/arut/nginx-rtmp-module.git
将nginx-rtmp-module下载到linux中
如果在linux中,软件下载失败,直接在windows下载完毕后,上传到linux中效果是一样的,解压后命名为nginx-rtmp-module


安装nginx

(以1.8.1为例,用其它版本的换版本号就行)
nginx的官方网站为:https://nginx.org/en/download.html
安装时候可能会报错没有安装openssl,需要执行命令:
yum -y install openssl openssl-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配置文件

hls_path需要可读可写的权限,因为/usr/share/nginx/html/hls在目录中还没有,所以使用以下命令创建目录
mkdir -p /usr/share/nginx/html/hls
vi /usr/local/nginx/conf/nginx.conf
加入以下内容rtmp模块:(rtmp{}的内容和http{}为同级,位置不要放错直接放到文件最后就行了)

rtmp {    
    
    server {    
    
        listen 1935;  #监听的端口可以自己改
    
        chunk_size 4000;    
          
           
        application hls {  #rtmp推流请求路径  
            live on;    
            hls on;    
            hls_path /usr/share/nginx/html/hls;    
            hls_fragment 5s;    
        }    
    }    
}  

修改http中的server模块(重点就是修改端口和location ):

server {  
    listen       85;  #端口可自定义
    server_name  localhost;  
  
    #charset koi8-r;  
  
    #access_log  logs/host.access.log  main;  
  
    location / {  
        add_header Cache-Control no-cache;
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
        add_header 'Access-Control-Allow-Headers' 'Range';
        root   /usr/share/nginx/html;  
        index  index.html index.htm;  
    }  
  
    #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;  
    }  

然后启动nginx:
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
访问http://你的IP:85。出现403,说明安装成功。(如果需要绑定域名,请看后面
重启nginx的命令为:
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -s reload

这里说一句,你别跟我讲不知道怎么连上SSH....
SSH连接工具推荐:分享一款ssh工具——FinalShell


防火墙之开启/关闭/放行端口

Nginx整好后我们还需要放行端口:
阿里云,腾讯云什么的在控制台放行就行了,这里说的是在SSH里面修改
注意:CentOS6和7的防火墙不一样,我这里讲的是CentOS7,至于6自行百度
firewalld的基本使用
启动: systemctl start firewalld
关闭: systemctl stop firewalld
查看状态: systemctl status firewalld
开机禁用 : systemctl disable firewalld
开机启用 : systemctl enable firewalld

那怎么开启一个端口呢
添加 firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
重新载入 firewall-cmd --reload
查看 firewall-cmd --zone= public --query-port=80/tcp
删除 firewall-cmd --zone= public --remove-port=80/tcp --permanent

更多操作推荐阅读:CentOS7使用firewalld打开关闭防火墙与端口

开始推流

好了环境配置好了,开始推流
先安装好OBS
怎么安装?百度吧,不然篇幅太长了

教程图1
打开OBS,进入主界面
在文件->设置->串流 中填写信息:URL为 rtmp://xxx:1935/hls,xxx为你的服务器的IP地址(如我之前所说可以绑定域名),hls是用来存放流媒体的
秘钥可以随便填写一个,用来播放的时候识别播放哪个流媒体的,例如填写Citrons
填写完毕后,回主界面,点击开始推流,就说明我们的流媒体服务器搭建成功了
打开/usr/share/nginx/html/hls,里面出现Citrons.m3u8说明推流正常了


观看直播(拉流)

观看直播就比较简单了,可以简单的使用h5的vedio标签就可以观看了
可以访问http://xxx:85/hls/mystream.m3u8来观看直播,其中xxx为你的服务器IP地址
当然,不能让你们失望是不,这里推荐一个播放器,可以自动生成页面的————阿里云player播放器
我也提供一个页面,把推流地址换成你的就行了,就是source那一行的URL

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="IE=edge" >
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"/>
<title>Citrons博客-live</title>
<link rel="stylesheet" href="https://g.alicdn.com/de/prismplayer/2.8.1/skins/default/aliplayer-min.css" />
<script type="text/javascript" charset="utf-8" src="https://g.alicdn.com/de/prismplayer/2.8.1/aliplayer-min.js"></script>
<style>
    .citrons{
        position: absolute;
        width: 100%;
        height: 100%;
    }
    *{
        margin: 0;
        padding: 0;
        overflow:hidden;
    }
</style>
</head>
<body>
<div class="citrons">
<div class="prism-player" id="player-con"></div>
</div>
<script>
var player = new Aliplayer({
  "id": "player-con",
  "source": "https://live.imu.wang/live/imu.m3u8",
  "width": "100%",
  "height": "100%",
  "autoplay": true,
  "isLive": true,
  "rePlay": false,
  "playsinline": true,
  "preload": true,
  "controlBarVisibility": "hover",
  "useH5Prism": true,
  "skinLayout": [
    {
      "name": "bigPlayButton",
      "align": "blabs",
      "x": 30,
      "y": 80
    },
    {
      "name": "controlBar",
      "align": "blabs",
      "x": 0,
      "y": 0,
      "children": [
        {
          "name": "fullScreenButton",
          "align": "tr",
          "x": 10,
          "y": 10
        },
        {
          "name": "liveDisplay",
          "align": "tlabs",
          "x": 15,
          "y": 6
        }
      ]
    }
  ]
}, function (player) {
    player._switchLevel = 0;
    player.on('liveStreamStop',function(e) {
        alert('主播还没开播呢');
    });
  }
);
</script>
</body>
</html>

然后访问这个网站就能够观看直播了。延迟大概在20S左右
为什么延迟 那么高呢?这是因为服务器将视频流切断成一个个小的以.ts结尾的文件
而我们访问的是.m3u8文件,这个文件内容是将一个个ts文件串联起来的,这就达到了一个播放的效果,所以看起来会有很大的延迟
如果降低延迟也不是没有方法,可以设置切片生成的大小以及访问的速度,但是这样大大增加了服务器的压力
当然,我们也可以用rtmp拉流工具(VLC等)来看该直播,延迟大概在2-5S左右,拉流地址与推流地址一致


如何绑定域名

域名绑定需要编辑 Nginx 的配置文件完成,Nginx 配置文件是/usr/local/nginx/conf/nginx.conf,将默认的server {...}中的server_name 修改为你要绑定的域名,修改之后重启 Nginx 服务即可。
推荐阅读文章:Linux 服务器配置网站以及绑定域名


如何给绑定域名配置SSL

如果你的Nginx只挂了一个网站,没有用vhost,那么配置文件是 /usr/local/nginx/conf/nginx.conf,如果你的Nginx挂了多个网站或者启用了vhost,那么配置文件是 /usr/local/nginx/conf/vhost/你的域名.conf

打开配置文件。在 server{ } 中加入以下内容(也可以将原本的注释符号删掉,修改就行了):

    server {
        listen 443 ssl;
        server_name 你绑定的域名;
        ssl on;

       ssl_certificate      xxx.pem的证书路径;
        ssl_certificate_key  xxx.key的证书路径;

        ssl_session_cache    shared:SSL:1m;
       ssl_session_timeout  5m;

      ssl_ciphers  HIGH:!aNULL:!MD5;
      ssl_prefer_server_ciphers  on;

        location / {
            add_header Cache-Control no-cache;
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
        add_header 'Access-Control-Allow-Headers' 'Range';
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        }
     }

启动Nginx服务(安装后是没有启动的):
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
重启Nginx服务:
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -s reload
关闭Nginx服务:
pkill -9 nginx
推荐文章:Nginx的启动、停止与重启


OBS疑难杂症之win10捕捉屏幕黑屏

目前我就遇见这个问题
解决方法一:
尝试把程序兼容性设置成win7和管理员身份,具体操作:
右键快捷方式->属性->兼容性标签,记得勾选以管理员身份运行
演示图2
解决方法二:
如果设置兼容还无法获取显示器,那么就是显示器使用的显卡,和OBS使用的显卡不是同一张
WIN+R 运行 dxdiag 切换到 显示 选项卡,设备中,就是当前显示器使用的显卡。
解决方法三:
右键OBS快捷方式->用图形处理器运行->更改默认图形处理器
打开
选择管理3D设置->程序设置->选择要自定义的程序->添加->选定OBS studio->添加即可
如果还是黑屏,就将为此程序选择首选图形处理器换一下,我换成集成图形就可以捕捉了
演示图3

关于OBS基础设置和其他疑难杂症请自行百度


好啦,基础教程就到这了,如果有不明白的可以在评论区下方提出哦QAQ~~
附上我的直播地址:传送门

广而告之:

Last modification:April 23rd, 2019 at 07:27 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment

4 comments

  1. yamakuchi

    哇qwq 我也来整一个~~号腻害的感觉,发现野生大佬

  2. 小石

    嘤嘤嘤 1M宽带服务器瑟瑟发抖,在区域网跑应该还行

    1. Citrons
      @小石

      1M能跑128k-160k的样子,能支持一个人看高清QAQ

      1. 小石