当前位置: 首页 > news >正文

wvp-GB28181-pro 2.0+ZLMediaKit 使用Dockerfile制作镜像以及部署【CentOS7】

说明

部署gb28181和zlm主要需要构建两个镜像,第一个为基础镜像,以centos7为基础构建新的基础镜像base.Dockerfile,第二个镜像为服务部署镜像server.Dockerfile,以第一个镜像base.Dockerfile构建出的镜像为基础镜像进行构建

整个基础镜像的构建全部手动编译安装需要的依赖工具

基础镜像版本:centos:centos7.9.2009
JDK版本:17
MAVEN版本:3.8.8
NodeJS版本:12.16.3
GIT版本:2.39.2

构建基础镜像 gb28181/basic:1.0

基础镜像主要安装一些部署ZLMediaKit和GB28181服务需要的依赖工具,主要安装了以下工具:
GB28181依赖:git、jdk17、maven 主要用于代码的拉取、编译以及运行
ZLMediaKit:yasm、cmake、ffmpeg 主要用于编译安装ZLMediaKit以及后期的视频播放使用

dockerfile内容,文件名称:base.Dockerfile

FROM centos:centos7.9.2009 as buildWORKDIR /srv/software# 安装必要的依赖和工具
RUN yum update -y && yum install -y perl-devel  libcurl-devel curl-devel gcc gcc-c++ && \yum install -y openssl zlib-devel tcl  build-essential tk gettext && \yum install -y wget vim# 安装git
RUN wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.39.2.tar.gz --no-check-certificate && \tar -zxvf git-2.39.2.tar.gz && cd  git-2.39.2 && ./configure --prefix=/srv/server/git && make && make install && \touch /etc/profile.d/my_env.sh && \echo 'export PATH=/srv/server/git/bin:$PATH' > /etc/profile.d/my_env.sh# 安装jdk17
RUN wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz --no-check-certificate && \tar -zxvf jdk-17_linux-x64_bin.tar.gz -C /srv/server && \echo '' >> /etc/profile.d/my_env.sh && \echo 'export JAVA_HOME=/srv/server/jdk-17.0.9' >> /etc/profile.d/my_env.sh && \echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile.d/my_env.sh# 安装maven
RUN wget https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz --no-check-certificate && \tar -zxvf apache-maven-3.8.8-bin.tar.gz -C /srv/server && \echo '' >> /etc/profile.d/my_env.sh && \echo 'export MAVEN_HOME=/srv/server/apache-maven-3.8.8' >> /etc/profile.d/my_env.sh && \echo 'export PATH=$MAVEN_HOME/bin:$PATH' >> /etc/profile.d/my_env.sh# 安装yasm
RUN wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz --no-check-certificate && \tar -zxvf yasm-1.3.0.tar.gz && cd yasm-1.3.0 && ./configure --prefix=/srv/server/yasm && make && make install && \echo '' >> /etc/profile.d/my_env.sh && \echo 'export PATH=/srv/server/yasm/bin:$PATH' >> /etc/profile.d/my_env.sh# 安装cmake
RUN source /etc/profile && wget https://cmake.org/files/v3.9/cmake-3.9.2.tar.gz --no-check-certificate && \tar -zxvf cmake-3.9.2.tar.gz && cd cmake-3.9.2 && ./configure --prefix=/srv/server/cmake && make && make install && \echo '' >> /etc/profile.d/my_env.sh && \echo 'export PATH=/srv/server/cmake/bin:$PATH' >> /etc/profile.d/my_env.sh# 安装 ffmpeg
RUN source /etc/profile && wget http://www.ffmpeg.org/releases/ffmpeg-3.1.tar.gz --no-check-certificate && \tar -zxvf ffmpeg-3.1.tar.gz && cd ffmpeg-3.1 && ./configure --prefix=/srv/server/ffmpeg && make && make install && \echo '' >> /etc/profile.d/my_env.sh && \echo 'export PATH=/srv/server/ffmpeg/bin:$PATH' >> /etc/profile.d/my_env.sh# 安装nodejs
RUN wget https://nodejs.org/dist/v12.16.3/node-v12.16.3-linux-x64.tar.gz --no-check-certificate && \tar -zxvf node-v12.16.3-linux-x64.tar.gz -C /srv/server && mv /srv/server/node-v12.16.3-linux-x64 /srv/server/node-v12.16.3 && \echo '' >> /etc/profile.d/my_env.sh && \echo 'export PATH=/srv/server/node-v12.16.3/bin:$PATH' >> /etc/profile.d/my_env.shFROM centos:centos7.9.2009WORKDIR /srv/server# 安装必要的依赖和工具
RUN yum update -y && yum install -y gcc gcc-c++ opensslCOPY --from=build /srv/server /srv/server
COPY --from=build /etc/profile.d/my_env.sh /etc/profile.d/my_env.sh# 刷新环境变量
RUN echo 'source /etc/profile' >> /etc/bashrc

