Monica视频监控处理程序
xc
2021-02-08 535b780ad4330fca11e08f41728ca5f2f3fc4bce
Monica测试用例
7 files modified
378 ■■■■■ changed files
README.md 68 ●●●●● patch | view | raw | blame | history
src/main/java/com/hbbh/adapter/config/Swagger2Conf.java 6 ●●●● patch | view | raw | blame | history
src/main/java/com/hbbh/adapter/controller/MonibucaController.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/hbbh/adapter/controller/api/MonibucaAPI.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/hbbh/adapter/manager/MonibucaManager.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/hbbh/adapter/manager/impl/MonibucaManagerImpl.java 6 ●●●● patch | view | raw | blame | history
src/main/resources/public/index.html 290 ●●●● patch | view | raw | blame | history
README.md
@@ -1,77 +1,21 @@
# golden实时数据库适配程序
# Monibuca监控处理程序
**同步获取golden实时数据库的程序,技术选型:Springboot+JPA**
**暂时不要使用,半成品**
**通过使用http的方式调用Monica实例,处理视频流**
## V1.0
#### 准备工作
- 运行Monica实例机器IP
#### 已有功能
- 同步所有表与标签信息的数据结构
- 针对SMS,ktnz2c_plc,dlz_plc,djw_plc,bds_plc进行基本数据同步,每三十秒同步更新一次
- 将rtsp流转换成 HLS,WebRTC,FLV.js,Jessibuca 并进行H5播放
#### 目前还存在的已知一些问题
- 持久层操作冗余
- 同步操作时间过长,需要优化
- 介入数据只是基本数据,针对详细数据未完全介入进来
#### 环境介绍
- golden数据库服务器 来自:47.92.145.232机器上
- 同步环境 :开发环境MariaDB  的库名为:localgd上
#### 标签点完整数据结构 (示例):
```json
{
    "basePoint": {
        "alarmindex": 0,
        "archive": true,
        "calcindex": 917504,
        "changedate": 1575520921000,
        "changer": "sa",
        "classof": "RTDB_CALC",
        "compdev": 1.0,
        "compdevpercent": 0.009999999776482582,
        "compress": true,
        "comptimemax": 28800,
        "comptimemin": 0,
        "createdate": 1574164482000,
        "creator": "sa",
        "desc": "1号空压机故障指示",
        "digits": -5,
        "excdev": 0.5,
        "excdevpercent": 0.004999999888241291,
        "exctimemax": 600,
        "exctimemin": 0,
        "highlimit": 100.0,
        "id": 9838,
        "lowlimit": 0.0,
        "microsecond": false,
        "mirror": false,
        "padding": "AAAAAAA=",
        "scanindex": 0,
        "shutdown": false,
        "step": false,
        "summary": false,
        "table": 11,
        "table_dot_tag": "SMS.SMS01_1号空压机故障指示",
        "tag": "SMS01_1号空压机故障指示",
        "type": "RTDB_BOOL",
        "typical": 50.0,
        "unit": ""
    },
    "calcPoint": {
        "equation": "if('DLZ_PLC.1号空压机故障指示'==1,1,0)",
        "id": 9838,
        "period": 65536,
        "timecopy": "RTDB_CALC_TIME"
    },
    "error": 0
}
```
#### 项目部署可能会涉及到Linux命令
src/main/java/com/hbbh/adapter/config/Swagger2Conf.java
@@ -12,8 +12,8 @@
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
//@Configuration
//@EnableSwagger2
public class Swagger2Conf extends WebMvcConfigurationSupport {
    @Bean
@@ -41,7 +41,7 @@
        registry.addResourceHandler("/**").addResourceLocations(
                "classpath:/static/");
        registry.addResourceHandler("swagger-ui.html").addResourceLocations(
                "classpath:/META-INF/resources/");
                "classpath:/META-INF/resources/public/");
        registry.addResourceHandler("/webjars/**").addResourceLocations(
                "classpath:/META-INF/resources/webjars/");
        super.addResourceHandlers(registry);
