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

  1. 1. 写在前面
  2. 2. 准备工作
    1. 2.1. 服务器需求
    2. 2.2. 客户端需求
  3. 3. 正式开始
    1. 3.1. 安装环境
      1. 3.1.1. 配置环境
  4. 4. Fin
  5. 5. About
    1. 5.1. References
    2. 5.2. Mentioned Projects

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

写在前面

本文使用的环境为真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
10
./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
28
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
<!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

Mentioned Projects