3

手把手教你从安装CentOS7.4镜像开始,搭建IoT视频监控系统

 1 year ago
source link: https://blog.51cto.com/u_15214399/5804904
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

摘要:在CentOS7.4服务器版本的环境下安装nginx服务器、配置文件服务器、流媒体服务器。

本文分享自华为云社区《​ ​华为云ECS服务器安装CentOS7.4镜像,部署GINX服务器、搭建物联网视频监控系统​​》,作者:DS小龙哥。

在CentOS7.4服务器版本的环境下安装nginx服务器、配置文件服务器、流媒体服务器。 (1)配置NGINX为HTTP服务器,安装rtmp模块,完成rtmp视频推流,支持缓存视频到本地目录、支持转为HLS流,通过浏览器访问直播流。 (2)部署开机自动启动程序:方便设置自己的程序为开机启动。

一、环境介绍

环境介绍: 采用的是华为云的ECS弹性云服务器–镜像安装的CentOS7.4 64位 -----是服务器版,非桌面版哦。
在CentOS7.4服务器版本的环境下安装nginx服务器、配置文件服务器、流媒体服务器。

(1)配置NGINX为HTTP服务器,安装rtmp模块,完成rtmp视频推流,支持缓存视频到本地目录、支持转为HLS流,通过浏览器访问直播流。
(2)部署开机自动启动程序:方便设置自己的程序为开机启动。

二、Centos中安装带rtmp模块的Nginx

2.1 新安装的系统可以先安装一些工具

yum install -y pcre pcre-devel openssl openssl-devel zlib zlib-devel gcc gcc-c++
yum install -y vim wget lsof git zip unzip

2.2 获取Nginx二进制源码

听说srtmp模块暂时只支持Nginx13-15版本,当前就在官网下载Nginx14

wget http://nginx.org/download/nginx-1.14.2.tar.gz
tar xvf nginx-1.14.2.tar.gz

2.3 获取nginx-rtmp-module

wget https://github.com/arut/nginx-rtmp-module/archive/refs/tags/v1.2.1.tar.gz
tar xvf v1.2.1.tar.gz

2.4 编译nginx

cd nginx-1.14.2
./configure --add-module=../nginx-rtmp-module-1.2.1/ --with-http_ssl_module
make && make install
#建立软链接
ln -s /usr/local/nginx/sbin/nginx /usr/bin

特别说明:

如果在配置时报错,一般就是缺东西了,安装了再配置。

比如:报错 ./configure: error: the HTTP rewrite module requires the PCRE library. You can either disable the mo ....
解决:
yum -y install pcre-devel
yum -y install openssl openssl-devel

2.5 修改Nginx的配置文件

打开/usr/local/nginx/conf/nginx.conf文件,在文件最后面加入下面的配置。
rtmp {
server {
listen 8888;
application live {
live on;
}
}
}

上面8888是rtmp推流和拉流的端口。

修改nginx.conf之后,重启nginx服务:

sudo service nginx restart

重启服务之后,使用netstat -ltn命令查看TCP监听的端口,确认下Nginx的监听端口是否正常。
正常情况,一个是我们自己设置的rtmp服务监听端口8888,还有一个80是Nginx默认的HTTP服务监听端口。
接下来可以在浏览器里输入本机IP地址:http://127.0.0.1/,查看Nginx服务开启状态。

2.6 设置开机启动

wget http://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx -O /etc/init.d/nginx
chmod +x /etc/init.d/nginx
update-rc.d nginx defaults

2.7 控制nginx服务的3个命令: 启动、停止、重启

service nginx start
service nginx stop
service nginx restart 或者 nginx -s reload (运行中生效配置文件)

2.8 进行rtmp推流

服务器搭建好之后,推流和拉流的地址就是: rtmp://<服务器IP地址>:8888/live/<推流存放的目录>
例如: rtmp://127.0.0.1:8888/live/xl

2.9 nginx保存推流视频文件

如果需要让推流上来的文件保存下来后续进行查看历史文件,可以配置nginx进行保存。

