Skip to content
main.js 10.7 KiB
Newer Older
beilang's avatar
beilang committed
var player;

var loadedDom = false;

beilang's avatar
beilang committed
let asyLock = false;

beilang's avatar
beilang committed
let wsUrl = 'ws://172.100.100.21:32101';

let dom_temp = '<div class="modal fade" id="cameraModal" tabindex="-1" role="dialog" aria-labelledby="cameraModalLabel"\n' +
    '     aria-hidden="true">\n' +
    '    <div class="modal-dialog" role="document">\n' +
    '        <div class="modal-content">\n' +
    '            <div class="title"></div>\n' +
beilang's avatar
beilang committed
    '<div class="tools" style="display: none">\n' +
beilang's avatar
beilang committed
    '        <div class="timeSelect">\n' +
    '            <div class="time-box">\n' +
    '                开始时间: <input type="text" id="startTime" placeholder="请选择开始时间"/>\n' +
    '            </div>\n' +
    '            <div class="time-box">\n' +
    '                结束时间: <input type="text" id="endTime" placeholder="请选择结束时间"/>\n' +
    '            </div>\n' +
beilang's avatar
beilang committed
    '            <button type="button" class="btn btn-primary" id="ishf">确定</button>\n' +
    '<button type="button" class="btn btn-primary" style="display: none" id="isLive">实时播放</button>' +
beilang's avatar
beilang committed
    '        </div>\n' +
    '    </div>' +
beilang's avatar
beilang committed
    '            <div class="modal-body">\n' +
    '                <div style="width:15%;">\n' +
    '                    <ul id="videos"></ul>\n' +
    '                </div>\n' +
    '                <div style="flex: 1;" id="cameraVideo">\n' +
    '                    <div id="video" style="height: 550px"></div>\n' +
    '                </div>\n' +
    '            </div>\n' +
    '        </div>\n' +
    '    </div>\n' +
    '</div>';

