nginx媒体服务器搭建
1 媒体服务器搭建选型
1.1 媒体服务器选件列表
选项 |
型号/版本 |
获取方法 |
服务器系统 |
Windows 10 |
|
平台软件 |
nginx-http-flv-module |
|
推流软件 |
ffmpeg win64 |
|
Openssl |
Win64OpenSSL-3_0_2.exe |
http://slproweb.com/download/Win64OpenSSL-3_0_2.exe |
Vc插件 |
vcredist_x64.exe |
https://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x64.exe |
JDK |
jdk-8u272-windows-x64.msi |
官网获取 |
解压软件 |
7z2107-x64.exe |
https://d3.7-zip.org/a/7z2107-x64.exe |
1.2 nginx媒体服务器需求
在当前项目中需要搭建一台媒体服务器,提供HD/VR视频流量拉取。基本组网如下图所示:
搭建媒体服务器常用的方式是nginx。如何选择和使用nginx搭建媒体服务器,就是接下来本文要写的。
1.3 平台搭建选型
1.3.1 nginx模块选择
nginx是开源代码,可以按照需求加入不同的模块,编译成所需的模块进行使用。当前常用的nginx模块包括:nginx-rtmp-module、nginx-http-flv-module等。
这些定制化的模块都是以nginx源码为基础,根据不同场景的需求生成的。我们内网搭建的nginx媒体服务器需要支持http和https拉流,而nginx-rtmp-module是不支持http拉流的。所以,我们选择nginx-http-flv-module来搭建媒体服务器。
1.3.2 nginx获取
由于我们要获取nginx-http-flv-module搭建媒体服务器,而这个包是有人已经做出来并发布的。我们可以直接在网上搜索获取编译完成的成品包。如,gitee上可以下载完整的一套源码加测试工具:
https://gitee.com/yaolonga/nginx-compile-env
如果有定制需求的,也可以在nginx官网下载源码包。nginx官网地址如下:
官网nginx是使用C语言编写的,在不同的平台下合入定制模块,需要使用集成C语言的IDE,编译成品包。Windows平台可以下载Visual Studio,linux下使用gcc即可。
1.3.3 nginx服务器选择
nginx服务器要考虑服务器对流量的转发能力。如果有服务器就选服务器,没有的话可以选PC机。只验功能的话,就没有要求了。
nginx服务器系统既可选择linux系统,也可选择windows系统。我们选用Windows原因是可视化使用起来比较方便。而windows系统中,我们根据我们拥有的系统进行选择即可。但不建议使用Windows Server 2012 R2,因为这个版本安装之后,会有很多应用安装不了,需要打补丁解决。我们因为没有找到Windows Server 2016,就选择了Windows 10系统。
1.4 推流软件选择
1.4.1 OBS推流软件(可选)
OBS需要下载26.1.1及以上版本的,配合插件才能支持推送多路流插件。否则,OBS只能支持1路推流。
OBS官网下载地址:
https://obsproject.com/zh-cn/download
OBS多路流支持插件下载地址:
https://github.com/sorayuki/obs-multi-rtmp/releases
1.4.2 ffmpeg推流
因为ffmpeg是一个使用非常多且开源的推流测试软件,针对不同平台有不同的移植版本,我们建议使用ffmpeg模拟视频流量推流。
ffmpeg下载地址:
http://www.ffmpeg.org/download.html
自动编译版本可以在以下网址获取:
https://github.com/BtbN/FFmpeg-Builds/releases
1.5 Linux系统实现可行性
这套设备和软件都有linux版本,完全可以使用linux版本实现。
2 nginx平台搭建
物理机借用和系统安装和项目没有关系,本文档略去不写。
将1.1列表中的所需软件下载完成后,传输到服务器上。
2.1 nginx模块配置
2.1.1 nginx应用解压
由于nginx模块我们下载的是编译完成包,所以可以直接解压使用。
该模块默认已经的配置文件中已经配置了rtmp和http两个配置,支持rtmp发流,rtmp和http拉流。
2.1.2 nginx配置文件修改
nginx的配置文件,位置在nginx安装目录下的conf文件夹下。文件名是nginx.conf。
鉴于安全考虑,初始的nginx配置文件中服务端口最好修改一下。
rtmp监听端口配置不需要修改,使用默认的1935即可;http端口默认是80,建议修改为8080,https端口默认是443,建议修改为8443。
2.1.3 nginx的https功能添加
nginx启用https功能需要做2点配置:
- OpenSSL证书生成;
- nginx配置文件中添加https服务配置。
2.1.3.1 OpenSSL证书生成
2.1.3.1.1 相关软件安装
OpenSSL生成证书前需要将媒体服务器选件列表中的后5个软件安装起来。
7zip用来解压缩安装包;JDK和VC插件是部署环境的必要条件;NIC-82599-SPF330网卡驱动用来识别服务器的Inter82599网卡;OpenSSL用来生成证书文件。
先安装7zip,便于后续安装包的解压。所有软件安装时没有特殊选项,连续点击下一步只到安装完成。也可以按照习惯修改安装路径。最终的目的是使OpenSSL软件工作正常。
2.1.3.1.2 SSL证书生成
到OpenSSL安装目录下,找到start.bat。双击打开OpenSSL的DoS命令框,在里面进行生成证书操作。
在下方第2步生成CSR证书后,可以将证书发送给证书颁发机构(CA),CA验证过请求者的身份之后,会出具签名证书,需要花钱。另外,如果只是内部或者测试需求,也可以使用OpenSSL实现自签名。
*************************************************************************************************************************************************************************************************************************************************
创建SSL自签名证书
- 创建密钥
openssl生成RSA私钥
openssl genrsa -des3 -out server.key 2048
注意:生成私钥,需要提供一个至少4位,最多1023位的密码。
- 生成CSR(证书签名请求)
openssl req -new -key server.key -out server.csr
说明:按照提示输入国家,地区,城市,组织,组织单位,Common Name和Email。其中Common Name,可以写自己的名字或者域名,如果要支持https,Common Name应该与域名保持一致,否则会引起浏览器警告。
- 删除密钥中的密码
openssl rsa -in server.key -out server.key
说明:如果不删除密码,在应用加载的时候会出现输入密码进行验证的情况,不方便自动化部署。
- 生成自签名证书
内部或者测试使用,只要忽略证书提醒就可以了。
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
- 生成pem格式的公钥
有些服务,需要有pem格式的证书才能正常加载,可以用下面的命令:
openssl x509 -in server.crt -out server.pem -outform PEM
*************************************************************************************************************************************************************************************************************************************************
2.1.3.1.3 生成证书文件说明及服务器证书安装管理
我们使用OpenSSL生成自签名证书,总共生成证书文件有4个:
其中,nginx中https服务指定使用证书有2个:server.key,server.pem。
server.csr是原始的证书签名请求,server.crt用来在媒体服务器上进行证书安装。双击server.csr,打开证书界面。点击安装证书,将证书导入到服务器。
点击“下一页”,将证书存放到“受信任的根证书颁发机构”。
如果证书导入后,想要删除该条证书,可以使用certmgr.msc命令,进入证书管理界面。将自己安装的证书删除。
2.1.3.1.4 nginx证书文件安放及https配置
将生成的server.key和server.pem放置到nginx的conf文件夹下。
修改nginx.conf配置文件,添加https相关配置。
2.1.3.1.5 nginx.conf中频道配置
nginx.conf中一共配置了3个频道:live、hls、dash。分别用来做直播频道、hls频道、dash频道。可以按照不同的要求,使用不同的频道。
全部配置文件见附录。
以上软件安装完成,配置完成之后,双击nginx.exe应用程序,即可启动nginx服务。
2.2 ffmpeg安装及使用
2.2.1 ffmpeg免安装使用
由于ffmpeg模块我们下载的是编译完成包,所以可以直接解压使用。
2.2.2 ffmpeg模拟推流命令使用
ffmpeg推流需要模拟HD/VR两种流量推流,但其支持的格式都是rtmp,只不过模拟片源不同。HD使用2D片源,VR使用360片源。HLS流量模拟片源属于2D片源,推流时频道我们规划到hls频道。
ffmpeg要将流量推到媒体服务器上,其地址如下:
HD推流地址:
rtmp://MediaIP:1935/live/bjhd
VR推流地址:
rtmp://MediaIP:1935/live/bjvr
HLS推流地址:
rtmp://MediaIP:1935/hls/bjhls
HD/VR模拟推流命令可以使用:
ffmpeg -re -stream_loop -1 -i Media.mp4 -c copy -f flv rtmp:// MediaIP:1935/live/stream
HLS模拟推流命令可以使用:
fmpeg -re -stream_loop -1 -i index.m3u8 -vcodec libx264 -vprofile baseline -acodec aacline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp:// MediaIP:1935/hls/bjhls
播放器拉流地址:
rtmp拉流地址(本次rtmp设置MediaNatPort=1935):
rtmp://MediaNatIP:MediaNatPort/live/stream
http拉流地址(本次http设置MediaNatPort=8080):
http:// MediaNatIP:MediaNatPort /live?port=1935&app=live&stream=stream
https拉流地址(本次http设置MediaNatPort=8443):
https:// MediaNatIP:MediaNatPort /live?port=1935&app=live&stream=stream
2.3 实际直播流量推流
实际直播流量使用时,HD/VR流量需要实际摄像头发送流量。
HD流量发送,只需要使用手机下载一个手机推流软件即可。经过排查,阿里发布市场的杏林推流可以满足HD流量发送需求。只需要在URL中配置rtmp的推流地址,即可将流量推送到媒体服务器。
VR流量发送,需要一个VR相机。我们实验室有QooCam 8K的VR相机,该相机配合手机上安装的QooCam软件,也可以接入无线进行推流。也是只需要在手机软件上设备VR推流地址即可。
3. 附录
nginx.conf配置:
worker_processes 16;
events {
worker_connections 10240;
}
rtmp_auto_push on;
rtmp_auto_push_reconnect 1s;
rtmp_socket_dir tmp;
rtmp{
server{
listen 1935;
application live{
live on;
gop_cache on;
}
application hls{
live on;
hls on;
hls_path html/hls;
hls_fragment 3;
hls_playlist_length 20;
}
application dash{
live on;
dash on;
dash_path html/dash;
dash_fragment 10s;
}
}
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8080;
server_name localhost;
location / {
root html;
index index.html index.htm stream.mpd stream.m3u8;
}
location /live{
flv_live on;
chunked_transfer_encoding on;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
}
location /hls{
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root html/hls;
add_header Cache-Control no-cache;
}
location /dash {
types {
application/vnd.apple.mpegurl mpd;
video/mp2t mp4;
}
root html/dash;
add_header 'Cache-Control' 'no-cache';
}
location /stat {
#configuration of push & pull status
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root html;
}
location /control {
rtmp_control all; #configuration of control module of rtmp
}
#html/downloadFile/文件夹为发布下载服务器的地址,可以将发布的文件放到该目录提供下载URL
location ^~ /downloadFile/ {
root html;
if ($request_filename ~* ^.*?\.(html|doc|pdf|zip|docx|txt)$) {
add_header Content-Disposition 'p_w_upload';
add_header Content-Type: 'application/octet-stream';
}
sendfile on;
autoindex on; # 开启目录文件列表
autoindex_exact_size on; # 显示出文件的确切大小,单位是bytes
autoindex_localtime on; # 显示的文件时间为文件的服务器时间
charset utf-8,gbk; # 避免中文乱码
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# HTTPS server
server {
listen 8443 ssl;
server_name localhost;
ssl_certificate server.pem;
ssl_certificate_key server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
location /live {
flv_live on; #打开HTTP播放FLV直播流功能
chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复
add_header 'Access-Control-Allow-Origin' '*'; #添加额外的HTTP头
add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的HTTP头
}
location /hls{
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root html/hls;
add_header Cache-Control no-cache;
}
}
}
4. FAQ
4.1 Win2012服务器安装OpenSSL执行命令失败
问题现象:安装OpenSSL后不能使用,使用命令时报系统错误
问题原因:缺必要的应用程序组件,查找解决方法,需要安装vc_redist_x64.exe。安装vc_redist_x64.exe又报缺少api-ms-win-crt-stdio-l1-1-0.dll。说明服务器缺少大量的dll组件。
解决方法:在论坛上找到解决方法。需要将Win2012升级到SP1版本。
最终处理方法是重装成win10系统。因为win2012服务器折腾了不少时间,最终升级SP1补丁也失败了。也可以使用win2016 server系统。
3.2 nginx-rtmp模块配置http拉流不成功
问题现象:在nginx配置文件nginx.conf中配置http-flv后,使用VLC拉流失败
问题原因:我们使用的nginx-rtmp模块不支持http-flv。这个模块目前支持的拉流格式有:RTMP、HLS和DASH。
解决方法:使用nginx-http模块部署nginx媒体服务器即可。