648540858
2023-11-01 5d3f307b44aa8df32c9d893764fb8525d51eda5c
将录像存储路径迁移至wvp中配置,assist以有在需要视频合成的时候才会用
13个文件已修改
135 ■■■■ 已修改文件
sql/初始化-mysql-2.6.9.sql 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/初始化-postgresql-kingbase-2.6.9.sql 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/更新-mysql-2.6.9.sql 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/更新-postgresql-kingbase-2.6.9.sql 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/conf/CloudRecordTimer.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/CloudRecordServiceMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/all-application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/³õʼ»¯-mysql-2.6.9.sql
@@ -165,7 +165,7 @@
                                  update_time character varying(50),
                                  hook_alive_interval integer,
                                  record_path character varying(255),
                                  record_date integer default 7,
                                  record_day integer default 7,
                                  constraint uk_media_server_unique_ip_http_port unique (ip, http_port)
);
sql/³õʼ»¯-postgresql-kingbase-2.6.9.sql
@@ -165,7 +165,7 @@
                                  update_time character varying(50),
                                  hook_alive_interval integer,
                                  record_path character varying(255),
                                  record_date integer default 7,
                                  record_day integer default 7,
                                  constraint uk_media_server_unique_ip_http_port unique (ip, http_port)
);
sql/¸üÐÂ-mysql-2.6.9.sql
@@ -496,6 +496,6 @@
    add record_path character varying(255);
alter table wvp_media_server
    add record_date integer default 7;
    add record_day integer default 7;
sql/¸üÐÂ-postgresql-kingbase-2.6.9.sql
@@ -496,6 +496,7 @@
    add record_path character varying(255);
alter table wvp_media_server
    add record_date integer default 7;
    add record_day integer default 7;
src/main/java/com/genersoft/iot/vmp/conf/CloudRecordTimer.java
@@ -41,8 +41,8 @@
    /**
     * å®šæ—¶æŸ¥è¯¢å¾…删除的录像文件
     */
//    @Scheduled(fixedRate = 5000) //每五秒执行一次,方便测试
    @Scheduled(cron = "0 0 0 * * ?")   //每天的0点执行
