手撸直播系统
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的负载均衡器,分配流量到几个应用服务器
- main:
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 : 知识补充
-
什么是mime?
mime是一种标识,浏览器根据他去判断用什么形式去展示他,比如一个flash,一个图片,一段文字,在浏览器的展示时不同的, MIME Type 不是个人指定的,是经过 ietf 组织协商,以 RFC 的形式作为建议的标准发布在网上的,大多数的 Web 服务器和用户代理都会支持这个规范
-
default_type:
有时,需要用户下载文件而不是直接播放,而Nginx在默认配置下,会根据文件的后缀来匹配相应的MIME类型,并写入Response header,导致浏览器播放文件而不是下载,这时需要通过配置让Nginx返回的MIME类型为下面这个类型:
location /download/ { types { } default_type application/octet-stream; }
application/octet-stream;这个类型会让浏览器认为响应是普通的文件流,并提示用户下载文件
-
sendfile函数:
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:
- 第三方模块
- event 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