var VideoPlayer = {
beilang's avatar
beilang committed
    loadIndex: '',
beilang's avatar
beilang committed
    gbid: '',
beilang's avatar
beilang committed
    initDom: function () {
        if (!loadedDom) {
beilang's avatar
beilang committed
            // 加载必须的文件
            let script = document.createElement('script');
            script.src = ctx + '/static/js/bootstrap.min.js';
            $(document).find("body").append(script);

            let css1 = document.createElement('link');
            css1.rel = 'stylesheet';
            css1.href = ctx + '/static/css/bootstrap.min.css'
            $(document).find("body").append(css1);

            let css2 = document.createElement('link');
            css2.rel = 'stylesheet';
            css2.href = ctx + '/static/css/modal.css'
            $(document).find("body").append(css2);

beilang's avatar
beilang committed
            let datetimecss = document.createElement('link');
            datetimecss.rel = 'stylesheet';
            datetimecss.href = ctx + '/static/libs/datetimepicker/css/bootstrap-datetimepicker.min.css'
            $(document).find("body").append(datetimecss);

            let datetimejs = document.createElement('script');
            datetimejs.src = ctx + '/static/libs/datetimepicker/js/bootstrap-datetimepicker.min.js';
            $(document).find("body").append(datetimejs);

            let datetimecnjs = document.createElement('script');
            datetimecnjs.src = ctx + '/static/libs/datetimepicker/js/bootstrap-datetimepicker.zh-CN.js';
            $(document).find("body").append(datetimecnjs);

beilang's avatar
beilang committed
            $(document).find('body').append(dom_temp);
            loadedDom = true;
        }
    },
beilang's avatar
beilang committed
    eventRegister: function () {
        $("#startTime").datetimepicker({
            language: 'zh-CN',
            weekStart: 1,
            todayBtn: 1,
            autoclose: true,
            todayHighlight: 1,
            startView: 2,
            minView: 0,
            maxView: 4,
            forceParse: true,
            format: 'yyyy-mm-dd hh:ii:ss'
        }).on('show', function (event) {
            event.preventDefault();
            event.stopPropagation();
            $('.datetimepicker .prev').html('<')
            $('.datetimepicker .next').html('>')
        })

        $("#endTime").datetimepicker({
            language: 'zh-CN',
            weekStart: 1,
            todayBtn: 1,
            autoclose: true,
            todayHighlight: 1,
            startView: 2,
            minView: 0,
            maxView: 4,
            forceParse: true,
            format: 'yyyy-mm-dd hh:ii:ss'
        }).on('show', function (event) {
            event.preventDefault();
            event.stopPropagation();
            $('.datetimepicker .prev').html('<')
            $('.datetimepicker .next').html('>')
        })

        $(".dropdown-menu").css({'--bs-dropdown-min-width': 0})
    },
beilang's avatar
beilang committed
    initModal: function (data) {
beilang's avatar
beilang committed
        this.gbid = data.curr.gbId;
beilang's avatar
beilang committed
        var $modal = $('#cameraModal');

beilang's avatar
beilang committed
        $('.modal-content .title').html(data.curr.place + '监控点情况 <button type="button" class="btn btn-primary btn-sm" id="payerhf">加载回放</button>');
beilang's avatar
beilang committed
        // 假设每个摄像头的视频源可能不同,可以设置为动态获取

        this.renderList(data.list);

        // 隐藏模态框的关闭按钮和右上角的关闭按钮
        // $modal.find('.close').hide();
        $modal.modal({backdrop: 'static', keyboard: false});

        // 显示模态框
        $modal.modal('show');

        if (!player) {
            this.initPlayer();
        }
        this.play(data.curr.gbId);
beilang's avatar
beilang committed
        asyLock = false;
beilang's avatar
beilang committed
    },
    initPlayer: function () {
        // 初始化播放器
        player = new KMediaUni({
            selector: '#video',
            loading: true,
            showMessage: true,
            request: {
                silentConnection: true,
            },
            control: {
                hideControlsBar: false,
                tools: Object.values(KMediaUni.TOOLS)
                // tools: ['play']
            }
        });
    },
    play: function (gbId) {
        player.loadVideo({
            src: {
                websocketUrl: wsUrl,
                devId: gbId
            },
            transport: KMediaUni.MODE.WEBRTC,
            autoplay: true
        });
    },
    show: function (gbId) {
beilang's avatar
beilang committed
        this.loadIndex = layer.load(1, {
            shade: [0.1,'#fff'] //0.1透明度的白色背景
        });
        if (!gbId) {
            layer.msg('缺少必填参数[gbid]');
            layer.close(this.loadIndex)
            return;
        }
beilang's avatar
beilang committed
        this.gbid = gbId;
beilang's avatar
beilang committed
        $('#isLive').hide();
beilang's avatar
beilang committed
        if (asyLock) {
beilang's avatar
beilang committed
            layer.close(this.loadIndex)
beilang's avatar
beilang committed
            return;
        }
        this.exec('loadVideo');
        asyLock = true;
beilang's avatar
beilang committed
        this.getDeviceInfo(gbId);

    },
    getDeviceInfo: function (gbId) {
        let _this = this;
        $.ajax({
            async: false,
            url: ctx + '/device/getDeviceListByGbId',
            data: {gbId: gbId},
            dataType: 'json',
            success: function (res) {
                if (res.success && res.data && res.data.length > 0) {
                    _this.initDom();
beilang's avatar
beilang committed
                    _this.eventRegister();
beilang's avatar
beilang committed
                    _this.initModal(_this.dataHandle(res, gbId));
beilang's avatar
beilang committed
                    layer.close(_this.loadIndex);
beilang's avatar
beilang committed
                    return;
                }
beilang's avatar
beilang committed
                layer.close(_this.loadIndex);
                layer.msg('未获取到此设备信息');
beilang's avatar
beilang committed
            }
        })
    },
    renderList: function (data) {
        $("#videos").empty();
beilang's avatar
beilang committed
        let _this = this;
beilang's avatar
beilang committed
        let html = '';
beilang's avatar
beilang committed
        let gbIds = '';
beilang's avatar
beilang committed
        $.each(data, function (i, obj) {
beilang's avatar
beilang committed
            gbIds += obj.gbId + ',';
beilang's avatar
beilang committed
            let name = obj.place + (obj.deviceNo ? '-' + obj.deviceNo : '');
            let title = name;
            if (name.length > 6) {
                let splitArray = name.split('-');
                if (splitArray.length === 2) {
                    if (splitArray[0].length <= 4 && splitArray[1].length <=2) {
                        name = splitArray[0] + '-' + splitArray[1];
                    } else {
                        if (splitArray[0].length >= 5) {
                            name = name.substring(0, 5) + '...';
                        } else {
                            name = name.substring(0, 6) + '...';
                        }
                    }
                } else {
                    name = name.substring(0, 5) + '...';
                }
            }
            html += '<li data-gbid="' + obj.gbId + '" title="' + title + '"><img src="'+ctx+'/static/images/sp_icon.png"><span ' + (obj.gbId === _this.gbid ? 'style="color:#00e5ff;"' : '') + '>' + name + '</span></li>';
beilang's avatar
beilang committed
        })
        $("#videos").append(html);
beilang's avatar
beilang committed
        _this.getListStatus(gbIds);
    },
    getListStatus: function (gbIds) {
      $.ajax({
          url: ctx + '/device/getListStatus',
          data: {gbIds: gbIds},
          dataType: 'json',
          success: function (res) {
              if (res.success && res.data) {
                  $("#videos li").each(function (i, ele) {
                      let gbId = $(this).data('gbid');
                      if (res.data[gbId] !== '0') {
                          $(this).find("span").css({'color': 'red'});
                      }
                  })
              }
          }
      })
beilang's avatar
beilang committed
    },
    dataHandle: function (res, gbId) {
        let dataList = res.data;
        let data = {}
        $.each(dataList, function (i, obj) {
            if (obj.gbId === gbId) data.curr = obj;
        })
        data.list = dataList;
        return data;
beilang's avatar
beilang committed
    },
    exec: function (cmd, ...args) {
        if (player && player[cmd]) {
            player[cmd](...args);
        }
beilang's avatar
beilang committed
    },
    loadVideo: function () {
        let gbId = this.gbid;
        let startTime = $('#startTime').val();
        let endTime = $('#endTime').val();

beilang's avatar
beilang committed
        if (!startTime || !endTime) {
beilang's avatar
beilang committed
            layer.msg('请填写回放开始时间和结束时间');
beilang's avatar
beilang committed
            return;
        }
beilang's avatar
beilang committed
        if (gbId) {
            player.loadVideo({
                src: {
                    websocketUrl: wsUrl,
                    devId: gbId,
                    startTime: startTime,
                    endTime: endTime
                },
                transport: KMediaUni.MODE.WEBRTC,
                autoplay: true
            });
beilang's avatar
beilang committed
            $("#isLive").show();
beilang's avatar
beilang committed
            return;
        }
beilang's avatar
beilang committed
        layer.msg('未找到播放源');
beilang's avatar
beilang committed
    }
}

