• 手撸一个简陋直播系统


    手撸直播系统

    1. Nginx 基础

    1.nginx概述和作用

    • 做web服务器
    • 反向代理服务器
    • 邮件代理服务器

    2.安装nginx

    • 选择安装版本

      • Mainline version: Nginx主力研发阶段
      • Stable version: 最新的稳定版本
      • Legacy versions: 稳定的老版本
    • 安装:

      • 依赖: gcc, g++ , zlib, pcre, openssl

      • 解压进入nginx

        ./configure
        make && make install
        
      • 验证:

        /usr/local/nginx/sbin/nginx -v
        

    3.nginx 配置

    • 配置命令

    • 简单命令

    • 块命令

      location /{
      	root html;
      	index index.html index.htm;
      }
      
    • 注释 :#

    • 配置上下文:

      nginx.conf 中的文件,根据逻辑不同,划分成了不同的作用域.不同的作用域用大括号进行限定

      主要的上线文:

      • main:
        • 配置影响nginx 全局的命令,Nginx 运行时与具体功能无关的一些参数,如进程数,用户等
      • http:
        • 提供http相关的参数,如是否使用keep-alive,是否使用gizp进行压缩.可以嵌套多个server 配置项,配置代理,缓存,日志定义等绝大多数功能和是第三方的模块配置.
      • server:
        • http上支持若干台虚拟主机每一个虚拟主机对应一个server配置项
      • location:
        • 对某个特定URL的配置
      • events:
        • nginx 服务器与用户的网络连接时的一些参数,包括最大连接数,采用哪种事件驱动模型处理请求,是否允许nginx 接受多个网络连接等
      • upstream:
        • 配置http的负载均衡器,分配流量到几个应用服务器

    4. 配置变量

    • 内置变量

      Nginx 变量名前必须要有一个$符号,这个是语法上的要求,在配置文件引用变量的时候必须$

      常见的内置变量列表示例:

      $remote_user: 用来记录客户端的连接名称
      $time_local:  用来记录访问时间和时区
      $reqeust: 用来记录请求的url和http协议
      $status: 用来记录访问的状态,成功是200
      $http_referer: 用来记录访客从哪个页面来的
      $http_user_agent:客户浏览器的相关参数
      
    • 自定义变量

    #语法: set var_name value;
    set $a "hello world";
    

    5. nginx 配置实例

    #运行用户
    #user nobody;
    #工作进程数,通常设置成,cpu,数量相等或其两倍
    worker_processs 1;
    #全局错误日志
    #error_log logs/error.log;
    #error_log logs/error.log notice;
    #error_log logs/error.log info;
    
    #pid文件
    #pid logs/nginx.pid
    
    #工作模式及连接数连上线
    events {
        #单个后台工作进程最大连接数
        worker_connections 1024;
    }
    #设置http服务的配置
    http {
        # 设定mime 类型,类型有mime.type定义
        include  mime.type;
        #默认文件类型
        default_type application/octect-stream;
        #设定日志格式
        #log_format main '$remote_addr - $remote_user'
        #sendfile 命令来指定是否调用sendfile函数(zero copy方式)来输出文件
        #对于普通文件应用,必须设置为on
        sendfile on;
        
        #连接超时时间
        keepalive_timeout 65;
        
        #开启gizp压缩
        #gizp on;
        
        #设定虚拟主机配置
        server{
    		#监听80端口
            listen 80;
            #设置访问域名
            server_name localhost
            #访问日志
    		#access_log logs/host.access.log
            #默认请求
            location / {
            	# 定义虚拟主机站点的根目录
                root html;
                # 定义首页索引文件名称
                index index.html index.html;
            }
            #定义错误页面
            error_page 500 502 503  /50x.html;
            location =/50x.html{
                root html;
            }
        }
        
    }
    
    
    

    tip : 知识补充

    1. 什么是mime?

      mime是一种标识,浏览器根据他去判断用什么形式去展示他,比如一个flash,一个图片,一段文字,在浏览器的展示时不同的, MIME Type 不是个人指定的,是经过 ietf 组织协商,以 RFC 的形式作为建议的标准发布在网上的,大多数的 Web 服务器和用户代理都会支持这个规范

    2. default_type:

       有时,需要用户下载文件而不是直接播放,而Nginx在默认配置下,会根据文件的后缀来匹配相应的MIME类型,并写入Response header,导致浏览器播放文件而不是下载,这时需要通过配置让Nginx返回的MIME类型为下面这个类型: 
      
      
      location /download/ {
          types        { }
          default_type application/octet-stream;
      }
      

      application/octet-stream;这个类型会让浏览器认为响应是普通的文件流,并提示用户下载文件

    3. sendfile函数:

      https://www.jianshu.com/p/70e1c396c320?utm_campaign

    sendfile 函数,是用来提高io效率的


    6. nginx模块

    • 模块分类:
      • event module:
        • 搭建了独立于操作系统的事件处理机制框架, 提供了各种事件的处理模块,包括,ngx_events_module,ngx_event_core_module, nginx_epoll_module等
      • phase handler:
        • 此模块也被称为handler模块,主要负责处理客户端请求并产生待响应内容,比如ngx_http_static_module模块,负责客户端的静态页面请求处理并磁盘上的内容返回.
      • output filter:
        • filter 模块,主要对输出内容进行处理,可以对输出内容进行修改,比如对图片url的替换工作.
      • upstream:
        • 实现反向代理,将真正的请求转发到后台服务器上,并从后台服务器中读取响应发送给客户端.
      • load-balance:
        • 实现特定的算法,在众多服务器中选择一个作为请求的转发服务器
      • extend-module:
        • 第三方模块

    2.Nginx-rtmp-module

    1. nrm特性

    nginx-rtmp-module下面简称NRM,NRM具有以下特性:

    • 支持rtmp,hls,mpeg-dash直播

    • 支持 rtmp hls点播

    • 支持将以此直播分成多个视频存储

    • 支持h.264视频编码/解码

    • 支持ffmpeg命令

    • 支持回调http

    • 可以使用http对直播进行控制,如删除和录播

    2. rtmp协议和hls协议

    • rtmp协议:

      real time messaging protocol 试试消息传送协议(RTMP),他是adobe公司为 flash播放器和服务器之间传输的私有协议

    • hls:

      http live streaming (HLS)是苹果公司开发的标准,他是苹果基于自身设备开发的流,他是基于http的,所以他继承了很多http的东西.

    3.安装第一个直播系统

    1. 下载并安装NRM:

    git clone https://github.com/arut/nginx-rtmp-module.git
    #进入nginx安装目录
    ./configure --add-module=/path/to/nginx-rtmp-module
    make
    make install
    

    2. 修改配置:

    备份并编辑nginx .conf,精简后的nginx如下:

    worker_process 1;
    events{
        worker_connections 1024;
    }
    rtmp{
        server {
            listen 1935;
            application mylive{
                live on;
            }
        }
    }
    
    http{
        include mine.type;
        default_type  application/octet-steam;
        sendfile on;
        keepalive_timeout 65;
        server{
            listen 80;
            server_name localhost;
            location /{
                root html;
                index index.html index.htm;
            }
            error_page 500 502 503 504 /50x.html;
            location =/50x.html{
                root html;
            }
        }
    }
    

    3. 推流

    使用obs进行推流,vlc也可以推流操作

    4. 拉流

    通过浏览器或者vlc进行拉流

    ....


    4.RTM进阶

    1. 利用ntm只是 hls直播:

    • 创建存放ts,m3u8的文件夹

      mkdir video
      
    • 修改配置文件

      rtmp{
          server {
              listen 1935;
              application mylive{
                  live on; #开启直播
                  hls on; #开启hls直播
                  hls_path /video; #hls存放m3u8,ts文件的路径
              }
          }
      }
      

    因为hls是基于http协议的,所以不能通过rtmp头去访m3u8文件,所以需要一个http sever

    http{
        server{
            listen 80;
            location /mylive_hls{
                types{
                	#m3u8 type设置
                    application /vnd.apple.mpegurl m3u8;
                    #ts 分片设置
                    video/mp2t ts;
                }
            	alias /vieo;# 指向m3u8所在的文件夹
                add_header Cache-Control no-cache; #禁制缓存
            }
        }
    }
    

    2. 推/拉流和串流码

    • 推流: 将视频媒体资源推送到服务器

    • 拉流: 向服务器获取视频资源

    • 串流码: stream key 区分同一application中的不同直播流

      rtmp://127.0.0.1:1935/live/123
      rtmp://127.0.0.1:1935/live/124
      rtmp://127.0.0.1:1935/ls/123
      

      live ls是application,不同的应用,123,124是串流码

    3. controller

    controller控制器是http模块,它可以通过http协议,从外部控制rtmp模块,通过controller控制器,使用record,drop,redirect命令来实现我们的业务场景

    需要的配置:

    http模块下:

    location /controller{
        rtmp_controller all;
    }
    

    4. record 命令:

    通过record可以完成对直播的录制和停止直播功能

    示例

    application mylive{
        live on;
        hls on;
        hls_path /video;
        hls_fragment 2s;
        hls_playlist_length 16s;
        recorder myRecord{
            record all manual;
            record_suffix _.flv;
            record_path /video;
        }
    }
    

    5. FFmpeg

    1. 什么是ffmpeg?

    ffmpeg是一套可以用来记录,转换数字音频,视频,并将其转换成流的开源计算机程序.

    2. 支持的协议

    http,rtp,rtsp,RealMedia tcp,udp,rtmp,rtmpt,rtmpe,rtmps,sdp,mms等

    3. 下载安装

    git clone https://github.com/FFmpeg/FFmpeg.git
    

    进行配置并编译安装

    #进入ffmpeg目录:
    ./configure --prefix=/usr/local/ffmpeg
    make & make install
    

    添加到环境变量:

    vim /etc/profile
    #定位到尾部添加
    export FFMPEG_HOME = /usr/local/ffmpeg
    #再将$FFMPEG_HOME/bin 插入到$path变量之前
    export FFMPEG_HOME = /usr/local/ffmpeg
    export PATH=$FFMPEG_HOME/bin:$PATH
    
    #使配置生效
    source /etc/profile
    

    测试:

    ffmpeg -version
    
  • 相关阅读:
    实习第三十天
    实习第二十九天
    武汉第二十七天
    实习第二十六天
    实习第二十五天
    实习第二十四天
    python基础之核心风格
    1 Python入门
    对计算机的基础概念讨论
    一对多,父对象包含其他对象字段时创建的连接就是一对多连接
  • 原文地址:https://www.cnblogs.com/callmelx/p/12873014.html
Copyright © 2020-2023  润新知