在别人的平台上直播,不觉得有点受制于人么?
那就来搭建一台属于自己的直播服务器吧~
写在前面
本文使用的环境为真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
yum -y install git
git clone https://github.com/nginx/nginx.git
git clone https://github.com/arut/nginx-rtmp-module.git
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
cd nginx
|
这一步建议返回图形界面操作:在刚刚的nginx目录(如果按照操作一步一步来,此时应该是/root/source/nginx)下新建一个叫做config.sh的文件,写入配置:
1 2 3 4 5 6 7 8 9 10
| ./auto/configure --prefix=/usr/local/nginx \ --with-pcre=../pcre-8.42 \ --with-openssl=../openssl-1.1.0 \ --with-zlib=../zlib-1.2.11 \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_flv_module \ --with-http_mp4_module \ --add-module=../nginx-rtmp-module/
|
保存文件,关闭,继续命令行:
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++均为最新版:
然后就可以编译了~
编译需要比较长的一段时间,这段时间里可以做一些自己想做的事情~(
编译完成后,你也许能看到这样的东西:
成功了?那就安装吧~
安装起来倒是很快,你也许能看到这样的东西:
安装完成!有必要的话,去修改相应的防火墙规则吧~
修改完成并保存后,试试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