//    @Scheduled(fixedRate = 5000)
    public void execute(){
        logger.info("[录像文件定时清理] å¼€å§‹æ¸…理过期录像文件");
        // èŽ·å–é…ç½®äº†assist的流媒体节点
@@ -54,10 +54,10 @@
        for (MediaServerItem mediaServerItem : mediaServerItemList) {
            Calendar lastCalendar = Calendar.getInstance();
            if (mediaServerItem.getRecordDate() > 0) {
            if (mediaServerItem.getRecordDay() > 0) {
                lastCalendar.setTime(new Date());
                // èŽ·å–ä¿å­˜çš„æœ€åŽæˆªè‡³æ—¥æœŸï¼Œå› ä¸ºæ¯ä¸ªèŠ‚ç‚¹éƒ½æœ‰ä¸€ä¸ªæ—¥æœŸï¼Œä¹Ÿå°±æ˜¯æ”¯æŒæ¯ä¸ªèŠ‚ç‚¹è®¾ç½®ä¸åŒçš„ä¿å­˜æ—¥æœŸï¼Œ
                lastCalendar.add(Calendar.DAY_OF_MONTH, -mediaServerItem.getRecordDate());
                lastCalendar.add(Calendar.DAY_OF_MONTH, -mediaServerItem.getRecordDay());
                Long lastDate = lastCalendar.getTimeInMillis();
                // èŽ·å–åˆ°æˆªè‡³æ—¥æœŸä¹‹å‰çš„å½•åƒæ–‡ä»¶åˆ—è¡¨ï¼Œæ–‡ä»¶åˆ—è¡¨æ»¡è¶³æœªè¢«æ”¶è—å’Œä¿æŒçš„ã€‚è¿™ä¸¤ä¸ªå­—æ®µç›®å‰å…±èƒ½ä¸€è‡´ï¼Œ
@@ -66,22 +66,16 @@
                if (cloudRecordItemList.isEmpty()) {
                    continue;
                }
                List<Integer> cloudRecordItemIdList = new ArrayList<>();
                for (CloudRecordItem cloudRecordItem : cloudRecordItemList) {
                    String date = new File(cloudRecordItem.getFilePath()).getParentFile().getName();
                    JSONObject jsonObject = zlmresTfulUtils.deleteRecordDirectory(mediaServerItem, cloudRecordItem.getApp(),
                            cloudRecordItem.getStream(), date, cloudRecordItem.getFileName());
                    if (jsonObject.getInteger("code") == 0) {
                        cloudRecordItemIdList.add(cloudRecordItem.getId());
                    }else {
                        logger.warn("[录像文件定时清理] åˆ é™¤ç£ç›˜æ–‡ä»¶é”™è¯¯ï¼š {}", jsonObject);
                        logger.warn("[录像文件定时清理] åˆ é™¤ç£ç›˜æ–‡ä»¶é”™è¯¯ï¼š {}:{}", cloudRecordItem.getFilePath(), jsonObject);
                    }
                }
                if (cloudRecordItemIdList.isEmpty()) {
                    continue;
                }
                cloudRecordServiceMapper.deleteList(cloudRecordItemIdList, mediaServerItem.getId());
                result += cloudRecordItemIdList.size();
                result += cloudRecordServiceMapper.deleteList(cloudRecordItemList);
            }
        }
        logger.info("[录像文件定时清理] å…±æ¸…理{}个过期录像文件", result);
src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java
@@ -81,6 +81,12 @@
    @Value("${media.record-assist-port:0}")
    private Integer recordAssistPort = 0;
    @Value("${media.record-date:7}")
    private Integer recordDay = 7;
    @Value("${media.record-path}")
    private String recordPath;
    public String getId() {
        return id;
    }
@@ -212,13 +218,32 @@
        mediaServerItem.setSendRtpPortRange(rtpSendPortRange);
        mediaServerItem.setRecordAssistPort(recordAssistPort);
        mediaServerItem.setHookAliveInterval(30.00f);
        mediaServerItem.setRecordDay(recordDay);
        if (recordPath != null) {
            mediaServerItem.setRecordPath(recordPath);
        }
        mediaServerItem.setCreateTime(DateUtil.getNow());
        mediaServerItem.setUpdateTime(DateUtil.getNow());
        return mediaServerItem;
    }
    public Integer getRecordDay() {
        return recordDay;
    }
    public void setRecordDay(Integer recordDay) {
        this.recordDay = recordDay;
    }
    public String getRecordPath() {
        return recordPath;
    }
    public void setRecordPath(String recordPath) {
        this.recordPath = recordPath;
    }
    public String getRtpSendPortRange() {
        return rtpSendPortRange;
    }
src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
@@ -56,8 +56,6 @@
    private String serverId = "000000";
    private String recordPath = null;
    private String thirdPartyGBIdReg = "[\\s\\S]*";
    private String civilCodeFile = "classpath:civilCode.csv";
@@ -250,14 +248,6 @@
    public void setRefuseChannelStatusChannelFormNotify(Boolean refuseChannelStatusChannelFormNotify) {
        this.refuseChannelStatusChannelFormNotify = refuseChannelStatusChannelFormNotify;
    }
    public String getRecordPath() {
        return recordPath;
    }
    public void setRecordPath(String recordPath) {
        this.recordPath = recordPath;
    }
    public int getMaxNotifyCountQueue() {
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -295,24 +295,6 @@
                result.setEnable_mp4(true);
            }
        }
        if (mediaInfo.getRecordAssistPort() > 0 && userSetting.getRecordPath() == null) {
            logger.info("推流时发现尚未设置录像路径,从assist服务中读取");
            JSONObject info = assistRESTfulUtils.getInfo(mediaInfo, null);
            if (info != null && info.getInteger("code") != null && info.getInteger("code") == 0 ) {
                JSONObject dataJson = info.getJSONObject("data");
                if (dataJson != null) {
                    String recordPath = dataJson.getString("record");
                    userSetting.setRecordPath(recordPath);
                    result.setMp4_save_path(recordPath);
                    // ä¿®æ”¹zlm中的录像路径
                    if (mediaInfo.isAutoConfig()) {
                        taskExecutor.execute(() -> {
                            mediaServerService.setZLMConfig(mediaInfo, false);
                        });
                    }
                }
            }
        }
        if (param.getApp().equalsIgnoreCase("rtp")) {
            String receiveKey = VideoManagerConstants.WVP_OTHER_RECEIVE_RTP_INFO + userSetting.getServerId() + "_" + param.getStream();
            OtherRtpSendInfo otherRtpSendInfo = (OtherRtpSendInfo)redisTemplate.opsForValue().get(receiveKey);
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java
@@ -81,7 +81,10 @@
    private boolean defaultServer;
    @Schema(description = "录像存储时长")
    private int recordDate;
    private int recordDay;
    @Schema(description = "录像存储路径")
    private String recordPath;
    public MediaServerItem() {
    }
@@ -300,11 +303,19 @@
        this.sendRtpPortRange = sendRtpPortRange;
    }
    public int getRecordDate() {
        return recordDate;
    public int getRecordDay() {
        return recordDay;
    }
    public void setRecordDate(int recordDate) {
        this.recordDate = recordDate;
    public void setRecordDay(int recordDay) {
        this.recordDay = recordDay;
    }
    public String getRecordPath() {
        return recordPath;
    }
    public void setRecordPath(String recordPath) {
        this.recordPath = recordPath;
    }
}
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -419,17 +419,6 @@
        if (serverItem.isAutoConfig()) {
            // æŸ¥çœ‹assist服务的录像路径配置
            if (serverItem.getRecordAssistPort() > 0 && userSetting.getRecordPath() == null) {
                JSONObject info = assistRESTfulUtils.getInfo(serverItem, null);
                if (info != null && info.getInteger("code") != null && info.getInteger("code") == 0 ) {
                    JSONObject dataJson = info.getJSONObject("data");
                    if (dataJson != null) {
                        String recordPath = dataJson.getString("record");
                        userSetting.setRecordPath(recordPath);
                    }
                }
            }
            setZLMConfig(serverItem, "0".equals(zlmServerConfig.getHookEnable()));
        }
        final String zlmKeepaliveKey = zlmKeepaliveKeyPrefix + serverItem.getId();
@@ -606,10 +595,9 @@
            param.put("rtp_proxy.port_range", mediaServerItem.getRtpPortRange().replace(",", "-"));
        }
        if (userSetting.getRecordPath() != null) {
            File recordPathFile = new File(userSetting.getRecordPath());
            File mp4SavePathFile = recordPathFile.getParentFile().getAbsoluteFile();
            param.put("protocol.mp4_save_path", mp4SavePathFile.getAbsoluteFile());
        if (mediaServerItem.getRecordPath() != null) {
            File recordPathFile = new File(mediaServerItem.getRecordPath());
            param.put("protocol.mp4_save_path", recordPathFile.getParentFile().getPath());
            param.put("record.appName", recordPathFile.getName());
        }
src/main/java/com/genersoft/iot/vmp/storager/dao/CloudRecordServiceMapper.java
@@ -102,8 +102,8 @@
    @Delete(" <script>" +
            "delete from wvp_cloud_record where media_server_id=#{mediaServerId} and id in " +
            " <foreach collection='cloudRecordItemIdList'  item='item'  open='(' separator=',' close=')' > #{item}</foreach>" +
            " <foreach collection='cloudRecordItemIdList'  item='item'  open='(' separator=',' close=')' > #{item.id}</foreach>" +
            " </script>")
    int deleteList(List<Integer> cloudRecordItemIdList, @Param("mediaServerId") String mediaServerId);
    int deleteList(List<CloudRecordItem> cloudRecordItemIdList);
}
src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java
@@ -31,6 +31,8 @@
            "rtp_port_range,"+
            "send_rtp_port_range,"+
            "record_assist_port,"+
            "record_day,"+
            "record_path,"+
            "default_server,"+
            "create_time,"+
            "update_time,"+
