搭建自己的RTMP+HLS直播服务器

在别人的平台上直播,不觉得有点受制于人么?
那就来搭建一台属于自己的直播服务器吧~

写在前面

本文使用的环境为真root权限下的CentOS 7.2 (IDC定制版),在其他环境下开发请别忘了适当调整部分代码哦~

准备工作

服务器需求

由于直播服务器有着极高的流处理要求,使用小带宽的服务器很可能导致频繁断流,进而带来极差的用户体验,因此,对于一般用户而言,国内机房是不做考虑的;咱选择了一台美西的公网带宽峰值500Mbps云服务器(虽然ping值比较高(平均200ms))

客户端需求

需要一台能上网的计算机,建议使用一些SSH&SFTP工具(除非想用VNC折腾Vim(手动滑稽))

正式开始

安装环境

本教程使用的网页&推流服务器为NGINX,配合RTMP直播推流模块达到预计的效果,因此第一步就是安装NGINX及附属模块。
为了保证程序的正常运行,推荐使用编译安装的方式处理(而不是直接运行封装好的二进制代码)

进入Shell命令行,依次输入以下不带#号的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#首先新建一个文件夹用于放置源码,美观而方便管理
mkdir source
#进入这个文件夹
cd source

#安装git,因为需要的源码许多都在Github上(加个-y的意思是所有的问题都选择Yes)
yum -y install git

#从GitHub的服务器上下载nginx的源码
git clone https://github.com/nginx/nginx.git
#从GitHub的服务器上下载rtmp模块的源码
git clone https://github.com/arut/nginx-rtmp-module.git

#准备依赖包(pcre、openSSL、zlib)虽说一般这些依赖包在服务器上都是默认安装的,
#但是为了防止寻找依赖包时候出现问题,建议还是按照如下代码下载依赖包:
#请注意包的版本号,这些版本只是截稿时的最新稳定版,您实际安装时候可能会有不一样的版本!
wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz
tar -zxvf pcre-8.42.tar.gz
wget https://www.openssl.org/source/openssl-1.1.0.tar.gz
tar -zxvf openssl-1.1.0.tar.gz
wget https://www.zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz

#然后进入nginx文件夹修改安装配置:
cd nginx

这一步建议返回图形界面操作:在刚刚的nginx目录(如果按照操作一步一步来,此时应该是/root/source/nginx)下新建一个叫做config.sh的文件,写入配置:

1
2
3
4
5
6
7
8
9
./auto/configure --prefix=/usr/local/nginx \  #nginx的目标安装目录
--with-pcre=../pcre-8.42 \ #pcre模块的位置
--with-openssl=../openssl-1.1.0 \ #openSSL模块的位置
--with-zlib=../zlib-1.2.11 \ #zlib模块的位置
--with-http_ssl_module \ #附带安装使用SSL证书加密HTTP连接的模块
--with-http_v2_module \ #附带安装HTTP2.0的模块
--with-http_flv_module \ #附带安装HTTP传输flv文件的模块
--with-http_mp4_module \ #附带安装HTTP传输mp4文件的模块
--add-module=../nginx-rtmp-module/ #安装RTMP模块

保存文件,关闭,继续命令行:

1
2
chmod 777 config.sh #提供权限,便于操作
./config.sh #测试配置脚本

如果你的输出结果看起来是这样,那么恭喜,可以下一步了:

如果提示缺少必要的模块(例如pcre、openSSL、zlib),可以检查下是否有写对配置文件中的目录

完成后,检查一下gcc编译器和c++库是否有正确安装(且为最新版):

1
2
yum -y install gcc
yum -y install gcc-c++

可以看到本服务器的gcc、c++均为最新版:

然后就可以编译了~

1
make

编译需要比较长的一段时间,这段时间里可以做一些自己想做的事情~(

编译完成后,你也许能看到这样的东西:

成功了?那就安装吧~

1
make install

安装起来倒是很快,你也许能看到这样的东西:

安装完成!有必要的话,去修改相应的防火墙规则吧~
修改完成并保存后,试试telnet 服务器地址 80,能通的话,说明nginx安装完成并启动啦~

环境安装完成了!接下来就是配置环境咯~

配置环境

主要要修改的是/usr/local/nginx/conf下的nginx.conf文件:
由于rtmp协议和http协议是同级别的,因此需要在nginx.conf文件顶端加入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
rtmp  {
server {
listen 1935; #这是RTMP协议默认端口
chunk_size 4096; #可能是每个数据包的大小?
application live { #名为live的项目
live on; #这是个直播项目
hls on; #开启HLS录制
wait_key on; #让视频流从一个关键帧开始
hls_path /home/live/web/hls; #HLS录制文件保存的目录
hls_fragment 5s; #HLS生成的每个ts文件的时长
hls_playlist_length 30s; #每个ts文件的保留时间
hls_continuous on; #让HLS标号从上一个结束的位置开始
hls_cleanup on; #自动清理过时的ts文件
hls_nested on; #为每一个HLS推流项目建立一个新的子目录
}
}
}

顺便把网页端也写了吧:
http配置部分,修改原有的or新增一条(这里以HTTPS加持的页面为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {
listen 443 ssl;
server_name 主机名;

ssl_certificate /home/live/cert/cert.pem;
ssl_certificate_key /home/live/cert/private.key;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
root /home/live/web;
index index.html index.htm;
}

location /live {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /home/live/web/hls;
add_header Cache-Control no-cache;
}
}

然后重启nginx:

1
/usr/local/nginx/sbin/nginx -s reload

别忘了修改防火墙哦~

此时,开启RTMP推流之后,应该就可以读取到https://主机名/hls/流名称/index.m3u8直播文件啦~

既然都搭建成这样啦,干脆把网页端播放器也准备好吧,这里贴出咱使用DPlayer快速搭建的示例代码(请不要吐槽没有格式的页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE HTML>
<head>
<meta charset="UTF-8">
<title>蓝冰记忆の直播间</title>
<link class="dplayer-css" rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/dplayer/dist/DPlayer.min.css">
<script src="https://cdn.jsdelivr.net/npm/hls.js/dist/hls.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dplayer/dist/DPlayer.min.js"></script>
<style>
body {
text-align: center;
}
</style>
</head>
<body>
<h1>冰喵直播间</h1>
<div id="dplayer"></div>
<script>
const dp = new DPlayer({
container: document.getElementById('dplayer'),
live: true,
video: {
url: 'hls/流名称/index.m3u8',
type: 'hls'
}
});
</script>
</body>

开启直播之后,是不是就能看到自己了呢~

Fin.


About

References