src/main/java/com/hbbh/adapter/controller/MonibucaController.java
@@ -27,9 +27,9 @@
    @Override
    @RequestMapping(value = "/test/video", method = RequestMethod.GET)
    @ApiOperation("test")
    public CallResult<String> parseVideoRTSP() {
    public String parseVideoRTSP() {
        try {
            CallResult<String> result = monibucaManager.parseVideo();
            String result = monibucaManager.parseVideo();
            return result;
        } catch (Exception e) {
            log.error("接口:com.hbbh.adapter.controller.api.MonibucaAPIController.parseVideoRTSP 调用失败");
src/main/java/com/hbbh/adapter/controller/api/MonibucaAPI.java
@@ -12,7 +12,7 @@
     * @return
     *  -1  解析失败
     */
    public CallResult<String> parseVideoRTSP();
    public String parseVideoRTSP();
    /**
     * @param param streamPath地址
src/main/java/com/hbbh/adapter/manager/MonibucaManager.java
@@ -20,5 +20,5 @@
     *  .flv 视频流格式
     *
     */
    CallResult<String> parseVideo();
    String parseVideo();
}
src/main/java/com/hbbh/adapter/manager/impl/MonibucaManagerImpl.java
@@ -33,7 +33,7 @@
     * @return jessibucaDemo
     */
    @Override
    public CallResult<String> parseVideo() {
    public String parseVideo() {
        String url="http://localhost:8081/rtsp/pull";
        Map<String, String> params = Maps.newLinkedHashMap();
        params.put("target",rtspDemo);
@@ -46,8 +46,8 @@
        String code = map.get("code")+"";
        String msg = map.get("msg")+"";
        if (!StringUtils.equals("0",code)){
            CallResult.success(msg,"-1");
            return "-1";
        }
        return CallResult.success(jessibucaDemo);
        return jessibucaDemo;
    }
}
src/main/resources/public/index.html
@@ -2,9 +2,9 @@
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Jessibuca 1.0</title>
    <meta charset="utf-8" />
    <meta charset="utf-8"/>
    <style>
        .btn {
            display: inline-block;
@@ -74,168 +74,176 @@
</head>
<body>
    <div class="player-wrapper" id="container" style="background-color: #0D0E1B;width:900px;height:500px">
<div class="player-wrapper" id="container" style="background-color: #0D0E1B;width:900px;height:500px">
</div>
<div class="btn-wrapper" id="playDom">
    <button class="btn" id="play">播放</button>
</div>
<div class="btn-wrapper btn-wrapper2" id="stopDom" style="display: none">
    <div style="margin-top: 5px">
        <button class="btn btn-danger" id="stop">结束</button>
    </div>
    <div class="btn-wrapper" id="playDom">
        <button class="btn" id="play">播放</button>
    </div>
    <div class="btn-wrapper btn-wrapper2" id="stopDom" style="display: none">
        <div style="margin-top: 5px">
            <button class="btn btn-danger" id="stop">结束</button>
        </div>
    </div>
    <button class="btn" onclick="h5lc.fullscreen=true">全屏</button>
    <div id="logout" class="logs">
    </div>
</div>
<button class="btn" onclick="h5lc.fullscreen=true">全屏</button>
<div id="logout" class="logs">
</div>
    <script src="./ajax.js"></script>
    <script src="./renderer.js"></script>
    <script>
        onerror = handleErr;
        var txt = "";
        window.onkeydown = function () {
            h5lc.fullscreen = false
        }
        var $play = document.getElementById('play');
        var $stop = document.getElementById('stop');
        var $playDom = document.getElementById('playDom');
        var $stopDom = document.getElementById('stopDom');
        var container = document.getElementById("container");
        var isPlaying = false;
        disabledMouseWheel(container);
        let stream = queryParam('stream') || 'user1';
        let decoder = queryParam('decoder') || 'ff';
        let source = queryParam('source') || 'localhost';
        var h5lc = new Jessibuca({ container, decoder: decoder + ".js", videoBuffer: 0 });
<script src="./ajax.js"></script>
<script src="./renderer.js"></script>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
        h5lc.onLoad = function () {
            //this.play("wss://pulls.1234326.cn/live/L01.flv")
            //this.play("ws://localhost:8080/live/test.flv")
            //this.play("ws://" + source + ":8080/live/" + stream)
            //this.play("ws://pull3.afb1188.com/live/" + stream + ".flv")
            //this.play("ws://pull2.afb1188.com/live/" + stream + ".flv")
<script>
    onerror = handleErr;
    var txt = "";
    window.onkeydown = function () {
        h5lc.fullscreen = false
    }
    var $play = document.getElementById('play');
    var $stop = document.getElementById('stop');
    var $playDom = document.getElementById('playDom');
    var $stopDom = document.getElementById('stopDom');
    var container = document.getElementById("container");
    var isPlaying = false;
    disabledMouseWheel(container);
    let stream = queryParam('stream') || 'user1';
    let decoder = queryParam('decoder') || 'ff';
    let source = queryParam('source') || 'localhost';
    var h5lc = new Jessibuca({container, decoder: decoder + ".js", videoBuffer: 0});
    h5lc.onLoad = function () {
        //this.play("wss://pulls.1234326.cn/live/L01.flv")
        //this.play("ws://localhost:8080/live/test.flv")
        //this.play("ws://" + source + ":8080/live/" + stream)
        //this.play("ws://pull3.afb1188.com/live/" + stream + ".flv")
        //this.play("ws://pull2.afb1188.com/live/" + stream + ".flv")
    }
    h5lc.onPlay = function () {
        isPlaying = true;
        $playDom.style.display = 'none';
        $stopDom.style.display = 'block';
    }
    $play.addEventListener('click', function () {
        if (isPlaying) {
            return;
        }
        h5lc.onPlay = function () {
            isPlaying = true;
            $playDom.style.display = 'none';
            $stopDom.style.display = 'block';
        }
        $play.addEventListener('click', function () {
            if (isPlaying) {
                return;
        isPlaying = true;
        $.get("http://127.0.0.1:8088/monica/test/video", function (data) {
                h5lc.play(data)
            }
            isPlaying = true;
            play();
            $playDom.style.display = 'none';
            $stopDom.style.display = 'block';
        }, false);
        );
        //play();
        $playDom.style.display = 'none';
        $stopDom.style.display = 'block';
    }, false);
        $stop.addEventListener('click', function () {
            if (!isPlaying) {
                return;
            }
            isPlaying = false;
            stop();
            $playDom.style.display = 'block';
            $stopDom.style.display = 'none';
        }, false);
        function play(firstResponseIp) {
            //h5lc.play("ws://" + (firstResponseIp || source) + ":8080/live/" + stream)
            //h5lc.play("ws://pull2.afb1188.com/live/" + stream + ".flv")
            //h5lc.play("ws://localhost:8080/live/" + stream)
              h5lc.play("ws://localhost:8080/live/test.flv")
            // h5lc.play("ws://119.9.118.39:8080/live/user1", canvas)
            // h5lc.play("ws://test.qihaipi.com/gnddragon/test.flv", canvas)
            //  h5lc.play("ws://localhost:8080/live/test.flv", canvas)
        }
        function getFastCdnFromList(ipList) {
            ipList = ipList || [];
            var firstResponseIp = '';
            for (var i = 0, len = ipList.length; i < len; i++) {
                var tempIp = ipList[i].name;
                var reqHref = 'http://' + tempIp + '/test';
                var request = _ajax.get(reqHref);
                request.then(function (data) {
                    if (!firstResponseIp) {
                        firstResponseIp = tempIp;
                        // 直接可以播放了。
                        play(firstResponseIp);
                    }
                })
            }
        }
        function stop() {
            h5lc.close()
    $stop.addEventListener('click', function () {
        if (!isPlaying) {
            return;
        }
        function queryParam(name, url) {
            var search = window.location.search;
            var qArr = '';
            var key = {};
        isPlaying = false;
        stop();
            if (url) {
                qArr = url.split("?")[1].split("&")
        $playDom.style.display = 'block';
        $stopDom.style.display = 'none';
    }, false);
            } else {
                if (!window.location.search) {
                    return
    function play(firstResponseIp) {
        //h5lc.play("ws://" + (firstResponseIp || source) + ":8080/live/" + stream)
        //h5lc.play("ws://pull2.afb1188.com/live/" + stream + ".flv")
        //h5lc.play("ws://localhost:8080/live/" + stream)
        h5lc.play("ws://localhost:8080/live/test.flv")
        // h5lc.play("ws://119.9.118.39:8080/live/user1", canvas)
        // h5lc.play("ws://test.qihaipi.com/gnddragon/test.flv", canvas)
        //  h5lc.play("ws://localhost:8080/live/test.flv", canvas)
    }
    function getFastCdnFromList(ipList) {
        ipList = ipList || [];
        var firstResponseIp = '';
        for (var i = 0, len = ipList.length; i < len; i++) {
            var tempIp = ipList[i].name;
            var reqHref = 'http://' + tempIp + '/test';
            var request = _ajax.get(reqHref);
            request.then(function (data) {
                if (!firstResponseIp) {
                    firstResponseIp = tempIp;
                    // 直接可以播放了。
                    play(firstResponseIp);
                }
                qArr = search.substr(1).split("&")
            })
        }
    }
    function stop() {
        h5lc.close()
    }
    function queryParam(name, url) {
        var search = window.location.search;
        var qArr = '';
        var key = {};
        if (url) {
            qArr = url.split("?")[1].split("&")
        } else {
            if (!window.location.search) {
                return
            }
            qArr = search.substr(1).split("&")
        }
            for (var i = 0; i < qArr.length; i++) {
        for (var i = 0; i < qArr.length; i++) {
                var firstPos = qArr[i].indexOf('=');
                key[qArr[i].slice(0, firstPos)] = qArr[i].slice(firstPos + 1)
            }
            var firstPos = qArr[i].indexOf('=');
            key[qArr[i].slice(0, firstPos)] = qArr[i].slice(firstPos + 1)
        }
            if (name) {
        if (name) {
            return key[name]
        } else {
            if (url) {
                return key[name]
            } else {
                if (url) {
                    return key[name]
                } else {
                    return key
                }
                return key
            }
        }
    }
        function disabledMouseWheel(ele) {
            if (ele.addEventListener) {
                ele.addEventListener('DOMMouseScroll', scrollFunc, false);
            } //W3C
            ele.onmousewheel = scrollFunc; //IE/Opera/Chrome
        }
    function disabledMouseWheel(ele) {
        if (ele.addEventListener) {
            ele.addEventListener('DOMMouseScroll', scrollFunc, false);
        } //W3C
        ele.onmousewheel = scrollFunc; //IE/Opera/Chrome
    }
        function scrollFunc(evt) {
            evt = evt || window.event;
            if (evt.preventDefault) {
                // Firefox
                evt.preventDefault();
                evt.stopPropagation();
            } else {
                // IE
                evt.cancelBubble = true;
                evt.returnValue = false;
            }
            return false;
    function scrollFunc(evt) {
        evt = evt || window.event;
        if (evt.preventDefault) {
            // Firefox
            evt.preventDefault();
            evt.stopPropagation();
        } else {
            // IE
            evt.cancelBubble = true;
            evt.returnValue = false;
        }
        return false;
    }
        function handleErr(msg, url, l) {
            txt = "There was an error on this page.\n\n";
            txt += "Error: " + msg + "\n";
            txt += "URL: " + url + "\n";
            txt += "Line: " + l + "\n\n";
            document.getElementById("logout").innerHTML += txt + "<br>";
            return true;
        }
    </script>
    function handleErr(msg, url, l) {
        txt = "There was an error on this page.\n\n";
        txt += "Error: " + msg + "\n";
        txt += "URL: " + url + "\n";
        txt += "Line: " + l + "\n\n";
        document.getElementById("logout").innerHTML += txt + "<br>";
        return true;
    }
</script>
</body>