手把手教你搭建视频去重系统

Posted Zilliz Planet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手把手教你搭建视频去重系统相关的知识,希望对你有一定的参考价值。

#01

背景

如今,短视频平台对各类搬运视频的检测力度和精确度越来越高了。无论是影视号的剪辑,还是从油管搬运,即使做了各类复杂的视频变换,都很容易被检测出来。作者都会收到提醒,严重的甚至被封号。

乔布斯演讲原始视频

搬运的视频,加了字幕遮盖

常见的视频变换手段包括时间和画面上的改变:

  • 时间: 倒放,循环,混剪,加速,减速等

  • 画面: 裁剪,翻转,缩放,分辨率,马赛克,色度,对比度,模糊,噪点,画面复制,文字或图案叠加,修改背景,二次盗拍,画中画,deepfake等

面对如此多种类的视频变换,平台是如何检测出来的?魔高一尺,道高一丈。针对各类层出不穷的作弊手段,现在平台的检测算法已经相对成熟。很难有搬运作弊视频逃脱检测。

本文将从技术角度分析揭开这背后的技术和算法,并手把手教你搭建一个同款的检测系统。

我们知道,现代 AI 神经网络模型可以对图像、视频等数据提取特征,也叫 embedding,每个图像或视频可以提取出一个独一无二的 embedding。对视频本身的重复检测也就是对提取出的 embedding 进行相似度分析。

首先我们了解两个概念,即不同粒度的视频的重复检测:视频粒度的检测和片段粒度的检测。

  • 视频粒度检测是一种针对整个视频时长内拥有大量重复的情况的方法。 它通过比较两个完整视频的向量之间的相似性来找到重复的视频。 由于每个视频只会被一个向量表示,这种方法通常速度更快、效率得更高。 然而这种方法的局限性也很明显:无法适应部分片段重复的情况,尤其不利于检测长视频中小片段的重复。 例如,视频 A 和视频 B 的前 1/4 时长完全相同,后 3/4 时长完全不同,但它们的视频向量可能并不相似。 在这种情况下,视频粒度检测显然无法识别到侵权内容。

  • 片段粒度检测能够找到重复片段的开始和结束时间,可以处理视频片段的复杂剪辑、插入片段、或视频长度不同等情况。 它的核心技术在于比较视频帧之间的相似性。显然,这种方法能够做到更加精确的查重效果,但要求更多的时间和资源。

在上一篇文章中,我们已经演示了如何构建一个简单的视频粒度视频去重系统。 在下面的例子中,我们将实现片段粒度的视频重复检测。这种细粒度的片段检测会更加精确,并带来更高的召回,比较符合实际业务需求。

我们会使用 TowheeMilvus 搭建片段粒度的视频查重系统:Towhee 是一个能对非结构化数据一键提取 embedding 的工具;Milvus 是业内领先的向量数据库,可用于向量存储和检索。

本文中使用的方法可以将核心功能简化为几行代码,方便大家动手复现和学习。

#02

准备工作

1、安装依赖

在 python3 环境下,安装这些依赖:

! python -m pip install -q pymilvus towhee pillow ipython numpy plyvel

2、准备数据

我们使用的视频均来自 VCSL 数据集。VCSL 包括了大量来自 Youtube 和 Bilibili 的真实视频,主要用于视频重复检测。

该数据集的重复视频包含了多种复杂的变换手段,包括画面裁剪、过滤、文字覆盖、添加背景、盗拍、画中画等,在超过 28 万条片段重复中有大范围的内容变换。这些贴近现实的巧妙转换给片段级的视频重复检测带来了巨大的挑战。

作为示例,我们仅使用来自 VCSL 的 5 组视频,每组包含了对同一视频的 3 种不同搬运拷贝。 文件夹 crashed_video 中还有一个损坏的视频,用于稳健性测试。

通过下面的命令下载示例数据:

! curl -L https://github.com/towhee-io/examples/releases/download/data/VCSL-demo.zip -O
! unzip -q -o VCSL-demo.zip

我们简单地观察其中一组视频:它们分别对电影《夏洛特烦恼》中的经典片段进行了三种不同方式的搬运拷贝,比如加字幕和变换分辨率。

