nginx媒体服务器搭建

1      媒体服务器搭建选型

1.1 媒体服务器选件列表

选项

型号/版本

获取方法

服务器系统

Windows 10

 

平台软件

nginx-http-flv-module

https://gitee.com/yaolonga/nginx-compile-env

推流软件

ffmpeg win64

https://github.com/BtbN/FFmpeg-Builds/releases

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官网地址如下:

https://nginx.org

官网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点配置:

  1. OpenSSL证书生成;
  2. 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自签名证书

  1. 创建密钥

openssl生成RSA私钥

openssl genrsa -des3 -out server.key 2048

注意:生成私钥,需要提供一个至少4位,最多1023位的密码。

  1. 生成CSR(证书签名请求)

openssl req -new -key server.key -out server.csr

说明:按照提示输入国家,地区,城市,组织,组织单位,Common Name和Email。其中Common Name,可以写自己的名字或者域名,如果要支持https,Common Name应该与域名保持一致,否则会引起浏览器警告。

  1. 删除密钥中的密码

openssl rsa -in server.key -out server.key

说明:如果不删除密码,在应用加载的时候会出现输入密码进行验证的情况,不方便自动化部署。

  1. 生成自签名证书

内部或者测试使用,只要忽略证书提醒就可以了。

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

  1. 生成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媒体服务器即可。

 

posted @ 2022-03-30 11:21  飞鱼厅  阅读(617)  评论(0编辑  收藏  举报