构建镜像命令

以下命令需要和base.Dockerfile在同一路径下执行,构建过程比较慢,耐心等待~~

docker build -t gb28181/basic:1.0 -f base.Dockerfile .

在这里插入图片描述

构建成功

在这里插入图片描述

构建服务部署镜像 gb28181/server:1.0

该镜像主要负责部署以下几个服务:
1.下载编译安装zlm
2.下载wvp-gb28181-pro
3.编译前端代码
4.编译wvp-gb28181-pro后端代码
5.下载编译wvp-pro-assist代码
6.制作启动脚本run.sh,该脚本主要用于启动zlm服务、wvp-gb28181-pro以及wvp-pro-assist
7.对外暴露需要的端口

dockerfile内容,文件名称:server.Dockerfile

FROM gb28181/basic:1.0 as buildWORKDIR /srv/app# 创建文件夹
RUN mkdir -p  /srv/app/gb28181/media && \mkdir -p /srv/app/gb28181/wvp/heapdump && \mkdir -p /srv/app/gb28181/assist/heapdump# 编译安装zlm
RUN source /etc/profile && git clone https://gitee.com/xia-chu/ZLMediaKit.git && \cd ZLMediaKit && \git submodule update --init && \mkdir build && cd build && cmake .. && make -j4 && \rm -f /srv/app/ZLMediaKit/release/linux/Debug/config.ini && \cp -r /srv/app/ZLMediaKit/release/linux/Debug/* /srv/app/gb28181/media# 下载wvp-gb28181-pro
RUN source /etc/profile && git clone https://gitee.com/pan648540858/wvp-GB28181-pro.git# 编译前端代码,如果前后端分开部署这一步可以跳过
RUN source /etc/profile && cd wvp-GB28181-pro/web_src && npm --registry=https://registry.npmmirror.com install && \npm run build# 编译打包wvp-gb28181-pro
RUN source /etc/profile && cd wvp-GB28181-pro && \mvn clean package -Dmaven.test.skip=true && \cp /srv/app/wvp-GB28181-pro/target/*.jar /srv/app/gb28181/wvp && \cp /srv/app/wvp-GB28181-pro/src/main/resources/application-dev.yml /srv/app/gb28181/wvp/application.yml# 下载wvp-pro-assist以及编译打包
RUN source /etc/profile && git clone https://gitee.com/pan648540858/wvp-pro-assist.git && \cd wvp-pro-assist && \mvn clean package -Dmaven.test.skip=true && \cp /srv/app/wvp-pro-assist/target/*.jar /srv/app/gb28181/assist/ && \cp /srv/app/wvp-pro-assist/src/main/resources/application-dev.yml /srv/app/gb28181/assist/application.ymlFROM gb28181/basic:1.0WORKDIR /srv/appCOPY --from=build /srv/app/gb28181/ /srv/app/# 启动脚本
RUN echo '#!/bin/bash' > run.sh && \echo 'source /etc/profile' >> run.sh && \echo 'cd /srv/app/assist' >> run.sh && \echo 'nohup java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/srv/app/assist/heapdump/ -jar *.jar --spring.config.location=/srv/app/assist/application.yml  &' >> run.sh && \echo 'nohup  /srv/app/media/MediaServer -d &' >> run.sh && \echo 'cd /srv/app/wvp' >> run.sh && \echo 'java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/srv/app/wvp/heapdump/ -jar *.jar --spring.config.location=/srv/app/wvp/application.yml ' >> run.sh && \chmod +x run.shEXPOSE 18080/tcp
EXPOSE 5060/tcp
EXPOSE 5060/udp
EXPOSE 18081/tcp
EXPOSE 80/tcp
EXPOSE 443/tcp
EXPOSE 1935/tcp
EXPOSE 8000/tcp
EXPOSE 9000/tcp
EXPOSE 10000/tcp
EXPOSE 554/tcp
EXPOSE 554/udp
EXPOSE 30000-30500/tcp
EXPOSE 30000-30500/udpCMD ["sh", "/srv/app/run.sh"]

构建镜像命令

以下命令需要和server.Dockerfile在同一路径下执行

docker build -t gb28181/server:1.0 -f server.Dockerfile .

在这里插入图片描述

构建成功

在这里插入图片描述

服务部署

WVP-GB28181-PRO配置文件

文件名称:application-wvp.yml,位置:/root/data/gb28181/config
注意以下几点
1. media.id的值要和下面config.ini配置文件中[general]下的mediaServerId的值一致
2. media.secret的值和config.ini中[api]下的secret的值以及[hook]下的admin_params的值三者保持一致
3. media如果开启了多端口模式即media.rtp.enable的值设置为true的话media.rtp.port-range的值要和config.ini中[rtp_proxy]下的port_range的值保持一致
4. 配置中关于数据库和redis的配置请自行根据实际值修改
5. 配置文件中media.ip的值根据实际情况修改

spring:# 设置接口超时时间mvc:async:request-timeout: 60000thymeleaf:cache: false# [可选]上传文件大小限制servlet:multipart:max-file-size: 10MBmax-request-size: 100MB# REDIS数据库配置redis:# [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1host: 192.168.50.155# [必须修改] 端口号port: 6379# [可选] 数据库 DBdatabase: 4# [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接password: 123123# [可选] 超时时间timeout: 10000# mysql数据源datasource:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.50.155:3306/wvp?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=trueusername: rootpassword: 123123hikari:connection-timeout: 20000             # 是客户端等待连接池连接的最大毫秒数initialSize: 10                       # 连接池初始化连接数maximum-pool-size: 200                # 连接池最大连接数minimum-idle: 5                       # 连接池最小空闲连接数idle-timeout: 300000                  # 允许连接在连接池中空闲的最长时间(以毫秒为单位)max-lifetime: 1200000                 # 是池中连接关闭后的最长生命周期(以毫秒为单位)
#[可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口
server:port: 18080# [可选] HTTPS配置, 默认不开启ssl:# [可选] 是否开启HTTPS访问enabled: false# [可选] 证书文件路径,放置在resource/目录下即可,修改xxx为文件名key-store: classpath:test.monitor.89iot.cn.jks# [可选] 证书密码key-store-password: gpf64qmw# [可选] 证书类型, 默认为jks,根据实际修改key-store-type: JKS# 作为28181服务器的配置
sip:# [必须修改] 本机的IP,对应你的网卡,监听什么ip就是使用什么网卡,# 如果要监听多张网卡,可以使用逗号分隔多个IP, 例如: 192.168.1.4,10.0.0.4# 如果不明白,就使用0.0.0.0,大部分情况都是可以的# 请不要使用127.0.0.1,任何包括localhost在内的域名都是不可以的。ip: 0.0.0.0# [可选] 28181服务监听的端口port: 5060# 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007)# 后两位为行业编码,定义参照附录D.3# 3701020049标识山东济南历下区 信息行业接入# [可选]domain: 4401020049# [可选]id: 44010200492000000001# [可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验password: admin123# 是否存储alarm信息alarm: true#zlm 默认服务器配置
media:id: 512dbsFIDsgKv1c2eE7T# [必须修改] zlm服务器的内网IPip: 192.168.50.155# [必须修改] zlm服务器的http.porthttp-port: 8080# [可选] 返回流地址时的ip,置空使用 media.ipstream-ip:# [可选] wvp在国标信令中使用的ip,此ip为摄像机可以访问到的ip, 置空使用 media.ipsdp-ip:# [可选] zlm服务器的hook所使用的IP, 默认使用sip.iphook-ip:# [可选] zlm服务器的http.sslport, 置空使用zlm配置文件配置http-ssl-port: 8443# [可选] zlm服务器的hook.admin_params=secretsecret: BWInk2pjKY8EkuZ6Kc019zajV7RU03N1# 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试rtp:# [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输enable: true# [可选] 在此范围内选择端口用于媒体流传输, 必须提前在zlm上配置该属性,不然自动配置此属性可能不成功port-range: 30000,30500 # 端口范围# [可选] 国标级联在此范围内选择端口发送媒体流,send-port-range: 30000,30500 # 端口范围# 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用record-assist-port: 18081auto-config: true
# [根据业务需求配置]
user-settings:# 点播/录像回放 等待超时时间,单位:毫秒play-timeout: 180000# [可选] 自动点播, 使用固定流地址进行播放时,如果未点播则自动进行点播, 需要rtp.enable=trueauto-apply-play: true# 设备/通道状态变化时发送消息device-status-notify: truesip-log: false# 跨域配置,配置你访问前端页面的地址即可, 可以配置多个allowed-origins:- http://localhost:18080- http://127.0.0.1:18080interface-authentication: falselogging:level:root: info

WVP-PRO-ASSIST配置文件

文件名称:application-assist.yml 位置:/root/data/gb28181/config
注意以下几点
1. userSettings.record的值要填写实际镜像内部视频文件所在的位置
2. userSettings.ffmpeg和ffprobe的值也是镜像内部对应命令所在的路径
3. 配置中关于redis的配置自行修改,其他值如果没有修改按照默认的即可

spring:# REDIS数据库配置redis:# [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1host: 192.168.50.155# [必须修改] 端口号port: 6379# [可选] 数据库 DBdatabase: 4# [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接password: 123123# [可选] 超时时间timeout: 10000# [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口
server:port: 18081# [可选] HTTPS配置, 默认不开启ssl:# [可选] 是否开启HTTPS访问enabled: false# [可选] 证书文件路径,放置在resource/目录下即可,修改xxx为文件名key-store: classpath:xxx.jks# [可选] 证书密码key-password: password# [可选] 证书类型, 默认为jks,根据实际修改key-store-type: JKS# [根据业务需求配置]
userSettings:id: 自行定义# [可选 ] zlm配置的录像路径,record: /srv/app/media/www/record# [可选 ] 录像保存时长(单位: 天)每天晚12点自动对过期文件执行清理recordDay: 7# [可选 ] 录像下载合成临时文件保存时长, 不配置默认取值recordDay(单位: 天)每天晚12点自动对过期文件执行清理# recordTempDay: 7# [必选 ] ffmpeg路径ffmpeg: /srv/server/ffmpeg/bin/ffmpeg# [必选 ] ffprobe路径, 一般安装ffmpeg就会自带, 一般跟ffmpeg在同一目录,用于查询文件的信息ffprobe: /srv/server/ffmpeg/bin/ffprobe# [可选 ] 限制 ffmpeg 合并文件使用的线程数,间接限制cpu使用率, 默认2 限制到50%threads: 2swagger-ui:# [可选] 日志配置, 一般不需要改
logging:file:name: logs/wvp.logmax-history: 30max-size: 10MBtotal-size-cap: 300MBlevel:root: infotop:panll:assist: info

ZLMedia的配置

文件名称:config.ini 位置:/root/data/gb28181/config
注意以下几点
1. [api]下的secret和上文说的保持一致
2. [ffmpeg]下的bin的值为容器内部对应命令所在的路径,如果没修改就是用下面配置中的默认值
3. [general]下的mediaServerId的值和上文说的保持一致
4. [hook]下的几个涉及到ip的配置如果开起了自动配置可以不用管服务开启后会自行设置

; auto-generated by mINI class {[api]
apiDebug=1
defaultSnap=./www/logo.png
downloadRoot=./www
secret=BWInk2pjKY8EkuZ6Kc019zajV7RU03N1
snapRoot=./www/snap/[cluster]
origin_url=
retry_count=3
timeout_sec=15[ffmpeg]
bin=/srv/server/ffmpeg/bin/ffmpeg
cmd=%s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s
log=./ffmpeg/ffmpeg.log
restart_sec=0
snap=%s -rtsp_transport tcp -i %s -y -f mjpeg -frames:v 1 %s[general]
check_nvidia_dev=1
enableVhost=0
enable_ffmpeg_log=0
flowThreshold=1024
maxStreamWaitMS=15000
mediaServerId=512dbsFIDsgKv1c2eE7T
mergeWriteMS=0
resetWhenRePlay=1
streamNoneReaderDelayMS=20000
unready_frame_cache=100
wait_add_track_ms=3000
wait_track_ready_ms=10000[hls]
broadcastRecordTs=0
deleteDelaySec=10
fastRegister=0
fileBufSize=65536
segDur=2
segKeep=0
segNum=3
segRetain=5[hook]
admin_params=BWInk2pjKY8EkuZ6Kc019zajV7RU03N1
alive_interval=10.0
enable=1
on_flow_report=
on_http_access=
on_play=http://0.0.0.0:18080/index/hook/on_play
on_publish=http://0.0.0.0:18080/index/hook/on_publish
on_record_mp4=http://127.0.0.1:18081/api/record/on_record_mp4
on_record_ts=
on_rtp_server_timeout=http://0.0.0.0:18080/index/hook/on_rtp_server_timeout
on_rtsp_auth=
on_rtsp_realm=
on_send_rtp_stopped=http://0.0.0.0:18080/index/hook/on_send_rtp_stopped
on_server_exited=https://0.0.0.0:18080/index/hook/on_server_exited
on_server_keepalive=http://0.0.0.0:18080/index/hook/on_server_keepalive
on_server_started=http://0.0.0.0:18080/index/hook/on_server_started
on_shell_login=
on_stream_changed=http://0.0.0.0:18080/index/hook/on_stream_changed
on_stream_none_reader=http://0.0.0.0:18080/index/hook/on_stream_none_reader
on_stream_not_found=http://0.0.0.0:18080/index/hook/on_stream_not_found
retry=1
retry_delay=3.0
stream_changed_schemas=rtsp/rtmp/fmp4/ts/hls/hls.fmp4
timeoutSec=20[http]
allow_cross_domains=1
allow_ip_range=::1,127.0.0.1,172.16.0.0-172.31.255.255,192.168.0.0-192.168.255.255,10.0.0.0-10.255.255.255
charSet=utf-8
dirMenu=1
forbidCacheSuffix=
forwarded_ip_header=
keepAliveSecond=30
maxReqSize=40960
notFound=<html><head><title>404 Not Found</title></head><body bgcolor="white"><center><h1>您访问的资源不存在!</h1></center><hr><center>ZLMediaKit(git hash:e81ff30/2023-11-25T21:43:16+08:00,branch:master,build time:2023-11-26T01:11:59)</center></body></html>
port=80
rootPath=./www
sendBufSize=65536
sslport=443
virtualPath=[multicast]
addrMax=239.255.255.255
addrMin=239.0.0.0
udpTTL=64[protocol]
add_mute_audio=1
auto_close=0
continue_push_ms=3000
enable_audio=1
enable_fmp4=1
enable_hls=1
enable_hls_fmp4=0
enable_mp4=0
enable_rtmp=1
enable_rtsp=1
enable_ts=1
fmp4_demand=0
hls_demand=0
hls_save_path=./www
modify_stamp=2
mp4_as_player=0
mp4_max_second=3600
mp4_save_path=/srv/app/media/www
paced_sender_ms=0
rtmp_demand=0
rtsp_demand=0
ts_demand=0[record]
appName=record
fastStart=0
fileBufSize=65536
fileRepeat=0
sampleMS=500[rtc]
externIP=
port=8000
preferredCodecA=PCMU,PCMA,opus,mpeg4-generic
preferredCodecV=H264,H265,AV1,VP9,VP8
rembBitRate=0
tcpPort=8000
timeoutSec=15[rtmp]
directProxy=1
enhanced=1
handshakeSecond=15
keepAliveSecond=15
port=1935
sslport=0[rtp]
audioMtuSize=600
h264_stap_a=1
lowLatency=0
rtpMaxSize=10
videoMtuSize=1400[rtp_proxy]
dumpDir=
gop_cache=1
h264_pt=98
h265_pt=99
opus_pt=100
port=10000
port_range=30000-30500
ps_pt=96
timeoutSec=15[rtsp]
authBasic=0
directProxy=1
handshakeSecond=15
keepAliveSecond=15
lowLatency=0
port=554
rtpTransportType=-1
sslport=0[shell]
maxReqSize=1024
port=0[srt]
latencyMul=4
pktBufSize=8192
port=9000
timeoutSec=5; } ---

创建挂载目录

# 配置文件
mkdir -p /root/data/gb28181/config
# 视频文件
mkdir -p /root/data/gb28181/data
# 日志文件
mkdir -p /root/data/gb28181/logs

启动镜像

端口说明

8080:媒体服务zlm对外暴露的http端口
8443:媒体服务zlm对外暴露的ssl端口
8554:rtsp暴露的端口
18080:wvp–gb8181-pro服务对外暴露的端口
5060:sip服务对外暴露的端口
18081:录像服务wvp-pro-assist对外暴露的端口
10000:如果未开启多端口模式(media.rtp.enable=false)则使用该端口进行媒体流传输
30000-30500:如果开启多端口模式(media.rtp.enable=true)则在该范围内随机产生端口进行媒体流传输
1935:rtmp暴露的端口
8000:rtc暴露的端口
9000:srt暴露的端口
如果未开启多端口模式即media.rtp.enable=false,那么30000-30500的端口可以不用做映射

挂载卷说明
  • -v /root/data/gb28181/config/config.ini:/srv/app/media/config.ini ===> zlm服务对应的配置文件
  • -v /root/data/gb28181/config/application-assist.yml:/srv/app/assist/application.yml ===> 媒体录像服务对应的配置文件
  • -v /root/data/gb28181/config/application-wvp.yml:/srv/app/wvp/application.ym ===> GB28181服务对应的配置文件
  • -v /root/data/gb28181/data:/srv/app/media/www ===> zlm媒体录像存储文件
  • -v /root/data/gb28181/logs/media:/srv/app/media/log ===> zlm媒体服务的日志文件
  • -v /root/data/gb28181/logs/assit:/srv/app/assist/logs ===> 媒体录像服务的日志文件
  • -v /root/data/gb28181/logs/wvp:/srv/app/wvp/logs ===> GB28181服务的日志文件
docker run -id -p 1935:1935 -p 8080:80 -p 5060:5060 -p 5060:5060/udp -p 8443:443 -p 8554:554 -p 18080:18080 -p 18081:18081 -p 10000:10000 -p 8000:8000 -p 9000:9000 -p 30000-30500:30000-30500 -p 30000-30500:30000-30500/udp \
-v /root/data/gb28181/config/config.ini:/srv/app/media/config.ini \
-v /root/data/gb28181/config/application-assist.yml:/srv/app/assist/application.yml \
-v /root/data/gb28181/config/application-wvp.yml:/srv/app/wvp/application.yml \
-v /root/data/gb28181/data:/srv/app/media/www \
-v /root/data/gb28181/logs/media:/srv/app/media/log \
-v /root/data/gb28181/logs/assit:/srv/app/assist/logs \
-v /root/data/gb28181/logs/wvp:/srv/app/wvp/logs \
--restart=always \
--name gb28181 gb28181/server:1.0

执行以上命令启动镜像后查看对应服务的日志

  • gb28181服务的日志
    在这里插入图片描述
  • 录像服务日志
    在这里插入图片描述
  • zlm媒体服务
    zlm日志要关注下红线中的日志,刚开始的时候18080对应的服务还没开启所以这时候请求接口是失败的
    在这里插入图片描述
    等待18080服务启动成功后zlm请求18080就会成功,下面的日志代表请求18080服务成功
    在这里插入图片描述
    如果查看zlm的日志发现请求18080服务一直失败就要看下对应的服务是不是没启动成功,具体原因查看对应服务进行分析,一定要确保zlm请求18080 服务成功

验证部署结果

  1. 访问GB28181服务:IP+端口 例如:http://192.168.50.18080/#/login,首次访问需要登录,默认的用户名和密码:admin/admin
    在这里插入图片描述
  2. 输入用户名和密码进行登录
    在这里插入图片描述
  3. 点击右上角的平台信息,查看国标服务的相关配置
    在这里插入图片描述
  4. 根据以上信息配置对应的摄像头,这里以海康摄像头为例,访问摄像头的ip进行登录后,切换到配置界面==>网络==>高级配置==>平台接入
    平台接入方式:gb28181
    传输协议:udp
    sip信息填写对应平台信息里面的即可
    在这里插入图片描述
  5. 填写完成记得保存,一定要保存,保存,保存!!!
  6. 访问gb28181服务切换到国标设备,可以看到摄像头已经自动显示了
    在这里插入图片描述
  7. 点击操作下的通道
    在这里插入图片描述
  8. 点击播放
    在这里插入图片描述
  9. 其他功能请自行探索~~
  10. 如果视频无法播放看下自己的配置文件是否正确,另外确保网络是互通的,即摄像头、sip和zlm三者之间要保证网络可以互相访问,博主就是因为网络问题困在了无法播放视频这里好久。

结束语

关于gb28181的部署和视频播放问题博主也是研究了好久,最后才将遇到的所有问题一一解决,为了少遇到类似问题博主将所有的服务部署整理成了Dockerfile,一来是为了方便部署,二来也是为了减少单独部署中遇到诸多问题。如果这篇文章帮你解决了问题希望能点赞收藏~~

相关文章:

wvp-GB28181-pro 2.0+ZLMediaKit 使用Dockerfile制作镜像以及部署【CentOS7】

说明 部署gb28181和zlm主要需要构建两个镜像&#xff0c;第一个为基础镜像&#xff0c;以centos7为基础构建新的基础镜像base.Dockerfile,第二个镜像为服务部署镜像server.Dockerfile&#xff0c;以第一个镜像base.Dockerfile构建出的镜像为基础镜像进行构建 整个基础镜像的构…...

登录校验,JWT令牌技术,过滤器(Filter)拦截器(interceptor)

登录功能&#xff1a; 前端传递json格式的数据。username&#xff08;用户名&#xff09;password&#xff08;密码&#xff09;。controller层对数据进行接收&#xff0c;由于是接收json格式的数据&#xff0c;所以我们把它封装到一个对象里面&#xff0c;由于登录是员工进行登…...

springCloud项目打包如何把jar放到指定目录下

springCloud项目打包如何把jar发放到指定目录下 maven-antrun-plugin springCloud微服务打包jar&#xff0c;模块过多&#xff1b;我的项目模块结构如下&#xff1a; 我把实体类相关的单独抽离一个模块在service-api下服务单独写在service某块下&#xff0c; 每个模块的jar都…...

vue中2种取值的方式

1.url是这种方式的&#xff1a;http://localhost:3000/user/1 取得参数的方式为&#xff1a;this.$route.params.id 2.url为get方式用&#xff1f;拼接参数的&#xff1a;http://localhost:3000/user?phone131121123&companyId2ahttp://localhost:3000/ 取得参数值的方式…...

Python基础05-函数

零、文章目录 Python基础05-函数 1、函数的作用及其使用步骤 &#xff08;1&#xff09;函数的作用 在Python实际开发中&#xff0c;我们使用函数的目的只有一个“让我们的代码可以被重复使用” 函数的作用有两个&#xff1a; ① 代码重用&#xff08;代码重复使用&#xf…...

Ubuntu 设置共享文件夹

一、在Windows中建立一个英文的文件夹 注意&#xff1a;新建文件夹的名称一定要是英文的&#xff0c;不能出现中文的路径&#xff08;可能出现问题&#xff09; 二、在VMware中添加共享文件 3: VMware安装VMware Tools 一般安装成功桌面上会显示这个安装包&#xff0c;&…...

操作系统期末复习-内存管理

一、内存管理 分页存储管理&#xff0c;是将一个进程的逻辑地址空间分成若干个大小相等的片&#xff0c;称为页面或页&#xff0c;并为各页加以编号&#xff0c;从0开始&#xff0c;如第0页、第1页等。相应地&#xff0c;也把内存空间分成与页面相同大小的若干个存储块&#xf…...

基于YOLOv8深度学习的西红柿成熟度检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…...

大数据存储技术(3)—— HBase分布式数据库

目录 一、HBase简介 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;特点 &#xff08;三&#xff09;HBase架构 二、HBase原理 &#xff08;一&#xff09;读流程 &#xff08;二&#xff09;写流程 &#xff08;三&#xff09;数据 flush 过程 &#xf…...

docker容器日志占用磁盘空间过大问题

docker服务运行一段时间后&#xff0c;发现磁盘空间占用很高 其中磁盘占用主要以下目录&#xff1a; /var/lib/docker/containers # 查询占用磁盘较大的文件-升序 du -d1 -h /var/lib/docker/containers | sort -h 控制容器日志大小 法一&#xff1a;容器运行时控制 # max-…...

飞天使-docker知识点6-容器dockerfile各项名词解释

文章目录 docker的小技巧dockerfile容器为什么会出现启动了不暂停查看docker 网桥相关信息 docker 数据卷 docker的小技巧 [rootlight-test playbook-vars[]# docker inspect -f "{{.NetworkSettings.IPAddress}}" d3a9ae03ae5f 172.17.0.4docker d3a9ae03ae5f:/etc…...

oracle-关闭审计功能

1.查看审计功能是否开启 su – oraclesqlplus “/as sysdba”SQL> show parameter audit_trail NAME TYPE VALUE audit_trail string DB 注:VALUE值为DB时,表明审计功能为开启的状态 2.关闭oracle的审计功能 SQL> alter system set audit_trailFALSE scopespfile; Sy…...

three.js(一)

文章目录 three.js环境搭建正文补充 示例效果知识点补充1:一个标准的html知识点补充2:原生的前端框架和Vue框架的区别原生的前端框架Vue框架声明式编程和响应式编程 three.js环境搭建 正文 搭建 Three.js 的环境通常包括以下几个步骤&#xff1a; 1.创建项目目录&#xff1a…...

Python基础入门:语法与数据类型

Python基础入门&#xff1a;语法与数据类型 一、引言 Python是一种简单易学、功能强大的编程语言&#xff0c;广泛应用于数据分析、机器学习、Web开发等领域。本文将介绍Python的基础语法和数据类型&#xff0c;帮助初学者快速入门。 二、Python基础语法 缩进 Python中的缩…...

@Scheduled任务调度/定时任务-非分布式

1、功能概述 任务调度就是在规定的时间内执行的任务或者按照固定的频率执行的任务。是非常常见的功能之一。常见的有JDK原生的Timer, ScheduledThreadPoolExecutor以及springboot提供的Schduled。分布式调度框架如QuartZ、Elasticjob、XXL-JOB、SchedulerX、PowerJob等。 本文…...

【ARM Trace32(劳特巴赫) 使用介绍 14 -- Go.direct 介绍】

请阅读【Trace32 ARM 专栏导读】 文章目录 Trace32 Go.directGo配合程序断点使用Go 配合读写断点使用Go 快速回到上一层函数 System.Mode Go Trace32 Go.direct TRACE32调试过程中&#xff0c;会经常对芯片/内核进行控制&#xff0c;比如全速运行、暂停、单步等等。这篇文章先…...

第二十章 : Spring Boot 集成RabbitMQ(四)

第二十章 : Spring Boot 集成RabbitMQ(四) 前言 本章知识点:死信队列的定义、场景、作用以及原理、TTL方法的使用以及演示代码示例。 Springboot 版本 2.3.2.RELEASE ,RabbitMQ 3.9.11,Erlang 24.2死信队列 定义:什么是死信队列? 在RabbitMQ中,并没有提供真正意义…...

防止反编译,保护你的SpringBoot项目

ClassFinal-maven-plugin插件是一个用于加密Java字节码的工具&#xff0c;它能够保护你的Spring Boot项目中的源代码和配置文件不被非法获取或篡改。下面是如何使用这个插件来加密test.jar包的详细步骤&#xff1a; 安装并设置Maven&#xff1a; 首先确保你已经在你的开发环境中…...

OpenCV开发:MacOS源码编译opencv,生成支持java、python、c++各版本依赖库

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它为开发者提供了丰富的工具和函数&#xff0c;用于处理图像和视频数据&#xff0c;以及执行各种计算机视觉任务。 以下是 OpenCV 的一些主要特点和功能&#xff…...

【数据库设计和SQL基础语法】--查询数据--分组查询

一、分组查询概述 1.1 什么是分组查询 分组查询是一种 SQL 查询技术&#xff0c;通过使用 GROUP BY 子句&#xff0c;将具有相同值的数据行分组在一起&#xff0c;然后对每个组应用聚合函数&#xff08;如 COUNT、SUM、AVG等&#xff09;。这允许在数据集中执行汇总和统计操作…...

使用对象处理流ObjectOutputStream读写文件

注意事项: 1.创建的对象必须实现序列化接口,如果属性也是类&#xff0c;那么对应的类也要序列化 2.读写文件路径问题 3.演示一个例子 &#xff08;1&#xff09;操作的实体类FileModel&#xff0c;实体类中有Map,HashMap这些自带的本身就实现了序列化。 public class File…...

【高级网络程序设计】Block1总结

这一个Block分为四个部分&#xff0c;第一部分是Introduction to Threads and Concurrency &#xff0c;第二部分是Interruptting and Terminating a Thread&#xff0c;第三部分是Keep Threads safety&#xff1a;the volatile variable and locks&#xff0c;第四部分是Beyon…...

linux下查看进程资源ulimit

ulimit介绍与使用 ulimit命令用于查看和修改进程的资源限制。下面是ulimit命令的使用方法&#xff1a; 查看当前资源限制&#xff1a; ulimit -a 这将显示当前进程的所有资源限制&#xff0c;包括软限制和硬限制。查看或设置单个资源限制&#xff1a; ulimit -<option> …...

C++ I/O操作---输入输出

本文主要介绍C I/O操作中的输入输出流。 目录 1 输入输出 2 输入输出流分类 3 C中的输入输出流 4 iostream 5 std::ofstream 6 std::fstream 7 std::getline 1 输入输出 C的输入输出是数据在不同设备之间的传输&#xff0c;即在硬盘、内存和外设之间的传输。 数据如水流…...

会 C# 应该怎么学习 C++?

会 C# 应该怎么学习 C&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&a…...

CentOS 7 部署frp穿透内网

本文将介绍如何在CentOS 7.9上部署frp&#xff0c;并通过示例展示如何配置和测试内网穿透。 文章目录 &#xff08;1&#xff09;引言&#xff08;2&#xff09;准备工作&#xff08;4&#xff09;frps服务器端配置&#xff08;5&#xff09;frpc客户端配置&#xff08;6&#…...

高效网络爬虫:代理IP的应用与实践

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f91f; 代理 IP 推荐&#xff1a;&#x1f449;品易 HTTP 代理 IP &#x1f485; 想寻找共同学习交流的小伙伴&#xff0c…...

java设计模式-工厂方法模式

1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口&#xff0c;将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。 2.工厂方法模式的主要优缺点 优点&#xff1a; 用户只需要知道具体工厂的名称…...

Python实验项目9 :网络爬虫与自动化

实验 1&#xff1a;爬取网页中的数据。 要求&#xff1a;使用 urllib 库和 requests 库分别爬取 http://www.sohu.com 首页的前 360 个字节的数据。 # 要求&#xff1a;使用 urllib 库和 requests 库分别爬取 http://www.sohu.com 首页的前 360 个字节的数据。 import urllib.r…...

实验三:指令调度和延迟分支

一、实验目的 加深对指令调度技术的理解。加深对延迟分支技术的理解。熟练掌握用指令调度技术来解决流水线中的数据冲突的方法。进一步理解指令调度技术对CPU性能的改进。进一步理解延迟分支技术对CPU性能的改进。 二、实验内容和步骤 首先要掌握MIPSsim模拟器的使用方法。见…...

文具网站建设策划书/关键词完整版免费听

1、计算机的存储单位有哪些呢&#xff1f;git计算机存储单位通常用B&#xff0c;KB&#xff0c;MB&#xff0c;GB&#xff0c;TB&#xff0c;PB&#xff0c;EB&#xff0c;ZB&#xff0c;YB&#xff0c;BB来表示&#xff0c;spa2、他们换算关系是怎样的呢&#xff1f;blog一、计…...

做的烂的大网站/百度提交入口网址是什么

wxaParse/css.js / page-frame vv.js...

发布网站需要备案/网络营销个人感悟小结

8.24 8.25 8.26 前言 我只是讨厌被人使唤——所谓“任性”有钱人是规则的制定者女人总是做的傻事——与钱有关的傻事&#xff1a; “我们低估了自己”男人迷路了&#xff0c;又不问路&#xff0c;我们却还跟着他如果得到某件东西的代价是丢掉我们的自尊、自信和自我价值&…...

什么是品牌网站建设/南宁哪里有seo推广厂家

目录 set的介绍 map的介绍 map的总结 set的介绍 1、set是按照一定次序存储元素的容器 2、在set中&#xff0c;元素的value也标识它(value就是key&#xff0c;类型为T)&#xff0c;并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const)&#xff0c;但是可…...

淘宝客必须做网站吗/百度官方网

- 试过重装MSVCR100.dll (无效而且由于版本不对引起了其他错误: 无法定位程序输入点1_NonReentrantPPLLockHolderdetailsConcurrencyQAEXZ与动态链接库msvcr100.dll上)&#xff0c;官方MSVCR win7&#xff0c;XP的dll下载地址&#xff1a;http://www.microsoft.com/zh-cn/down…...

昆山做网站找文博/新东方雅思培训价目表

在这个项目上&#xff0c;也就是前端的工作居多。某日&#xff0c;一友人因把文件上传到 Dropbox 而引发众怒。同时&#xff0c;百度网盘也越来越不好用了。我随意吐槽之。于是乎&#xff0c;就有了这个项目。 某个周六深夜&#xff0c;写小程序已闷死&#xff0c;突然想起答应…...