beilang's avatar
beilang committed
let toolsShow = false;

beilang's avatar
beilang committed
$(document).on('click', function (e) {
    if ($(e.target).hasClass('modal')) {
beilang's avatar
beilang committed
        // 时间清空
        $('#startTime').val('');
        $('#endTime').val('');
beilang's avatar
beilang committed
        $('.tools').hide();
        toolsShow = false;
        $('#cameraModal').modal('hide');
beilang's avatar
beilang committed
    }
})

$(document).on('click', '.modal-content li', function () {
beilang's avatar
beilang committed
    let gbId = $(this).data('gbid');
beilang's avatar
beilang committed
    $("#isLive").hide();
beilang's avatar
beilang committed
    VideoPlayer.show(gbId);
beilang's avatar
beilang committed
})
beilang's avatar
beilang committed

$(document).on('click', '#payerhf', function () {
beilang's avatar
beilang committed
    if (toolsShow) {
        $('.tools').hide();
        toolsShow = false;
    } else {
        $('.tools').show();
        toolsShow = true;
    }
})

$(document).on('click', '#ishf', function () {
beilang's avatar
beilang committed
    //加载回放
    VideoPlayer.loadVideo();
beilang's avatar
beilang committed
})

$(document).on('click', '#isLive', function () {
    if (VideoPlayer.gbid) {
        VideoPlayer.show(VideoPlayer.gbid);
    }
beilang's avatar
beilang committed
})