madongmei
    ├── 0640bd5d43d1499c962e275be6b804ef-大爷,马冬梅家住这吗?-1e64y1y799.flv
    ├── 8ad81fc9fe0a47dbaab1b4cdc40bf07b-行了,大爷你一边凉快去吧,神曲《马冬梅》-1t54y117JK.flv
    └── ad244c924f31461a9d809c77ae251ac1-夏洛特烦恼沈腾和大爷的经典对话,马什么梅,马冬什么,什么冬梅-1y7411n7y1.flv

  

3、创建集合

在正式搭建系统之前,我们需要准备一个 Milvus 集合。通过下面的方式可以快速安装并启动 Milvus 服务,更多细节和设置可参考 Milvus doc

# Download docker yaml for Milvus standalone
! wget https://github.com/milvus-io/milvus/releases/download/v2.1.1/milvus-standalone-docker-compose.yml -O docker-compose.yml
# Run command below under the same directory as the docker yaml
! docker-compose up -d

创建一个名为video_deduplication的集合,使用L2 distance metricIVF_FLAT index

from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility

connections.connect(host='127.0.0.1', port='19530')

def create_milvus_collection(collection_name, dim):
    if utility.has_collection(collection_name):
        utility.drop_collection(collection_name)
    
    fields = [
        FieldSchema(name='id', dtype=DataType.INT64, descrition='id of the embedding', is_primary=True, auto_id=True),
        FieldSchema(name='path', dtype=DataType.VARCHAR,  descrition='path of the embedding',max_length=500),
        FieldSchema(name='embedding', dtype=DataType.FLOAT_VECTOR, descrition='video embedding vectors', dim=dim)
    ]
    schema = CollectionSchema(fields=fields, description='video dedup')
    collection = Collection(name=collection_name, schema=schema)

    index_params = 
        'metric_type':'L2',
        'index_type':"IVF_FLAT",
        'params':"nlist":1
    
    collection.create_index(field_name="embedding", index_params=index_params)
    return collection

collection = create_milvus_collection('video_deduplication', 256)

#03

重复视频检测

接下来,我们将展示如何使用 Milvus 和 Towhee 构建我们的细粒度视频去重系统。该系统的核心思想是使用 Towhee 提供的 Image Embedding 算子提取视频帧向量,并将其存储在事先准备好的 Milvus 集合中,然后通过比较视频帧向量之间的相似度找到重复片段。

1、入库流程

对于每个视频,我们将其解码为图像帧,然后使用预训练好的神经网络将它们转换成向量。 这些向量会被插入到 Milvus 集合和 levelDB 中进行存储。

import towhee
import numpy as np
from towhee.types import Image

os.environ["CUDA_VISIBLE_DEVICES"] = '1'

@towhee.register
def get_image(x):
   for i in x:
      yield Image(i.__array__(), 'RGB')

@towhee.register
def merge_ndarray(x):
   return np.concatenate(x).reshape(-1, x[0].shape[0])

all_file_pattern = os.path.join(vcsl_demo_root, '*', '*.*')

dc = (
   towhee.glob['video_url'](all_file_pattern).stream()
      .video_decode.ffmpeg['video_url', 'frames'](sample_type='time_step_sample', args='time_step': 1)
      .get_image['frames', 'images']()
      .flatten('images')
      .drop_empty()
      .image_embedding.isc['images', 'embeddings']()
      .select['video_url', 'embeddings']()
      .ann_insert.milvus[('video_url', 'embeddings'), 'insert_result'](uri='tcp://localhost:19530/video_deduplication')
      .group_by('video_url')
      .merge_ndarray['embeddings', 'video_embedding']()
      .insert_leveldb[('video_url', 'video_embedding'), ]('url_vec.db')
      .select['video_url', 'video_embedding']()
      .show(limit=20)
)

视频帧向量提取结果展示

