diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5480842 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "kiroAgent.configureMCP": "Disabled" +} \ No newline at end of file diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 9758161..dcc2730 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -1,83 +1,5 @@ version: '3' services: - polaris-redis: - image: redis:latest # 使用官方Redis镜像 - restart: unless-stopped - healthcheck: - test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ] - interval: 15s - timeout: 5s - retries: 10 - start_period: 10s - networks: - - media-net - # ports: - # - 6379:6379 - volumes: - - ./redis/conf/redis.conf:/opt/polaris/redis/redis.conf - - ./volumes/redis/data/:/data - environment: - TZ: "Asia/Shanghai" - command: redis-server /opt/polaris/redis/redis.conf --appendonly yes - - polaris-mysql: - image: mysql:8 # 使用官方MySQL 8镜像 - restart: unless-stopped - healthcheck: - test: [ "CMD", "bash", "-c", "cat < /dev/null > /dev/tcp/127.0.0.1/3306" ] - interval: 15s - timeout: 5s - retries: 10 - start_period: 10s - networks: - - media-net - environment: - MYSQL_DATABASE: wvp - MYSQL_ROOT_PASSWORD: root - MYSQL_USER: wvp_user - MYSQL_PASSWORD: wvp_password - TZ: Asia/Shanghai - # ports: - # - 3306:3306 - volumes: - - ./mysql/conf:/etc/mysql/conf.d - - ./logs/mysql:/logs - - ./volumes/mysql/data:/var/lib/mysql - - ../数据库/2.7.4/初始化-mysql-2.7.4.sql:/docker-entrypoint-initdb.d/init.sql # 初始化SQL脚本目录 - command: [ - # '--default-authentication-plugin=mysql_native_password', - '--innodb-buffer-pool-size=80M', - '--character-set-server=utf8mb4', - '--collation-server=utf8mb4_general_ci', - '--default-time-zone=+8:00', - '--lower-case-table-names=1' - ] - - polaris-media: - image: zlmediakit/zlmediakit:master # 替换为官方镜像 - restart: always - networks: - - media-net - ports: - #- "6080:80/tcp" # [播流]HTTP 安全考虑-非测试阶段需要注释掉,改为由nginx代理播流地址 - #- "4443:443/tcp" # [播流]HTTPS 安全考虑-非测试阶段需要注释掉,改为由nginx代理播流地址 - - "${MediaRtmp:-10935}:${MediaRtmp:-10935}/tcp" # [收流]RTMP - - "${MediaRtmp:-10935}:${MediaRtmp:-10935}/udp" # [收流]RTMP - #- "41935:41935/tcp" # [收流]RTMPS 无效 - - "${MediaRtsp:-5540}:${MediaRtsp:-5540}/tcp" # [收流]RTSP - - "${MediaRtsp:-5540}:${MediaRtsp:-5540}/udp" # [收流]RTSP - #- "45540:45540/tcp" # [收流]RTSPS 无效 - - "${MediaRtp:-10000}:${MediaRtp:-10000}/tcp" # [收流]RTP - - "${MediaRtp:-10000}:${MediaRtp:-10000}/udp" # [收流]RTP - volumes: - - ./volumes/video:/opt/media/bin/www/record/ - - ./logs/media:/opt/media/log/ - - ./media/config.ini:/conf/config.ini - command: [ - 'MediaServer', - '-c', '/conf/config.ini', - '-l', '0' - ] polaris-wvp: # 显式指定构建上下文和Dockerfile路径 @@ -132,24 +54,8 @@ services: RecordSip: ${RecordSip} RecordPushLive: ${RecordPushLive} - polaris-nginx: - # 显式指定构建上下文和Dockerfile路径 - build: - context: .. # 构建上下文的根路径 - dockerfile: ./docker/nginx/Dockerfile # 相对于上下文路径的Dockerfile位置 - ports: - - "${WebHttp:-8080}:8080" - depends_on: - - polaris-wvp - volumes: - - ./nginx/templates/:/etc/nginx/templates - - ./logs/nginx:/var/log/nginx - environment: - # 流链接的IP - Stream_IP: ${Stream_IP} - networks: - - media-net + networks: - media-net: + 1panel-network: driver: bridge \ No newline at end of file diff --git a/docker/docker-compose1.yml b/docker/docker-compose1.yml new file mode 100644 index 0000000..9758161 --- /dev/null +++ b/docker/docker-compose1.yml @@ -0,0 +1,155 @@ +version: '3' +services: + polaris-redis: + image: redis:latest # 使用官方Redis镜像 + restart: unless-stopped + healthcheck: + test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ] + interval: 15s + timeout: 5s + retries: 10 + start_period: 10s + networks: + - media-net + # ports: + # - 6379:6379 + volumes: + - ./redis/conf/redis.conf:/opt/polaris/redis/redis.conf + - ./volumes/redis/data/:/data + environment: + TZ: "Asia/Shanghai" + command: redis-server /opt/polaris/redis/redis.conf --appendonly yes + + polaris-mysql: + image: mysql:8 # 使用官方MySQL 8镜像 + restart: unless-stopped + healthcheck: + test: [ "CMD", "bash", "-c", "cat < /dev/null > /dev/tcp/127.0.0.1/3306" ] + interval: 15s + timeout: 5s + retries: 10 + start_period: 10s + networks: + - media-net + environment: + MYSQL_DATABASE: wvp + MYSQL_ROOT_PASSWORD: root + MYSQL_USER: wvp_user + MYSQL_PASSWORD: wvp_password + TZ: Asia/Shanghai + # ports: + # - 3306:3306 + volumes: + - ./mysql/conf:/etc/mysql/conf.d + - ./logs/mysql:/logs + - ./volumes/mysql/data:/var/lib/mysql + - ../数据库/2.7.4/初始化-mysql-2.7.4.sql:/docker-entrypoint-initdb.d/init.sql # 初始化SQL脚本目录 + command: [ + # '--default-authentication-plugin=mysql_native_password', + '--innodb-buffer-pool-size=80M', + '--character-set-server=utf8mb4', + '--collation-server=utf8mb4_general_ci', + '--default-time-zone=+8:00', + '--lower-case-table-names=1' + ] + + polaris-media: + image: zlmediakit/zlmediakit:master # 替换为官方镜像 + restart: always + networks: + - media-net + ports: + #- "6080:80/tcp" # [播流]HTTP 安全考虑-非测试阶段需要注释掉,改为由nginx代理播流地址 + #- "4443:443/tcp" # [播流]HTTPS 安全考虑-非测试阶段需要注释掉,改为由nginx代理播流地址 + - "${MediaRtmp:-10935}:${MediaRtmp:-10935}/tcp" # [收流]RTMP + - "${MediaRtmp:-10935}:${MediaRtmp:-10935}/udp" # [收流]RTMP + #- "41935:41935/tcp" # [收流]RTMPS 无效 + - "${MediaRtsp:-5540}:${MediaRtsp:-5540}/tcp" # [收流]RTSP + - "${MediaRtsp:-5540}:${MediaRtsp:-5540}/udp" # [收流]RTSP + #- "45540:45540/tcp" # [收流]RTSPS 无效 + - "${MediaRtp:-10000}:${MediaRtp:-10000}/tcp" # [收流]RTP + - "${MediaRtp:-10000}:${MediaRtp:-10000}/udp" # [收流]RTP + volumes: + - ./volumes/video:/opt/media/bin/www/record/ + - ./logs/media:/opt/media/log/ + - ./media/config.ini:/conf/config.ini + command: [ + 'MediaServer', + '-c', '/conf/config.ini', + '-l', '0' + ] + + polaris-wvp: + # 显式指定构建上下文和Dockerfile路径 + build: + context: .. # 构建上下文的根路径 + dockerfile: ./docker/wvp/Dockerfile # 相对于上下文路径的Dockerfile位置 + restart: always + networks: + - media-net + ports: + - "18978:18978" + - "${SIP_Port:-8116}:${SIP_Port:-8116}/udp" + - "${SIP_Port:-8116}:${SIP_Port:-8116}/tcp" + depends_on: + - polaris-redis + - polaris-mysql + - polaris-media + volumes: + - ./wvp/wvp/:/opt/ylcx/wvp/ + - ./logs/wvp:/opt/wvp/logs/ + environment: + TZ: "Asia/Shanghai" + # 流链接的IP + Stream_IP: ${Stream_IP} + # SDP里的IP + SDP_IP: ${SDP_IP} + # [可选] zlm服务器访问WVP所使用的IP, 默认使用127.0.0.1,zlm和wvp没有部署在同一台服务器时必须配置 + ZLM_HOOK_HOST: polaris-wvp + ZLM_HOST: polaris-media + ZLM_SERCERT: su6TiedN2rVAmBbIDX0aa0QTiBJLBdcf + + MediaHttp: ${WebHttp:-8080} + #MediaHttps: ${WebHttps:-8081} + MediaRtmp: ${MediaRtmp:-10935} + MediaRtsp: ${MediaRtsp:-5540} + MediaRtp: ${MediaRtp:-10000} + + REDIS_HOST: polaris-redis + REDIS_PORT: 6379 + + DATABASE_HOST: polaris-mysql + DATABASE_PORT: 3306 + DATABASE_USER: wvp_user + DATABASE_PASSWORD: wvp_password + + SIP_ShowIP: ${SIP_ShowIP} + SIP_Port: ${SIP_Port:-8116} + SIP_Domain: ${SIP_Domain} + SIP_Id: ${SIP_Id} + SIP_Password: ${SIP_Password} + + RecordSip: ${RecordSip} + RecordPushLive: ${RecordPushLive} + + polaris-nginx: + # 显式指定构建上下文和Dockerfile路径 + build: + context: .. # 构建上下文的根路径 + dockerfile: ./docker/nginx/Dockerfile # 相对于上下文路径的Dockerfile位置 + ports: + - "${WebHttp:-8080}:8080" + depends_on: + - polaris-wvp + volumes: + - ./nginx/templates/:/etc/nginx/templates + - ./logs/nginx:/var/log/nginx + environment: + # 流链接的IP + Stream_IP: ${Stream_IP} + networks: + - media-net + +networks: + media-net: + driver: bridge \ No newline at end of file diff --git a/snap/34020000001320000002_34020000001320000002.jpg b/snap/34020000001320000002_34020000001320000002.jpg new file mode 100644 index 0000000..6b06f39 Binary files /dev/null and b/snap/34020000001320000002_34020000001320000002.jpg differ diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlayController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlayController.java index 4eb6821..268c0ea 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlayController.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlayController.java @@ -94,8 +94,7 @@ public class PlayController { Assert.notNull(channel, "通道不存在"); DeferredResult> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue()); - - result.onTimeout(()->{ + result.onTimeout(()->{ log.info("[点播等待超时] deviceId:{}, channelId:{}, ", deviceId, channelId); // 释放rtpserver WVPResult wvpResult = new WVPResult<>(); diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java index 16c0071..0b3df9a 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java @@ -73,18 +73,18 @@ public class ZLMHttpHookListener { */ @ResponseBody @PostMapping(value = "/on_play", produces = "application/json;charset=UTF-8") - public HookResult onPlay(@RequestBody OnPlayHookParam param) { - - Map paramMap = MediaServerUtils.urlParamToMap(param.getParams()); - // 对于播放流进行鉴权 - boolean authenticateResult = mediaService.authenticatePlay(param.getApp(), param.getStream(), paramMap.get("callId")); - if (!authenticateResult) { - log.info("[ZLM HOOK] 播放鉴权 失败:{}->{}", param.getMediaServerId(), param); - return new HookResult(401, "Unauthorized"); - } - if (log.isDebugEnabled()){ - log.debug("[ZLM HOOK] 播放鉴权成功:{}->{}", param.getMediaServerId(), param); - } + public HookResult onPlay(HttpServletRequest request, @RequestBody OnPlayHookParam param) { + System.out.println(request); + // Map paramMap = MediaServerUtils.urlParamToMap(param.getParams()); + // // 对于播放流进行鉴权 + // boolean authenticateResult = mediaService.authenticatePlay(param.getApp(), param.getStream(), paramMap.get("callId")); + // if (!authenticateResult) { + // log.info("[ZLM HOOK] 播放鉴权 失败:{}->{}", param.getMediaServerId(), param); + // return new HookResult(401, "Unauthorized"); + // } + // if (log.isDebugEnabled()){ + // log.debug("[ZLM HOOK] 播放鉴权成功:{}->{}", param.getMediaServerId(), param); + // } return HookResult.SUCCESS(); } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 07c8095..c9189aa 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -63,13 +63,18 @@ sip: #zlm 默认服务器配置 media: + auto-config: false id: zlmediakit-local # [必须修改] zlm服务器的内网IP +# ip: 192.168.0.48 ip: 192.168.0.66 # [必须修改] zlm服务器的http.port http-port: 85 # [必选选] zlm服务器的hook.admin_params=secret - secret: +# http-port: 88 +# secret: 123456 + secret: TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj +# secret: sH1rr7GBl4a6eMjEAl8VM2hqj7Nr4E2H # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试 rtp: # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输 diff --git a/src/main/resources/application-docker.yml b/src/main/resources/application-docker.yml index 17859a3..d7de97f 100644 --- a/src/main/resources/application-docker.yml +++ b/src/main/resources/application-docker.yml @@ -57,7 +57,8 @@ media: # [必须修改] zlm服务器的http.port http-port: ${ZLM_PORT:80} # [可选] zlm服务器的hook.admin_params=secret - secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc + secret: ${ZLM_SECRET:035c73f7-bb6b-4889-a715-d9eb2d1925cc} +# secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试 rtp: # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输