在原来的/usr/local/nginx/conf/nginx.conf配置文件里rtmp模块中增加新的配置:

record all;
record_unique on;
record_path "./video"; #视频缓存的路径
record_suffix -%Y-%m-%d-%H_%M_%S.flv;

完整/usr/local/nginx/conf/nginx.conf里的rtmp模块的配置如下:

#RTMP服务
rtmp {
server {
listen 8888;
application live {
live on; #开启实时
record all;
record_unique on;
record_path "./video"; #视频缓存的路径
record_suffix -%Y-%m-%d-%H_%M_%S.flv;
}
}
}

配置之后执行命令nginx -s reload重启服务器即可。

2.10 rtmp直播流转为hls直播流

什么是HLS直播流?

HLS 全称是 HTTP Live Streaming,是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议,用于实时音视频流的传输。目前HLS协议被广泛的应用于视频点播和直播领域。原理介绍
HLS 跟 DASH 协议的原理非常类似。通过将整条流切割成一个小的可以通过 HTTP 下载的媒体文件,然后提供一个配套的媒体列表文件,提供给客户端,让客户端顺序地拉取这些媒体文件播放,来实现看上去是在播放一条流的效果。由于传输层协议只需要标准的 HTTP 协议,HLS 可以方便的透过防火墙或者代理服务器,而且可以很方便的利用 CDN 进行分发加速,并且客户端实现起来也很方便。
HLS 把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。HLS 协议由三部分组成:HTTP、M3U8、TS。这三部分中,HTTP 是传输协议,M3U8 是索引文件,TS 是音视频的媒体信息。

HLS协议编码格式要求:

视频的编码格式:H264
音频的编码格式:AAC、MP3、AC-3
视频的封装格式:ts
保存 ts 索引的 m3u8 文件

配置/usr/local/nginx/conf/nginx.conf将RTMP流转为HLS流。

在http模块的server配置里增加新的配置:

location /live_hls{
types {
#m3u8 type设置
application/vnd.apple.mpegurl m3u8;
#ts分片文件设置
video/mp2t ts;
}
#指向访问m3u8文件目录
alias ./m3u8File; #和rtmp模块里的hls_path设置路径一样
add_header Cache-Control no-cache; #禁止缓存
}

在rtmp模块的server配置里增加新的配置:

hls on; #开启hls
hls_path ./m3u8File; #hls的ts切片存放路径 (这是个目录,会自动创建的)
hls_fragment 2s; #本地切片长度
hls_playlist_length 6s;#HLS播放列表长度

/usr/local/nginx/conf/nginx.conf文件的完整的配置如下:

worker_processes 1; #Nginx进程数,建议设置为等于CPU总核数
events {
worker_connections 1024; #工作模式与连接数上限
}
rtmp_auto_push on;
#RTMP服务
rtmp {
server {
listen 8888;
application live {
live on; #开启实时
record all;
record_unique on;
record_path "./video"; #视频缓存的路径
record_suffix -%Y-%m-%d-%H_%M_%S.flv;

hls on; #开启hls
hls_path ./m3u8File; #hls的ts切片存放路径
hls_fragment 2s; #本地切片长度
hls_playlist_length 6s;#HLS播放列表长度
}
}
}
#HTTP服务
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8099;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /live_hls{
types{
#m3u8 type设置
application/vnd.apple.mpegurl m3u8;
#ts分片文件设置
video/mp2t ts;
}
#指向访问m3u8文件目录
alias ./m3u8File;
add_header Cache-Control no-cache; #禁止缓存
}
location /control{
rtmp_control all;
}

