手撸一个简陋直播系统

手撸直播系统

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
posted @ 2020-05-11 23:21  callmelx  阅读(1159)  评论(0编辑  收藏  举报