648540858
2023-10-12 298a9f4280458062ed0fc32084d5bcce8bbf196c
开始重构云端录像
5个文件已修改
3个文件已添加
374 ■■■■■ 已修改文件
sql/2.6.9更新.sql 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/初始化.sql 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnRecordMp4HookParam.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/ICloudRecordService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/bean/CloudRecordItem.java 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/2.6.9¸üÐÂ.sql
@@ -6,3 +6,19 @@
alter table wvp_stream_proxy
    add stream_key varying(255)
create table wvp_cloud_record (
                                 id serial primary key,
                                 app character varying(255),
                                 stream character varying(255),
                                 call_id character varying(255),
                                 start_time integer,
                                 end_time integer,
                                 media_server_id character varying(50),
                                 file_name character varying(50),
                                 folder character varying(50),
                                 file_path character varying(255),
                                 file_size integer,
                                 time_len integer,
                                 constraint uk_stream_push_app_stream_path unique (app, stream, file_path)
);
sql/³õʼ»¯.sql
@@ -266,6 +266,21 @@
                                 self bool default false,
                                 constraint uk_stream_push_app_stream unique (app, stream)
);
create table wvp_cloud_record (
                                        id serial primary key,
                                        app character varying(255),
                                        stream character varying(255),
                                        call_id character varying(255),
                                        start_time integer,
                                        end_time integer,
                                        mediaServerId character varying(50),
                                        file_name character varying(50),
                                        folder character varying(50),
                                        file_path character varying(255),
                                        file_size integer,
                                        time_len integer,
                                        constraint uk_stream_push_app_stream_path unique (app, stream, file_path)
);
create table wvp_user (
                          id serial primary key,
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -766,6 +766,21 @@
        return HookResult.SUCCESS();
    }
    /**
     * å½•像完成事件
     */
    @ResponseBody
    @PostMapping(value = "/on_record_mp4", produces = "application/json;charset=UTF-8")
    public HookResult onRecordMp4(HttpServletRequest request, @RequestBody OnRecordMp4HookParam param) {
        logger.info("[ZLM HOOK] å½•像完成事件:{}->{}", param.getMediaServerId(), param.getFile_path());
        taskExecutor.execute(() -> {
        });
        return HookResult.SUCCESS();
    }
    private Map<String, String> urlParamToMap(String params) {
        HashMap<String, String> map = new HashMap<>();
        if (ObjectUtils.isEmpty(params)) {
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnRecordMp4HookParam.java
New file
@@ -0,0 +1,114 @@
package com.genersoft.iot.vmp.media.zlm.dto.hook;
/**
 * zlm hook事件中的on_rtp_server_timeout事件的参数
 * @author lin
 */
public class OnRecordMp4HookParam extends HookParam{
    private String app;
    private String stream;
    private String file_name;
    private String file_path;
    private String file_size;
    private String folder;
    private String url;
    private String vhost;
    private long start_time;
    private long time_len;
    public String getApp() {
        return app;
    }
    public void setApp(String app) {
        this.app = app;
    }
    public String getStream() {
        return stream;
    }
    public void setStream(String stream) {
        this.stream = stream;
    }
    public String getFile_name() {
        return file_name;
    }
    public void setFile_name(String file_name) {
        this.file_name = file_name;
    }
    public String getFile_path() {
        return file_path;
    }
    public void setFile_path(String file_path) {
        this.file_path = file_path;
    }
    public String getFile_size() {
        return file_size;
    }
    public void setFile_size(String file_size) {
        this.file_size = file_size;
    }
    public String getFolder() {
        return folder;
    }
    public void setFolder(String folder) {
        this.folder = folder;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getVhost() {
        return vhost;
    }
    public void setVhost(String vhost) {
        this.vhost = vhost;
    }
    public long getStart_time() {
        return start_time;
    }
    public void setStart_time(long start_time) {
        this.start_time = start_time;
    }
    public long getTime_len() {
        return time_len;
    }
    public void setTime_len(long time_len) {
        this.time_len = time_len;
    }
    @Override
    public String toString() {
        return "OnRecordMp4HookParam{" +
                "app='" + app + '\'' +
                ", stream='" + stream + '\'' +
                ", file_name='" + file_name + '\'' +
                ", file_path='" + file_path + '\'' +
                ", file_size='" + file_size + '\'' +
                ", folder='" + folder + '\'' +
                ", url='" + url + '\'' +
                ", vhost='" + vhost + '\'' +
                ", start_time=" + start_time +
                ", time_len=" + time_len +
                '}';
    }
}
src/main/java/com/genersoft/iot/vmp/service/ICloudRecordService.java
New file
@@ -0,0 +1,27 @@
package com.genersoft.iot.vmp.service;
import com.genersoft.iot.vmp.service.bean.CloudRecordItem;
import com.github.pagehelper.PageInfo;
import java.util.List;
/**
 * äº‘端录像管理
 * @author lin
 */
public interface ICloudRecordService {
    /**
     * åˆ†é¡µå›žåŽ»äº‘ç«¯å½•åƒåˆ—è¡¨
     */
    PageInfo<CloudRecordItem> getList(int page, int count, String startTime, String endTime);
    /**
     * èŽ·å–æ‰€æœ‰çš„æ—¥æœŸ
     */
    List<String> getDateList(Integer year, Integer month, String app, String stream);
}
src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
@@ -114,4 +114,5 @@
     * @return
     */
    ResourceBaseInfo getOverview();
}
src/main/java/com/genersoft/iot/vmp/service/bean/CloudRecordItem.java
New file
@@ -0,0 +1,175 @@
package com.genersoft.iot.vmp.service.bean;
/**
 * äº‘端录像数据
 */
public class CloudRecordItem {
    /**
     * ä¸»é”®
     */
    private int id;
    /**
     * åº”用名
     */
    private String app;
    /**
     * æµ
     */
    private String stream;
    /**
     * å¥å…¨ID
     */
    private String callId;
    /**
     * å¼€å§‹æ—¶é—´
     */
    private long startTime;
    /**
     * ç»“束时间
     */
    private long endTime;
    /**
     * ZLM Id
     */
    private String mediaServerId;
    /**
     * æ–‡ä»¶åç§°
     */
    private String fileName;
    /**
     * æ–‡ä»¶è·¯å¾„
     */
    private String filePath;
    /**
     * æ–‡ä»¶å¤¹
     */
    private String folder;
    /**
     * æ”¶è—ç±»åž‹ï¼Œæ”¶è—çš„æ–‡ä»¶ä¸ç§»é™¤
     */
    private String collectType;
    /**
     * æ–‡ä»¶å¤§å°
     */
    private long fileSize;
    /**
     * æ–‡ä»¶æ—¶é•¿
     */
    private long timeLen;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getApp() {
        return app;
    }
    public void setApp(String app) {
        this.app = app;
    }
    public String getStream() {
        return stream;
    }
    public void setStream(String stream) {
        this.stream = stream;
    }
    public String getCallId() {
        return callId;
    }
    public void setCallId(String callId) {
        this.callId = callId;
    }
    public long getStartTime() {
        return startTime;
    }
    public void setStartTime(long startTime) {
        this.startTime = startTime;
    }
    public long getEndTime() {
        return endTime;
    }
    public void setEndTime(long endTime) {
        this.endTime = endTime;
    }
    public String getMediaServerId() {
        return mediaServerId;
    }
    public void setMediaServerId(String mediaServerId) {
        this.mediaServerId = mediaServerId;
    }
    public String getFileName() {
        return fileName;
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    public String getFilePath() {
        return filePath;
    }
    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }
    public String getFolder() {
        return folder;
    }
    public void setFolder(String folder) {
        this.folder = folder;
    }
    public long getFileSize() {
        return fileSize;
    }
    public void setFileSize(long fileSize) {
        this.fileSize = fileSize;
    }
    public long getTimeLen() {
        return timeLen;
    }
    public void setTimeLen(long timeLen) {
        this.timeLen = timeLen;
    }
    public String getCollectType() {
        return collectType;
    }
    public void setCollectType(String collectType) {
        this.collectType = collectType;
    }
}
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -587,11 +587,12 @@
        param.put("hook.on_server_keepalive",String.format("%s/on_server_keepalive", hookPrex));
        param.put("hook.on_send_rtp_stopped",String.format("%s/on_send_rtp_stopped", hookPrex));
        param.put("hook.on_rtp_server_timeout",String.format("%s/on_rtp_server_timeout", hookPrex));
        if (mediaServerItem.getRecordAssistPort() > 0) {
            param.put("hook.on_record_mp4",String.format("http://127.0.0.1:%s/api/record/on_record_mp4", mediaServerItem.getRecordAssistPort()));
        }else {
            param.put("hook.on_record_mp4","");
        }
        param.put("hook.on_record_mp4",String.format("%s/on_record_mp4", hookPrex));
//        if (mediaServerItem.getRecordAssistPort() > 0) {
//            param.put("hook.on_record_mp4",String.format("http://127.0.0.1:%s/api/record/on_record_mp4", mediaServerItem.getRecordAssistPort()));
//        }else {
//            param.put("hook.on_record_mp4","");
//        }
        param.put("hook.timeoutSec","20");
        // æŽ¨æµæ–­å¼€åŽå¯ä»¥åœ¨è¶…时时间内重新连接上继续推流,这样播放器会接着播放。
        // ç½®0关闭此特性(推流断开会导致立即断开播放器)