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

news2024/11/16 7:44:11

说明

部署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 build

WORKDIR /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.sh

FROM centos:centos7.9.2009

WORKDIR /srv/server

# 安装必要的依赖和工具
RUN yum update -y && yum install -y gcc gcc-c++ openssl

COPY --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 build

WORKDIR /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.yml

FROM gb28181/basic:1.0

WORKDIR /srv/app

COPY --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.sh

EXPOSE 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/udp

CMD ["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: 60000
  thymeleaf:
    cache: false
  # [可选]上传文件大小限制
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 100MB
  # REDIS数据库配置
  redis:
    # [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1
    host: 192.168.50.155
    # [必须修改] 端口号
    port: 6379
    # [可选] 数据库 DB
    database: 4
    # [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接
    password: 123123
    # [可选] 超时时间
    timeout: 10000
    # mysql数据源
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.50.155:3306/wvp?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
    username: root
    password: 123123
    hikari:
      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服务器的内网IP
  ip: 192.168.50.155
  # [必须修改] zlm服务器的http.port
  http-port: 8080
  # [可选] 返回流地址时的ip,置空使用 media.ip
  stream-ip:
  # [可选] wvp在国标信令中使用的ip,此ip为摄像机可以访问到的ip, 置空使用 media.ip
  sdp-ip:
  # [可选] zlm服务器的hook所使用的IP, 默认使用sip.ip
  hook-ip:
  # [可选] zlm服务器的http.sslport, 置空使用zlm配置文件配置
  http-ssl-port: 8443
  # [可选] zlm服务器的hook.admin_params=secret
  secret: BWInk2pjKY8EkuZ6Kc019zajV7RU03N1
  # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试
  rtp:
    # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输
    enable: true
    # [可选] 在此范围内选择端口用于媒体流传输, 必须提前在zlm上配置该属性,不然自动配置此属性可能不成功
    port-range: 30000,30500 # 端口范围
    # [可选] 国标级联在此范围内选择端口发送媒体流,
    send-port-range: 30000,30500 # 端口范围
  # 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用
  record-assist-port: 18081
  auto-config: true
# [根据业务需求配置]
user-settings:
  # 点播/录像回放 等待超时时间,单位:毫秒
  play-timeout: 180000
  # [可选] 自动点播, 使用固定流地址进行播放时,如果未点播则自动进行点播, 需要rtp.enable=true
  auto-apply-play: true
  # 设备/通道状态变化时发送消息
  device-status-notify: true
  sip-log: false
  # 跨域配置,配置你访问前端页面的地址即可, 可以配置多个
  allowed-origins:
    - http://localhost:18080
    - http://127.0.0.1:18080
  interface-authentication: false

logging:
  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.1
        host: 192.168.50.155
        # [必须修改] 端口号
        port: 6379
        # [可选] 数据库 DB
        database: 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: 2

swagger-ui:

# [可选] 日志配置, 一般不需要改
logging:
    file:
        name: logs/wvp.log
        max-history: 30
        max-size: 10MB
        total-size-cap: 300MB
    level:
        root: info
        top:
            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,一来是为了方便部署,二来也是为了减少单独部署中遇到诸多问题。如果这篇文章帮你解决了问题希望能点赞收藏~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1309959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

防火墙无非就这8种类型,小白完全不用怕!

你们好&#xff0c;我的网工朋友。 当我们谈到网络开放性带来的安全挑战时&#xff0c;都会想起黑客、病毒、恶意软件等等。 而正是因为这些威胁&#xff0c;让网络安全变成了网络世界里的重要议题&#xff0c;如果说起怎么保护网络安全&#xff0c;基本上我们都会第一时间想…

Java8新特性:函数式(Functional)接口

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…

Spark环境搭建和使用方法

目录 一、安装Spark &#xff08;一&#xff09;基础环境 &#xff08;二&#xff09;安装Python3版本 &#xff08;三&#xff09;下载安装Spark &#xff08;四&#xff09;配置相关文件 二、在pyspark中运行代码 &#xff08;一&#xff09;pyspark命令 &#xff08…

HTTP 403错误:禁止访问,如何解除

“HTTP 403错误&#xff0c;禁止访问&#xff01;”这句话是不是听起来就像是在告诉你&#xff1a;“嘿&#xff0c;你没有权限进这个房间&#xff01;”没错&#xff0c;这就是你尝试访问某个网站或资源时可能会遇到的问题。别急&#xff0c;这里有一份秘籍&#xff0c;教你如…

Cobalt Strike四种提权方法

简介 Cobalt Strike是一款基于java的渗透测试神器&#xff0c;常被业界人称为CS神器。自3.0以后已经不在使用Metasploit框架而作为一个独立的平台使用&#xff0c;分为客户端与服务端&#xff0c;服务端是一个&#xff0c;客户端可以有多个&#xff0c;非常适合团队协同作战&a…

剧本杀小程序成为创业者新选择,剧本杀小程序开发

剧本杀作为现下年轻人最喜欢的新兴行业&#xff0c;发展前景非常乐观&#xff0c;即使剧本杀目前处于创新发展阶段&#xff0c;但剧本杀行业依然在快速发展中。 根据业内数据&#xff0c;预计2025年剧本杀市场规模能达到四百多亿元。市场规模的扩大自然也吸引来了不少的创业者…

最前端|Locofy试用报告:设计稿直接转换为代码

目录 一、调研目的 二、调研报告设计 三、调研报告 &#xff08;一&#xff09;操作步骤 &#xff08;二&#xff09;结果初见 (三&#xff09;初步结论 四、总结 五、补充 一、调研目的 初步调研的目标&#xff1a; locofy 的 实操流程locofy 涉及到的相关工作角色及其…

TOUGH系列软件实践技术应用

TOUGH系列软件是由美国劳伦斯伯克利实验室开发的&#xff0c;旨在解决非饱和带中地下水、热运移的通用模拟软件。和传统地下水模拟软件Feflow和Modflow不同&#xff0c;TOUGH系列软件采用模块化设计和有限积分差网格剖分方法&#xff0c;通过配合不同状态方程&#xff08;EOS模…

el-tree搜索的使用

2023.12.11今天我学习了如何对el-tree进行搜索的功能&#xff0c;效果如下&#xff1a; 代码如下&#xff1a; 重点部分&#xff1a;给el-tree设置ref&#xff0c;通过监听roleName的变化过滤数据。 default-expand-all可以设置默认展开全部子节点。 check可以拿到当前节点的…

程序员必读:Python 中如何完美处理日志记录?

日志记录在软件开发中扮演着至关重要的角色。它不仅可以帮助开发人员跟踪应用程序的状态和行为&#xff0c;还能提供有价值的诊断信息。Python 提供了内置的 logging 模块&#xff0c;为开发者提供了一个强大且灵活的日志记录工具。 日志的重要性 在软件开发中&#xff0c;对…

数字孪生的开发平台

数字孪生在国内得到了越来越多的关注&#xff0c;一些公司和平台提供了数字孪生的开发服务。以下是一些国内数字孪生的开发平台或服务提供商&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.华为数字…

低功耗全极霍尔开关国产芯片D02,适用于手机或笔记本电脑等产品中,数字输出 2.4V~5.5V的电池供电

D02 是一款低功耗全极霍尔开关&#xff0c;用于检测施加的磁通量密度&#xff0c;并提供一个数字输出&#xff0c;该输出指示所感测磁通量幅度的当前状态。这些应用的一个例子是翻盖手机中的 ON/OFF 开关。 微功耗设计特别适合电池供电系统&#xff0c;如手机或笔记本电脑&…

短视频自媒体创作者都在用的去水印小程序

如今可以发短视频的平台越来越多&#xff0c;我们经常看到喜欢的视频想下载下来&#xff0c;或者当做手机壁纸&#xff0c;由于直接下载下来视频都会带有平台的水印&#xff0c;让我们用着看起来非常不美观&#xff0c;所以我们就要想办法去掉这个水印&#xff0c;下载没有水印…

HarmonyOS4.0从零开始的开发教程15HTTP数据请求

HarmonyOS&#xff08;十三&#xff09;HTTP数据请求 1 概述 日常生活中我们使用应用程序看新闻、发送消息等&#xff0c;都需要连接到互联网&#xff0c;从服务端获取数据。例如&#xff0c;新闻应用可以从新闻服务器中获取最新的热点新闻&#xff0c;从而给用户打造更加丰富…

ubuntu解决问题:E: Unable to locate package manpages-posix-dev

sudo apt-get install manpages-posix-dev 想要在ubuntu里面安装manpages-posix-dev这个包&#xff0c;发现弹出错误 E: Unable to locate package manpages-posix-dev 解决方法如下&#xff1a; 1 查看当前ubuntu的版本 abhishekitsfoss:~$ lsb_release -a No LSB module…

基于ssm神马物流系统论文

摘 要 本神马物流管理系统设计目标是实现神马物流的信息化管理&#xff0c;提高管理效率&#xff0c;使得神马物流管理作规范化、科学化、高效化。 本文重点阐述了神马物流管理系统的开发过程&#xff0c;以实际运用为开发背景&#xff0c;基于SSMVue框架&#xff0c;运用了Ja…

mybatis动态SQL-sql片段

1、建库建表 create database mybatis-example; use mybatis-example; create table emp (empNo varchar(40),empName varchar(100),sal int,deptno varchar(10) ); insert into emp values(e001,张三,8000,d001); insert into emp values(e002,李四,9000,d001); insert into…

用CHAT分析问题的作用

问CHAT&#xff1a;电网数据中心的数据生命周期管理的管理平台是数据资产目录管理平台&#xff0c;简述一下它的作用。 CHAT回复&#xff1a;数据资产目录管理平台 (Data Catalog Management Platform) 是电网数据中心对于数据生命周期管理的重要工具。 1. 提供统一视图&#…

量子计算挑战赛启动!空中客车公司和宝马集团联手发起

&#xff08;图片来源&#xff1a;网络&#xff09; 空中客车公司&#xff08;Airbus&#xff09;和宝马集团&#xff08;BMW&#xff09;共同发起了一项名为“探索量子迁移率”的全球量子计算挑战赛&#xff0c;旨在解决航空和汽车领域仍未克服的紧迫难题。 此次挑战赛汇聚了…

map|二分查找|离线查询|LeetCode:2736最大和查询

本文涉及的基础知识点 二分查找算法合集 题目 给你两个长度为 n 、下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;另给你一个下标从 1 开始的二维数组 queries &#xff0c;其中 queries[i] [xi, yi] 。 对于第 i 个查询&#xff0c;在所有满足 nums1[j] > xi 且…