六nging-http-flv-module的使用

Posted 释然`

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了六nging-http-flv-module的使用相关的知识,希望对你有一定的参考价值。

1. 前言

前面几章我们已经把基础环境都已经搭建完成,这一章我们通过使用 nginx-http-flv-module 搭建一个可以通过HTTP请求并且通过flv.js实现在html网页播放实时视频的应用场景。

2. 安装nginx-http-flv-module模块

2.1 简述

nginx-http-flv-module是基于nginx-rtmp-module 的流媒体服务器。它具备了所有nginx-rtmp-module的功能,并且新增多种新功能,功能对比如下。

功能nginx-http-flv-modulenginx-rtmp-module备注
HTTP-FLV (播放)x支持 HTTPS-FLV 和 chunked 回复
GOP 缓存x
虚拟主机x
省略 listen 配置见备注配置中必须有一个 listen
纯音频支持见备注wait_video 或 wait_key 开启后无法工作
reuseport 支持x
定时打印访问记录x
JSON 风格的 statx
stat 中包含录制详情x

2.2 兼容性

NGINX 的版本应该大于或者等于 1.2.6,与其他版本的兼容性未知。

2.3 支持的系统

  • Linux(推荐)/ FreeBSD / MacOS / Windows(受限)。

2.4 支持的播放器

  • VLC (RTMP & HTTP-FLV) / OBS (RTMP & HTTP-FLV) / JW Player (RTMP) / flv.js (HTTP-FLV)。

2.5 其他

其余详见 nginx-http-flv-module 下的 README.CN.md

2.6 下载

下载地址:https://github.com/winshining/nginx-http-flv-module
选择一个版本然后点击Code --> Download ZIP,这里最新版本为 v1.2.10,我选择的是 v1.2.8 版本。

然后通过xftp远程工具将文件上传至服务器。

2.7 编译安装

将已上传的nginx-http-flv-module解压。

[root@localhost download]# unzip nginx-http-flv-module-1.2.8.zip 

对文件夹进行重命名(看个人习惯,不重命名也一样可以)。

[root@localhost download]# mv nginx-http-flv-module-1.2.8 nginx-http-flv-module
# 移动文件夹到 /usr/local/下
[root@localhost download]# mv ./nginx-http-flv-module /usr/local/

下面就可以重新编译nginx了,并将nginx-http-flv-module模块编译到nginx中。
进入最开始解压出来的nginx目录下。

[root@localhost download]# cd /opt/download/nginx-1.18.0/
# 执行编译命令
[root@localhost nginx-1.18.0]# ./configure --add-module=/usr/local/nginx-http-flv-module
[root@localhost nginx-1.18.0]# make && make install

接下来查看nginx是否安装成功nginx-http-flv-module模块,执行命令。

[root@localhost nginx-1.18.0]# nginx -V


这里就说明我们安装成功了。

3. 配置nginx配置文件文件

修改nginx配置文件。

[root@localhost nginx-1.18.0]# cd /usr/local/nginx/conf/
[root@localhost conf]# vim ./live.conf 

配置文件如下:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events 
    worker_connections  1024;


rtmp 
    out_queue           4096;
    out_cork            8;
    max_streams         128;
    timeout             15s;
    drop_idle_publisher 15s;
    
    log_interval 5s; #log 模块在 access.log 中记录日志的间隔时间,对调试非常有用
    log_size     1m; #log 模块用来记录日志的缓冲区大小
     
     server 
        listen 7933;
        
        application myapp 
            live on;
        
       application hls 
            live on;
            hls on;
            hls_path /tmp/hls;
        
        
        application dash 
            live on;
            dash on;
            dash_path /tmp/dash;
        
    



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  0;
    keepalive_timeout  65;

    #gzip  on;

    server 
        listen       80;
        server_name  localhost;

        #access_log  logs/host.access.log  main;

        location / 
            add_header 'Access-Control-Allow-Origin' '*';
            root   html;
            index  index.html index.htm;
        

        location /live 
            flv_live on;
            chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复 
            add_header 'Access-Control-Allow-Origin' '*'; #添加额外的 HTTP 头
            add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的 HTTP 头      
         

        location /flv 
            add_header 'Access-Control-Allow-Origin' '*';
            flv_live on;
            chunked_transfer_encoding on;
        

	# control控制器
	location /control 
	    rtmp_control all;
	
        location /stat 
            #推流播放和录制统计数据的配置
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
         
         location /stat.xsl 
             root /usr/local/nginx-http-flv-module/; #指定 stat.xsl 的位置
         
        #error_page  404              /404.html;

        error_page   500 502 503 504  /50x.html;
        location = /50x.html 
            root   html;
        
    

主要配置为: rtmp标签下的server配置其监听7933端口,并配置location myapp设置属性live on 表示开启直播。http标签下的server配置其监听80端口,并配置location /live设置属性 flv_live on。注意其中的 add_header ‘Access-Control-Allow-Origin’ ‘*’add_header ‘Access-Control-Allow-Credentials’ ‘true’ 很重要,主要解决了前端通过HTTP方式拉流是的跨域问题。
目前nginx-http-flv-module模块配置完成,并且nginx配置文件也已经配置完成 下面进行推流与拉流测试。
执行推流命令:

ffmpeg -rtsp_transport tcp -i rtsp://admin:Admin12345@192.168.1.65:554/h264/ch0/main/av_stream -c:v libx264 -c:a aac -f flv -an rtmp://192.168.5.177:7933/myapp/room


推流成功。这里我说明一下 我使用的是海康威视的网络摄像头 rtsp://admin:Admin12345@192.168.1.65:554/h264/ch0/main/av_stream 这个地址是我的摄像头播放地址,请查看并使用你使用的摄像头播放地址。
下面通过VLC播放器进行拉流播放。
播放URL为 http://192.168.5.177/live?port=7933&app=myapp&stream=room 其中192.168.5.177换成你的服务器ip ,live是nginx配置文件中配置的请求地址,可以查看nginx配置文件中的配置,port为nginx配置文件中rtmp标签下server监听的端口号(注意开放服务器防火墙),app=myapp这个myapp与rtmp标签下 server下的location myapp所对应,stream=room这个room与你推流地址所对应。

点击播放。

播放成功。

4. 通过VUE播放实时视频流

首先创建一个新的vue项目,并通过编辑器打开项目。

E:\\vueCode>vue create live
# 执行命令运行项目
E:\\vueCode\\live> npm run serve


由于我们只需要使用一个页面那么我就直接在app.vue页面直接写了。
下面先安装flv.js,执行命令。

E:\\vueCode\\live> npm install --save flv.js


安装完成,下面进行编码。

<template>
  <div id="app">
    <video
      id="videoLive"
      crossorigin="anonymous"
      controls
      autoplay
      width="100%"
      height="100%"
      style="object-fit: fill"
    ></video>
  </div>
</template>

<script>
import flvjs from "flv.js";

export default 
  name: "App",
  data() 
    return 
      flvPlayer: null,
    ;
  ,
  mounted() 
    this.createVideo('http://192.168.5.177/live?port=7933&app=myapp&stream=room',"videoLive")
  ,
  methods: 
    createVideo(url, elementId) 
      if (flvjs.isSupported()) 
        let videoElement = document.getElementById(elementId);
        this.flvPlayer = flvjs.createPlayer(
          type: "flv",
          enableWorker: true, //浏览器端开启flv.js的worker,多进程运行flv.js
          isLive: true, //直播模式
          hasAudio: false, //关闭音频
          hasVideo: true,
          stashInitialSize: 128,
          enableStashBuffer: true, //播放flv时,设置是否启用播放缓存,只在直播起作用。
          url: url,
        );
        this.flvPlayer.attachMediaElement(videoElement);
        this.flvPlayer.load();
        this.flvPlayer.play();
      
    ,
  ,
;
</script>

<style>
#app 
  width: 640px;
  height: 480px;
  border: 1px red solid;
  margin: 0 auto;

</style>

保存并查看页面。

此时页面就能够正常的播放摄像头的实时视频流了,不过这里两个问题,第一个问题是视频延时大概在6~7秒左右,这是延时是我们无法接受的,第二个问题是当我们在浏览器切换了一个标签后,我们发现视频默认暂停了,当我们再次回到页面的时候就需要手动调整进度条,这个是不行的不够友好。下面先来解决第一个延时问题。
这个延时问题主要是因为ffmpeg在对视频进行转码时的延迟,这时我们来优化ffmpeg转码参数,命令如下。

ffmpeg -rtsp_transport tcp -i rtsp://admin:Admin12345@192.168.1.65:554/h264/ch0/main/av_stream -c:v libx264 -c:a aac -threads 5 -preset ultrafast -max_delay 100000 -f flv -an rtmp://192.168.5.177:7933/myapp/room

对比第一条参数我们多加了 -threads 5 -preset ultrafast -max_delay 100000 参数,-threads 5的意思是 设置编解码等工作的线程数,线程数多了速度自然比一个线程处理的快 -preset ultrafast 用来指定视频的输出质量,它共有以下几个可以用的值:

  • ultrafast 超快的
  • superfast 超高速的
  • veryfast 非常快
  • faster 更快
  • fast 快
  • medium 中等
  • slow 缓慢的
  • slower 较慢的
  • veryslow 非常慢
    我们这里使用的是 ultrafast 超快的,-max_delay 100000 表示指定视频的最大延迟,这里设置100ms。调优参数就设置到这里,下面设置flv.js的参数。
  createVideo(url, elementId) 
      if (flvjs.isSupported()) 
        let videoElement = document.getElementById(elementId);
        this.flvPlayer = flvjs.createPlayer(
          type: "flv",
          enableWorker: true, //浏览器端开启flv.js的worker,多进程运行flv.js
          isLive: true, //直播模式
          hasAudio: false, //关闭音频
          hasVideo: true,
          stashInitialSize: 128,
          enableStashBuffer: true, //播放flv时,设置是否启用播放缓存,只在直播起作用。
          url: url,
        , 
          enableStashBuffer: false, //禁用IO存储缓存区
        );
        this.flvPlayer.attachMediaElement(videoElement);
        this.flvPlayer.load();
        this.flvPlayer.play();
      
    

主要参数为:

  
     enableStashBuffer: false, //禁用IO存储缓存区
  

下面重新执行命令,并刷新页面,查看延迟效果。


可以发现目前延迟大概在500ms左右,如果觉得还有有点慢的话可以调整转码的分辨率和视频大小等参数,可以自行百度查找。
下面解决第二个问题,切换标签页后页面自动暂停问题。

  mounted() 
    this.createVideo('http://192.168.5.177/live?port=7933&app=myapp&stream=room',"videoLive")
    this.monitorVideo()
  ,
  methods: 
    createVideo(url, elementId) 
      if (flvjs.isSupported()) 
        let videoElement = document.getElementById(elementId);
        this.flvPlayer = flvjs.createPlayer(
          type: "flv",
          enableWorker: true, //浏览器端开启flv.js的worker,多进程运行flv.js
          isLive: true, //直播模式
          hasAudio: false, //关闭音频
          hasVideo: true,
          stashInitialSize: 128,
          enableStashBuffer: true, //播放flv时,设置是否启用播放缓存,只在直播起作用。
          url: url,
        , 
          enableStashBuffer: false, //禁用IO存储缓存区
        );
        this.flvPlayer.attachMediaElement(videoElement);
        this.flvPlayer.load();
        this.flvPlayer.play();
      
    ,
    monitorVideo()
      let videoElement = document.getElementById("videoLive");
      videoElement.onpause =function()
        //监听video标签是否暂停,如果暂停就让他继续播放
        if (videoElement.paused)
          videoElement.play()
        
      
    
  ,

主要参数如下:


其思想就是监听video标签是否暂停,如果暂停了就让他继续播放,这就相当于做了一个后台播放效果出来了。

5. 掉线重连

这时如果视频服务器突然掉线了怎么办,解决方法如下。

  methods: 
    createVideo(url, elementId) 
      if (flvjs.isSupported()) 
        let videoElement = document.getElementById(elementId);
        this.flvPlayer = flvjs.createPlayer(
          
            type: "flv",
            enableWorker: true, //浏览器端开启flv.js的worker,多进程运行flv.js
            isLive: true, //直播模式
            hasAudio: false, //关闭音频
            hasVideo: true,
            stashInitialSize: 128,
            enableStashBuffer: true, //播放flv时,设置是否启用播放缓存,只在直播起作用。
            url: url,
          ,
          
            enableStashBuffer: false, //禁用IO存储缓存区
          
        );
        this.flvPlayer.attachMediaElement(videoElement);
        if (url != null && url !== "") 
          this.flvPlayer.load();
          this.flvPlayer.play();
        
        let _then = this;
        // 重连 监听flvPlayer异常
        this.flvPlayer.on(flvjs.Events.ERROR, function (errType, errDetail) 
          console.error("连接异常,正在尝试重新连接", errType, errDetail);
          //如果flvPlayer不为空
          if (_then.flvPlayer) 
            _then.reloadVideo(_then.flvPlayer, elementId, url);
          
        );
      
    ,
    reloadVideo(flvPlayer, elementId, url) 
      this.destoryVideo(flvPlayer);
      // 重新执行createVideo方法
      this.createVideo(url, elementId);
    ,
    //销毁flvPlayer
    destoryVideo(flvPlayer) 
      flvPlayer.pause();
      flvPlayer.unload();
      flvPlayer.detachMediaElement();
      flvPlayer.destroy();
      flvPlayer = null;
    ,
    monitorVideo() 
      let videoElement = document.getElementById("videoLive");
      videoElement.onpause = function () 
        //监听video标签是否暂停,如果暂停就让他继续播放
        if (videoElement.paused) 
          videoElement.play();
        
      ;
    ,
  

主要代码如下:

其思想就是通过flvPlayer的on方法监听flvjs的异常,如果出现异常就先将当前的flvPlayer销毁,然后重新调用createVideo方法,不过on监听时间为15秒,也就是说断线15秒以后才会重新连接。
好了,目前直播服务器到这里就结束了,由于本人也不太懂音视频相关的技术,所以在文章中如果有可以优化并且有错误的地方希望大佬告知一下,多谢!!!

六,zabbix模板创建与使用

六,zabbix模板创建与使用

一,使用zabbix自带模板

1,模板(template)的作用

简单来说就是给需要监控的项组合到一起作为一个监控模板,后续有其他主机需要监控相同的项,直接使用该模板即可,不必要在手动逐个添加监控项了。

2,举例使用zabbix自带模板

配置--主机--创建主机--模板--选择模板--添加模板

技术图片

上述步骤为主机添加了Template OS Linux模板,此时查看其主机可以看出哪些监控项,触发器是来自该模板的了,至此给主机添加自带模板并使用模板监控项,触发器就完成了。

技术图片

二,自行创建使用模板

1,为什么要自行创建模板

因为zabbix自带的模板,其中定义的监控项等不一定适合我们自己的实际使用场景,而我们对监控需求的机器又比较多,这时候自定义符合自己使用场景的模板就很重要了

2,创建模板

配置--模板--创建模板--

[Zabbix监控——Zabbix创建模板(templates)及监控项(item)]技术图片

添加模版的操作面板如下
[Zabbix监控——Zabbix创建模板(templates)及监控项(item)]技术图片

模版添加成功后的界面如下
[Zabbix监控——Zabbix创建模板(templates)及监控项(item)]技术图片

点击对应模版的item链接进入该模版的item集合页面
[Zabbix监控——Zabbix创建模板(templates)及监控项(item)]技术图片

点击item页面的右上角的create item链接进入创建监控项操作面板
[Zabbix监控——Zabbix创建模板(templates)及监控项(item)]技术图片

给大家展示一下使用简单检查方式监控服务器是否宕机
[Zabbix监控——Zabbix创建模板(templates)及监控项(item)]技术图片

[Zabbix监控——Zabbix创建模板(templates)及监控项(item)]技术图片

再来展示一下使用zabbix_agent主动方式监控服务状态的监控项
[Zabbix监控——Zabbix创建模板(templates)及监控项(item)]技术图片

[Zabbix监控——Zabbix创建模板(templates)及监控项(item)]技术图片

在主机配置中给主机引用该模板,即可使用该template,此处只是简单演示增加一个监控项,模板还可以链接其他模板,从而省去重复创建其他模板中已经有的监控项。

本文第二部分引用:https://blog.51cto.com/183530300/2087741

以上是关于六nging-http-flv-module的使用的主要内容,如果未能解决你的问题,请参考以下文章

峡谷partners——团队作业六:用户使用调查报告

scratch编程对于六年级来说难吗

Mysql 使用 JOIN 获取过去六周的数据

创建 OpenStack云主机 [六]

尝试使用 div 排列六个图像

实验六 进程基础