最近在做直播项目,查阅了一下相关资料然后成功搭建服务,在这里整理记录下实现过程以及踩过的坑。
首先,在搭建服务之前先了解下目前主流的几个直播协议:
1、RTMP:
实时消息传输协议,Real Time Messaging Protocol,是 Adobe Systems 公司为 Flash 播放器和服务器之间音频、视频和数据传输开发的开放协议。协议基于 TCP,是一个协议族,包括 RTMP 基本协议及 RTMPT/RTMPS/RTMPE 等多种变种。RTMP 是一种设计用来进行实时数据通信的网络协议,主要用来在 Flash/AIR 平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。这种方式的实时性比较强,基本能保证延迟在1-2s内,是现在国内直播主要采用的方式之一;不过使用这种协议,就必须安装flash,而H5、IOS、Android并不能原生支持flash,因此这种协议能流行多久,就不得而知了,毕竟移动端才是现在的主流。
2、HLS:
hls是Apple推出的直播协议,是通过视频流切片成文件片段来直播的。客户端首先会请求一个m3u8文件,里面会有不同码率的流,或者直接是ts文件列表,通过给出的ts文件地址去依次播放。在直播的时候,客户端会不断请求m3u8文件,检查ts列表是否有新的ts切片。这种方式的实时性较差,不过优势是H5、IOS、Android都原生支持。
3、HTTP-FLV:
HTTP-FLV就是对RTMP协议的封装,相比于RTMP,它是一个开放的协议。因此他具备了RTMP的实时性和RTMP不具备的开发性,而且随着flv.js出现(感谢B站),使得浏览器在不依赖flash的情况下,播放flv视频,从而兼容了移动端,所以现在很多直播平台,尤其是手机直播平台,都会选择它
nginx服务器配置:
新建目录:用于存放nginx以及nginx-rtmp-moudle模块
mkdir /usr/local/nginx
下载压缩包:进入到创建的nginx目录下下载,这里如果下载不成功可以把https改为http,之前一直可以下载,后面换了一台云服务器后https就下载不了了,不知道是不是被屏蔽的原因,换成http后解决了
cd /usr/local/nginx
wget http://nginx.org/download/nginx-1.12.2.tar.gz
wget https://codeload.github.com/arut/nginx-rtmp-module/zip/master
如果没有wget命令的话执行下面的命令安装
yum -y install wget
解压:
tar -zxvf nginx-1.12.2.tar.gz
unzip nginx-rtmp-module-master.zip
同理,没有unzip命令的执行下面命令安装
yum -y install unzip
安装nginx以及安装nginx模块之前,先安装一些依赖库:
yum -y install gcc-c++
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum -y install openssl openssl-devel
然后进行nginx-rtmp-module模块的安装:
cd /usr/local/nginx/nginx-1.12.2
#完成rtmp模块安装,=后面输入你的模块包的绝对路径
./configure --add-module=/usr/local/nginx/nginx-rtmp-module-master
make&make install
使用以下命令查看nginx是否启动成功:
cd /usr/local/nginx/sbin
./nginx -t
出现下图提示时表示配置成功
nginx以及相关模块安装完成
配置及启动服务支持hls
由于nginx-rtmp-module支持hls协议,因此我们可以直接在nginx.conf进行配置:
vi /usr/local/nginx/conf/nginx.conf
加入以下内容rtmp模块:(rtmp{}的内容和http{}为同级,位置不要放错)
rtmp {
server {
listen 1935; #监听的端口
chunk_size 4000;
application hls {
live on;
hls on;
hls_path /usr/local/html/hls;#视频流存放地址
hls_fragment 5s;
hls_playlist_length 15s;
hls_continuous on; #连续模式。
hls_cleanup on; #对多余的切片进行删除。
hls_nested on; #嵌套模式。
}
}
}
如下图所示
在http里添加一个直播流存放的地址:
location /hls { #添加视频流存放地址。
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
#访问权限开启,否则访问这个地址会报403
autoindex on;
alias /usr/local/html/hls;#视频流存放地址,与上面的hls_path相对应,这里root和alias的区别可自行百度
expires -1;
add_header Cache-Control no-cache;
#防止跨域问题
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}
如图:
设置好之后保存文件然后重启服务器:
cd /usr/local/nginx/sbin
./nginx -s reload
直播推流配置
推流指的就是直播端将视频流推到设定的服务器位置。这里我使用的是obs进行推流:
在设置->串流 中填写信息:URL为 rtmp://xxx:1935/hls,xxx为你的服务器的IP地址,hls是用来存放流媒体的,”对应的就是conf文件中设置的application名称,流名称可自定义,服务器端生成的m3u8文件就是以此命名的。设置完成之后,点击“开始推流”,推流端的设置就完成了。
观看直播就比较简单了,可以简单的使用h5的vedio标签就可以观看了。
可以访问http://xxx:80/hls/abcd.m3u8来观看直播,其中xxx为你的服务器IP地址,后面的abcd就是在推流时候使用的秘钥,是自定义的。或者使用
在此处遇到一个小坑,上述访问地址我是根据网上资料来写的,但是在我自己实际使用时发现服务器把推流时使用的密钥自动生成一个目录,然后把流文件存放到了里面,并不是直接生成abcd.m3u8,如下图
所以我使用的访问地址是http://xxx:80/hls/abcd/index.m3u8,然后就成功拉到直播流了。