我们可以看到每个视频都被转成了为 n(默认 n 为时长秒数)条 256 维的向量。如果运行中出现报错“ERROR: header damaged”,那意味着样本数据集有损坏的视频。在 Towhee 搭建的流水线中,批量操作会自动跳过某个数据导致的错误,继续运行直至所有数据处理完毕。这是为了模拟在实践中,在处理庞大的视频数据时不会被少量的损坏视频影响进度。

2、检测流程

理论上,对于每一个查询视频,都需要匹配和检索数据库中的所有视频,然而这会导致巨大的开销。 在本例中,我们选择首先根据视频帧向量进行一遍粗筛,简单过滤掉完全不相关的视频。

  • 粗筛:对于每个查询帧,我们通过 Milvus 向量检索找到一定数量的相似帧,并匹配到对应的视频。 然后对这些视频进行聚合、排序和过滤。这一步骤对应了上面检测流程图中,select video 选出 video A 和 video B 的过程。

然后,我们比较粗筛结果中的视频和查询视频的视频帧向量,使用 Temporal Network 对齐算法,定位重复的片段。

query_file_pattern = os.path.join(vcsl_demo_root, 'madongmei', '*.*')

@towhee.register
def split_res(x):
   return [i.path for i in x], [i.score for i in x]

dc = (
   towhee.glob['query_url'](query_file_pattern).stream()
      .video_decode.ffmpeg['query_url', 'frames'](sample_type='time_step_sample', args='time_step': 1)
      .get_image['frames', 'images']()
      .flatten('images')
      .drop_empty()
      .image_embedding.isc['images', 'embeddings']()
      .select['query_url', 'embeddings']()
      .ann_search.milvus['embeddings', 'results'](collection=collection, limit=64, output_fields=['path'], metric_type='IP')
      .split_res['results', ('retrieved_urls','scores')]()
      .group_by('query_url')
      .video_copy_detection.select_video[('retrieved_urls','scores'), 'ref_url'](top_k=5, reduce_function='sum', reverse=True)
      .from_leveldb['ref_url', 'retrieved_embedding']('url_vec.db', True)
      .merge_ndarray['embeddings', 'video_embedding']()
      .flatten('retrieved_embedding', 'ref_url')
      .video_copy_detection.temporal_network[('video_embedding', 'retrieved_embedding'), ('predict_segments', 'segment_scores')]()
      .select['query_url',  'ref_url', 'predict_segments', 'segment_scores']()
      .show(limit=50)
)

视频查重流程返回结果

我们这里使用同样的数据集进行查询,共 5 组视频,每组包含的 3 个视频是彼此的搬运副本(重复视频)。针对这个数据集查询,我们期望的正确查询结果应该是找到查询对象本身与它同组的两个副本视频。

另外,我们解读一下 Temporal Network 算子输出的结果:predict_segments 列展示了重复片段的具体时间[query_start_second, ref_start_second, query_end_second, ref_end_second]segment_scores列则表示了每个重复片段对应的相似度分数。我们可以观察到每个查询视频确实只检测到其自身事件的 3 个结果,这与我们预期的结果(ground truth)是一致的。

以第7行的结果为例,predict_segments = [141, 1, 164, 25],表示在 query video 的第 141 到 164 秒与 ref video 的第 1 到 25 秒重复。

#04

总结

对于常见的视频搬运查重,这一套方案就足已解决,当然具体的场景或许还需要调整一些参数。如果面对比较特殊的场景(比如声音抄袭)或者对速度性能要求更高的话,我们仍需要采用其他方法优化工程方案。

想要获取更多向量化的模型和方法,请参考 Towhee

如需处理更大规模向量数据,可以选择配置 Milvus

Jupyter Notebook 教程:https://github.com/towhee-io/examples/blob/main/video/video_deduplication/segment_level/video_deduplication_at_segment_level.ipynb

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

摘要:在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视频监控系统_nginx

我当前使用的是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]#


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

以上是关于手把手教你搭建视频去重系统的主要内容,如果未能解决你的问题,请参考以下文章

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

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

手把手教你搭建Mysql8.0.22 MGR高可用集群

手把手教你搭建 Spring 源码分析环境(昨天视频笔记)

编码标记物智能识别系统(YOLO v5+Opencv实现)

手把手教你用Python实践深度学习|深度学习视频教程