写点什么

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

  • 2022-10-28
    中国香港
  • 本文字数:6776 字

    阅读完需:约 22 分钟

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

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


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


(1)配置 NGINX 为 HTTP 服务器,安装 rtmp 模块,完成 rtmp 视频推流,支持缓存视频到本地目录、支持转为 HLS 流,通过浏览器访问直播流。


(2)部署开机自动启动程序:方便设置自己的程序为开机启动。

1. 环境介绍


环境介绍: 采用的是华为云的 ECS 弹性云服务器–镜像安装的 CentOS7.4 64 位 -----是服务器版,非桌面版哦。


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


(1)配置 NGINX 为 HTTP 服务器,安装 rtmp 模块,完成 rtmp 视频推流,支持缓存视频到本地目录、支持转为 HLS 流,通过浏览器访问直播流。


(2)部署开机自动启动程序:方便设置自己的程序为开机启动。

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.gztar 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.gztar 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_modulemake && 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-develyum -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 startservice nginx stopservice 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;   #开启hlshls_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

3. 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 rcbashrccsh.cshrcinputrcmail.rcrc0.drc1.drc2.drc3.drc4.drc5.drc6.drc.drc.localvimrcvircwgetrc
复制代码


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



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


[root@ecs-c687-ecrs ]# runlevelN 3
复制代码


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


[root@ecs-c687-ecrs ~]# ls /etc/rc3.d/ -ltotal 0lrwxrwxrwx. 1 root root 20 Feb 14  2022 K50netconsole -> ../init.d/netconsolelrwxrwxrwx. 1 root root 17 Feb 14  2022 K90network -> ../init.d/networklrwxrwxrwx  1 root root 19 Sep 15 22:07 S12hostguard -> ../init.d/hostguardlrwxrwxrwx  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/bashecho $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 -ltotal 0lrwxrwxrwx. 1 root root 20 Feb 14  2022 K50netconsole -> ../init.d/netconsolelrwxrwxrwx. 1 root root 17 Feb 14  2022 K90network -> ../init.d/networklrwxrwxrwx  1 root root 22 Sep 16 14:17 S10up_demo -> /etc/init.d/up_demo.shlrwxrwxrwx  1 root root 19 Sep 15 22:07 S12hostguard -> ../init.d/hostguardlrwxrwxrwx  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]# lslib_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]#
复制代码


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


发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
手把手教你从安装CentOS7.4镜像,教你搭建IoT视频监控系统_后端_华为云开发者联盟_InfoQ写作社区