@@ -55,6 +57,8 @@
            "#{rtpPortRange}, " +
            "#{sendRtpPortRange}, " +
            "#{recordAssistPort}, " +
            "#{recordDay}, " +
            "#{recordPath}, " +
            "#{defaultServer}, " +
            "#{createTime}, " +
            "#{updateTime}, " +
@@ -82,6 +86,8 @@
            "<if test=\"secret != null\">, secret=#{secret}</if>" +
            "<if test=\"recordAssistPort != null\">, record_assist_port=#{recordAssistPort}</if>" +
            "<if test=\"hookAliveInterval != null\">, hook_alive_interval=#{hookAliveInterval}</if>" +
            "<if test=\"recordDay != null\">, record_day=#{recordDay}</if>" +
            "<if test=\"recordPath != null\">, record_path=#{recordPath}</if>" +
            "WHERE id=#{id}"+
            " </script>"})
    int update(MediaServerItem mediaServerItem);
@@ -105,6 +111,8 @@
            "<if test=\"sendRtpPortRange != null\">, send_rtp_port_range=#{sendRtpPortRange}</if>" +
            "<if test=\"secret != null\">, secret=#{secret}</if>" +
            "<if test=\"recordAssistPort != null\">, record_assist_port=#{recordAssistPort}</if>" +
            "<if test=\"recordDay != null\">, record_day=#{recordDay}</if>" +
            "<if test=\"recordPath != null\">, record_path=#{recordPath}</if>" +
            "<if test=\"hookAliveInterval != null\">, hook_alive_interval=#{hookAliveInterval}</if>" +
            "WHERE ip=#{ip} and http_port=#{httpPort}"+
            " </script>"})
src/main/resources/all-application.yml
@@ -139,6 +139,10 @@
    auto-config: true
    # [可选] zlm服务器的hook.admin_params=secret
    secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc
    # å½•像路径
    record-path: ./www/record
    # å½•像保存时长
    record-date: 7
    # å¯ç”¨å¤šç«¯å£æ¨¡å¼, å¤šç«¯å£æ¨¡å¼ä½¿ç”¨ç«¯å£åŒºåˆ†æ¯è·¯æµï¼Œå…¼å®¹æ€§æ›´å¥½ã€‚ å•端口使用流的ssrc区分, ç‚¹æ’­è¶…时建议使用多端口测试
    rtp:
        # [可选] æ˜¯å¦å¯ç”¨å¤šç«¯å£æ¨¡å¼, å¼€å¯åŽä¼šåœ¨portRange范围内选择端口用于媒体流传输