location /stat{
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl{
root ./nginx-rtmp-module-master;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

配置之后重启服务器即可。

按照前面的配置,RTMP推流地址和HTTP访问地址如下:

RTMP推流和拉流地址: rtmp://127.0.0.1:8888/live/video01
那么对应的HTTP的访问地址:http://127.0.0.1:8099/live_hls/video01.m3u8

说明: 转为HLS流之后,如果浏览器支持HLS流就可以直接输入地址播放。一般手机浏览器都支持的。比如:苹果手机的自带浏览器,QQ浏览器等浏览器都支持直接播放HLS流。PC机的谷歌浏览器默认是不支持的。

2.11 NGINX配置HTTP文件服务器

在5.8小节里介绍了如何配置NGINX保留RTMP推流的视频文件,如果想做一个直播回放,历史记录查看的播放器,那么就可以将rtmp视频缓存的目录作为HTTP文件服务器访问的根目录,通过访问这个根目录获取目录下文件的索引,得到视频文件的访问地址就可以直接进行播放,就能做一个视频回放播放器。

在http模块里新增加一个server配置,并填入新的配置,详细内容如下:

server {
listen 8090;
server_name localhost;
location / {
root ./video; #指定哪个目录作为Http文件服务器的根目录,如果你这里写了file就是你的根目录,那么访问的时候file就不会出现在目录中
autoindex on; #设置允许列出整个目录
autoindex_exact_size off; #默认为on,显示出文件的确切大小,单位是bytes。改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
autoindex_localtime on; #默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间
charset utf-8; #防止文件乱码显示, 如果用utf-8还是乱码,就改成gbk试试
}
}

特别说明: nginx是支持配置多个server配置,监听不同的端口,可以给文件服务器单独设置一个监听端口,专门作为文件遍历使用。

/usr/local/nginx/conf/nginx.conf文件的完整的配置如下:

worker_processes 1; #Nginx进程数,建议设置为等于CPU总核数
events {
worker_connections 1024; #工作模式与连接数上限
}
rtmp_auto_push on;
#RTMP服务
rtmp {
server {
listen 8888;
application live {
live on; #开启实时
record all;
record_unique on;
record_path "./video"; #视频缓存的路径
record_suffix -%Y-%m-%d-%H_%M_%S.flv;

hls on; #开启hls
hls_path ./m3u8File; #hls的ts切片存放路径
hls_fragment 2s; #本地切片长度
hls_playlist_length 6s;#HLS播放列表长度
}
}
}
#HTTP服务
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8090;
server_name localhost;
location / {
root ./video; #指定哪个目录作为Http文件服务器的根目录,如果你这里写了file就是你的根目录,那么访问的时候file就不会出现在目录中
autoindex on; #设置允许列出整个目录
autoindex_exact_size off; #默认为on,显示出文件的确切大小,单位是bytes。改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
autoindex_localtime on; #默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间
charset utf-8; #防止文件乱码显示, 如果用utf-8还是乱码,就改成gbk试试
}
}

server {
listen 8099;
server_name localhost;
location / {
root html;
index index.html index.htm;
}

location /live_hls{
types{
#m3u8 type设置
application/vnd.apple.mpegurl m3u8;
#ts分片文件设置
video/mp2t ts;
}
#指向访问m3u8文件目录
alias ./m3u8File;
add_header Cache-Control no-cache; #禁止缓存
}
location /control{
rtmp_control all;
}

location /stat{
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl{
root ./nginx-rtmp-module-master;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

访问文件测试: ​ http://127.0.0.1:8090 ​​​

三、Linux下开机启动的执行流程

3.1 开机执行脚本顺序

第一步:init /etc/inittab
第二步:启动相应的脚本,并且打开终端
rc.sysinit
rc.d(里面的脚本)
rc.local
第三步:启动login登录界面 login
第四步:在用户登录的时候执行sh脚本的顺序,每次登录的时候都会完全执行的
/etc/profile.d/file
/etc/profile
/etc/bashrc
/root/.bashrc
/root/.bash_profile

3.2 Linux中修改环境变量及生效方法

修改/etc/profile 或者 /etc/bashrc 可以让环境变量全部用户全局生效(需要重启系统)。
修改~/.bash_profile 或~/.bashrc对当前用户全局有效(需要重启系统)。

如果需要立即生效,修改完之后用source命令执行,如:
source .bash_profile

3.3 rcX.d的启动级别

一般有开机自启动的需求时,一般会在/etc/rc.local文件中写命令行或脚本执行命令的方式来实现。也可以在/etc/profile文件里实现(不建议)。

现在很多Linux发行版,默认是没有/etc/rc.local这个文件或者没有去执行,而使用的是/etc/rcX.d。

rcX.d并不是指这个目录或者文件就是叫rcX.d,这其中的X对应是0~6这7个数字,不同的数字对应着不同的级别

查看当前系统/etc/rcX.d目录:

[root@ecs-c687-ecrs work]# ls /etc/ | grep rc
bashrc
csh.cshrc
inputrc
mail.rc
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.d
rc.local
vimrc
virc
wgetrc

通过runlevel命令查看当前系统的启动级别:

手把手教你从安装CentOS7.4镜像开始,搭建IoT视频监控系统_CentOS7.4镜像

我当前使用的是CentOS7.4服务器版本,启动级别如下:

[root@ecs-c687-ecrs ]# runlevel
N 3

查看/etc/rc3.d/目录下文件的详细信息:

[root@ecs-c687-ecrs ~]# ls /etc/rc3.d/ -l
total 0
lrwxrwxrwx. 1 root root 20 Feb 14 2022 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Feb 14 2022 K90network -> ../init.d/network
lrwxrwxrwx 1 root root 19 Sep 15 22:07 S12hostguard -> ../init.d/hostguard
lrwxrwxrwx 1 root root 24 Feb 14 2022 S50multi-queue-hw -> ../init.d/multi-queue-hw

可以看到该目录下的文件都是链接文件,而且都是指向/etc/init.d中的shell脚本或者其他可执行文件,它们的命名方式基本都是以S或者K开头,其后紧跟一个数字,数字后则是链接文件的名字,这个名字可以自行定义。

命名规则解释如下:

以K90network为例:
K表示stop,S表示start。(表示需要传入参数),也就是说开机自启动命令会向脚本传入start或者stop,在脚本里可以收到参数$1进行一些判断,完成一些不同情况下的逻辑处理。比如:开机执行什么代码,关机执行什么代码。
90 表示脚本执行等级。(通常越小越优先)
network与/etc/init.d下的脚本文件名称保持一致。

3.4 利用rcX.d实现开机自动执行脚本

比如:需求是开机之后创建一个文件,并向文件里存放一些数据。

(1)先在/etc/init.d目录下创建一个up_demo.sh脚本,编写脚本代码:

#!/bin/bash
echo $0 $1 >> /home/up_test.txt

修改脚本权限:

[root@ecs-c687-ecrs init.d]# chmod 777 /etc/init.d/up_demo.sh
[root@ecs-c687-ecrs init.d]# ls up_demo.sh -l
-rwxrwxrwx 1 root root 76 Sep 16 14:13 up_demo.sh

(2) 在/etc/rc3.d目录里,创建软连接。 (因为我的系统启动级别为3)

[root@ecs-c687-ecrs rc3.d]# ln -s /etc/init.d/up_demo.sh S10up_demo
[root@ecs-c687-ecrs rc3.d]# ls -l
total 0
lrwxrwxrwx. 1 root root 20 Feb 14 2022 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Feb 14 2022 K90network -> ../init.d/network
lrwxrwxrwx 1 root root 22 Sep 16 14:17 S10up_demo -> /etc/init.d/up_demo.sh
lrwxrwxrwx 1 root root 19 Sep 15 22:07 S12hostguard -> ../init.d/hostguard
lrwxrwxrwx 1 root root 24 Feb 14 2022 S50multi-queue-hw -> ../init.d/multi-queue-hw

(3)重启系统,进入到/home目录下查看文件内容,可以看到开机启动成功,内容已经写到up_test.txt文件里了。

Welcome to Huawei Cloud Service
[root@ecs-c687-ecrs ~]# cd /home/
[root@ecs-c687-ecrs home]# ls
lib_run.sh up_test.txt video work work_pc work.tar.gz
[root@ecs-c687-ecrs home]# cat up_test.txt
/etc/rc.d/init.d/up_demo.sh start
[root@ecs-c687-ecrs home]#

 ​点击关注,第一时间了解华为云新鲜技术~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK