Commit 6a7d8a2773a16f7937c14481b71c6736d01788ac
1 parent
92abb1c7
feat: implement video play m3u8 type
Showing
3 changed files
with
90 additions
and
10 deletions
@@ -31,6 +31,11 @@ | @@ -31,6 +31,11 @@ | ||
31 | <script src="./js/plugin/echarts/echarts.js"></script> | 31 | <script src="./js/plugin/echarts/echarts.js"></script> |
32 | 32 | ||
33 | <script src="./plugins/axios.min.js"></script> | 33 | <script src="./plugins/axios.min.js"></script> |
34 | + | ||
35 | + <link href="https://vjs.zencdn.net/7.10.2/video-js.min.css" rel="stylesheet"> | ||
36 | + <script src="https://vjs.zencdn.net/7.10.2/video.min.js"></script> | ||
37 | + | ||
38 | + <!-- <script src="https://unpkg.com/videojs-contrib-hls/dist/videojs-contrib-hls.js"></script> --> | ||
34 | <!-- <script src="./js/jquery/jquery-3.3.1.min.js"></script>--> | 39 | <!-- <script src="./js/jquery/jquery-3.3.1.min.js"></script>--> |
35 | <link rel="stylesheet" href="https://cdnjs.loli.net/ajax/libs/layui/2.6.8/css/layui.min.css" | 40 | <link rel="stylesheet" href="https://cdnjs.loli.net/ajax/libs/layui/2.6.8/css/layui.min.css" |
36 | integrity="sha512-iQBJbsNHXUcgEIgWThd2dr8tOdKPvICwqjPEZYY81z3eMya44A5MiAqfWSCh+Ee1YzNYkdrI982Qhwgr8LEYOQ==" | 41 | integrity="sha512-iQBJbsNHXUcgEIgWThd2dr8tOdKPvICwqjPEZYY81z3eMya44A5MiAqfWSCh+Ee1YzNYkdrI982Qhwgr8LEYOQ==" |
@@ -419,6 +424,7 @@ | @@ -419,6 +424,7 @@ | ||
419 | cursor: pointer; | 424 | cursor: pointer; |
420 | margin: 5px; | 425 | margin: 5px; |
421 | } | 426 | } |
427 | + | ||
422 | </style> | 428 | </style> |
423 | <!-- Workaround for binary XHR in IE 9/10, see App.loadUrl --> | 429 | <!-- Workaround for binary XHR in IE 9/10, see App.loadUrl --> |
424 | <!--[if (IE 9)|(IE 10)]><!--> | 430 | <!--[if (IE 9)|(IE 10)]><!--> |
@@ -559,6 +565,7 @@ | @@ -559,6 +565,7 @@ | ||
559 | opacity: 0; | 565 | opacity: 0; |
560 | } | 566 | } |
561 | } | 567 | } |
568 | + | ||
562 | </style> | 569 | </style> |
563 | </head> | 570 | </head> |
564 | 571 |
@@ -3,7 +3,7 @@ | @@ -3,7 +3,7 @@ | ||
3 | Sidebar.prototype.addBasicComponentsPalette = function () { | 3 | Sidebar.prototype.addBasicComponentsPalette = function () { |
4 | this.setCurrentSearchEntryLibrary('component'); | 4 | this.setCurrentSearchEntryLibrary('component'); |
5 | const dt = 'basic' | 5 | const dt = 'basic' |
6 | - const gn = `mxgraph.${ dt }` | 6 | + const gn = `mxgraph.${dt}` |
7 | const currentDate = getCurrentDate(); | 7 | const currentDate = getCurrentDate(); |
8 | const basicAttr = this.enumCellBasicAttribute | 8 | const basicAttr = this.enumCellBasicAttribute |
9 | const componentType = this.enumComponentType | 9 | const componentType = this.enumComponentType |
@@ -14,14 +14,14 @@ | @@ -14,14 +14,14 @@ | ||
14 | const cell = new mxCell('Title', new mxGeometry(0, 0, 100, 40), transparentBg); | 14 | const cell = new mxCell('Title', new mxGeometry(0, 0, 100, 40), transparentBg); |
15 | cell.setVertex(true) | 15 | cell.setVertex(true) |
16 | this.setCellAttributes(cell, { [basicAttr.COMPONENT_TYPE]: componentType.TITLE }) | 16 | this.setCellAttributes(cell, { [basicAttr.COMPONENT_TYPE]: componentType.TITLE }) |
17 | - return this.createVertexTemplateFromCells([ cell ], cell.geometry.width, cell.geometry.height, 'Title'); | 17 | + return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, 'Title'); |
18 | })), | 18 | })), |
19 | 19 | ||
20 | this.addEntry(this.getTagsForStencil(gn, 'variable', dt).join(' '), mxUtils.bind(this, function () { | 20 | this.addEntry(this.getTagsForStencil(gn, 'variable', dt).join(' '), mxUtils.bind(this, function () { |
21 | const cell = new mxCell('变量', new mxGeometry(0, 0, 100, 40), transparentBg); | 21 | const cell = new mxCell('变量', new mxGeometry(0, 0, 100, 40), transparentBg); |
22 | cell.setVertex(true) | 22 | cell.setVertex(true) |
23 | this.setCellAttributes(cell, { [basicAttr.COMPONENT_TYPE]: componentType.VARIABLE }) | 23 | this.setCellAttributes(cell, { [basicAttr.COMPONENT_TYPE]: componentType.VARIABLE }) |
24 | - return this.createVertexTemplateFromCells([ cell ], cell.geometry.width, cell.geometry.height, '变量'); | 24 | + return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '变量'); |
25 | })), | 25 | })), |
26 | 26 | ||
27 | this.addEntry(this.getTagsForStencil(gn, 'line', dt).join(' '), mxUtils.bind(this, function () { | 27 | this.addEntry(this.getTagsForStencil(gn, 'line', dt).join(' '), mxUtils.bind(this, function () { |
@@ -33,7 +33,7 @@ | @@ -33,7 +33,7 @@ | ||
33 | cell.edge = true; | 33 | cell.edge = true; |
34 | cell.setVertex(true) | 34 | cell.setVertex(true) |
35 | this.setCellAttributes(cell, { [basicAttr.COMPONENT_TYPE]: componentType.LINE }) | 35 | this.setCellAttributes(cell, { [basicAttr.COMPONENT_TYPE]: componentType.LINE }) |
36 | - return this.createEdgeTemplateFromCells([ cell ], 60, 40, '线条'); | 36 | + return this.createEdgeTemplateFromCells([cell], 60, 40, '线条'); |
37 | })), | 37 | })), |
38 | this.addEntry('real time', mxUtils.bind(this, function () { | 38 | this.addEntry('real time', mxUtils.bind(this, function () { |
39 | const template = `<div class="thingKit-component__real-time"><div class="real-time__date">%currentDate%</div> <div style="font-size:30px" class="real-time__now">HH:mm:ss</div></div>` | 39 | const template = `<div class="thingKit-component__real-time"><div class="real-time__date">%currentDate%</div> <div style="font-size:30px" class="real-time__now">HH:mm:ss</div></div>` |
@@ -44,19 +44,43 @@ | @@ -44,19 +44,43 @@ | ||
44 | placeholders: '1', | 44 | placeholders: '1', |
45 | currentDate: currentDate, | 45 | currentDate: currentDate, |
46 | }) | 46 | }) |
47 | - return this.createVertexTemplateFromCells([ cell ], cell.geometry.width, cell.geometry.height, '实时时间'); | 47 | + return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '实时时间'); |
48 | })), | 48 | })), |
49 | this.addEntry(this.getTagsForStencil('mxgraph.basic', '变量图片', 'basic').join(' '), mxUtils.bind(this, function () { | 49 | this.addEntry(this.getTagsForStencil('mxgraph.basic', '变量图片', 'basic').join(' '), mxUtils.bind(this, function () { |
50 | const cell = new mxCell('', new mxGeometry(0, 0, 194, 95), 'image;image=images/thingskit/img-placeholder.png;imageAspect=0;'); | 50 | const cell = new mxCell('', new mxGeometry(0, 0, 194, 95), 'image;image=images/thingskit/img-placeholder.png;imageAspect=0;'); |
51 | cell.setVertex(true) | 51 | cell.setVertex(true) |
52 | this.setCellAttributes(cell, { [basicAttr.COMPONENT_TYPE]: componentType.VAR_IMAGE }) | 52 | this.setCellAttributes(cell, { [basicAttr.COMPONENT_TYPE]: componentType.VAR_IMAGE }) |
53 | - return this.createVertexTemplateFromCells([ cell ], cell.geometry.width, cell.geometry.height, '变量图片'); | 53 | + return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '变量图片'); |
54 | })), | 54 | })), |
55 | this.addEntry(this.getTagsForStencil('mxgraph.basic', '视频', 'basic').join(' '), mxUtils.bind(this, function () { | 55 | this.addEntry(this.getTagsForStencil('mxgraph.basic', '视频', 'basic').join(' '), mxUtils.bind(this, function () { |
56 | - const cell = new mxCell('', new mxGeometry(0, 0, 100, 95), 'image;image=images/thingskit/video.svg;imageAspect=0;'); | 56 | + const m3u8 = 'http://d2zihajmogu5jn.cloudfront.net/bipbop-advanced/bipbop_16x9_variant.m3u8' |
57 | + const mp4 = 'http://vjs.zencdn.net/v/oceans.mp4' | ||
58 | + const m3u8Type = 'application/x-mpegURL' | ||
59 | + const mp4Type = 'video/mp4' | ||
60 | + // const cell = new mxCell('<video></video>', new mxGeometry(0, 0, 100, 95), 'image;image=images/thingskit/video.svg;imageAspect=0;'); | ||
61 | + const template = ` | ||
62 | + <video | ||
63 | + id="my-player" | ||
64 | + class="video-js" | ||
65 | + controls | ||
66 | + preload="auto" | ||
67 | + muted="muted" | ||
68 | + poster="/thingskit-drawio/images/youtube.png" | ||
69 | + data-setup='{}'> | ||
70 | + <source src="${mp4}" type="${mp4Type}"> | ||
71 | + <p class="vjs-no-js"> | ||
72 | + To view this video please enable JavaScript, and consider upgrading to a | ||
73 | + web browser that | ||
74 | + <a href="https://videojs.com/html5-video-support/" target="_blank"> | ||
75 | + supports HTML5 video | ||
76 | + </a> | ||
77 | + </p> | ||
78 | + </video> | ||
79 | + ` | ||
80 | + const cell = new mxCell(template, new mxGeometry(0, 0, 100, 95), 'text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;'); | ||
57 | cell.setVertex(true) | 81 | cell.setVertex(true) |
58 | this.setCellAttributes(cell, { [basicAttr.COMPONENT_TYPE]: componentType.VIDEO }) | 82 | this.setCellAttributes(cell, { [basicAttr.COMPONENT_TYPE]: componentType.VIDEO }) |
59 | - return this.createVertexTemplateFromCells([ cell ], cell.geometry.width, cell.geometry.height, '视频'); | 83 | + return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '视频'); |
60 | })), | 84 | })), |
61 | ]; | 85 | ]; |
62 | 86 | ||
@@ -70,7 +94,7 @@ | @@ -70,7 +94,7 @@ | ||
70 | var year = date.getFullYear(); | 94 | var year = date.getFullYear(); |
71 | var month = date.getMonth() + 1; | 95 | var month = date.getMonth() + 1; |
72 | var dates = date.getDate(); | 96 | var dates = date.getDate(); |
73 | - arr = [ '星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六' ] | 97 | + arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'] |
74 | var day = date.getDay(); | 98 | var day = date.getDay(); |
75 | return year + '年' + month + '月' + dates + '日 ' + arr[day]; | 99 | return year + '年' + month + '月' + dates + '日 ' + arr[day]; |
76 | } | 100 | } |
@@ -83,7 +107,7 @@ | @@ -83,7 +107,7 @@ | ||
83 | const allTimeNode = document.querySelectorAll('.thingKit-component__real-time .real-time__now') | 107 | const allTimeNode = document.querySelectorAll('.thingKit-component__real-time .real-time__now') |
84 | for (const time of allTimeNode) { | 108 | for (const time of allTimeNode) { |
85 | const date = new Date() | 109 | const date = new Date() |
86 | - time.innerHTML = `${ date.getHours() < 10 ? '0' : '' }${ date.getHours() }:${ date.getMinutes() < 10 ? '0' : '' }${ date.getMinutes() }:${ date.getSeconds() < 10 ? '0' : '' }${ date.getSeconds() }` | 110 | + time.innerHTML = `${date.getHours() < 10 ? '0' : ''}${date.getHours()}:${date.getMinutes() < 10 ? '0' : ''}${date.getMinutes()}:${date.getSeconds() < 10 ? '0' : ''}${date.getSeconds()}` |
87 | } | 111 | } |
88 | }, 1000) | 112 | }, 1000) |
89 | } | 113 | } |
@@ -13339,6 +13339,7 @@ class HandleDynamicEffect { | @@ -13339,6 +13339,7 @@ class HandleDynamicEffect { | ||
13339 | * @description 生成映射关系 && 初始化推送消息 | 13339 | * @description 生成映射关系 && 初始化推送消息 |
13340 | */ | 13340 | */ |
13341 | generatorMappingRelation() { | 13341 | generatorMappingRelation() { |
13342 | + this.videoPlay() | ||
13342 | const tsSubCmds = [] | 13343 | const tsSubCmds = [] |
13343 | this.enableActList.forEach(each => { | 13344 | this.enableActList.forEach(each => { |
13344 | const { id, type, attr, deviceId, slaveDeviceId } = each | 13345 | const { id, type, attr, deviceId, slaveDeviceId } = each |
@@ -13533,6 +13534,54 @@ class HandleDynamicEffect { | @@ -13533,6 +13534,54 @@ class HandleDynamicEffect { | ||
13533 | } | 13534 | } |
13534 | } | 13535 | } |
13535 | 13536 | ||
13537 | + | ||
13538 | + videoPlay() { | ||
13539 | + const basicAttr = Sidebar.prototype.enumCellBasicAttribute | ||
13540 | + const videoCell = this.DispatchInstance.contentAllCell.filter(cell => cell.getAttribute(basicAttr.COMPONENT_TYPE) === 'video') | ||
13541 | + const options = { | ||
13542 | + hls: { | ||
13543 | + withCredentials: true | ||
13544 | + } | ||
13545 | + } | ||
13546 | + var player = videojs('my-player', options, function onPlayerReady() { | ||
13547 | + videojs.log('Your player is ready!'); | ||
13548 | + | ||
13549 | + // In this context, `this` is the player that was created by Video.js. | ||
13550 | + this.play(); | ||
13551 | + | ||
13552 | + // How about an event listener? | ||
13553 | + this.on('ended', function () { | ||
13554 | + videojs.log('Awww...over so soon?!'); | ||
13555 | + }); | ||
13556 | + }); | ||
13557 | + | ||
13558 | + console.log(player) | ||
13559 | + // for (const cell of videoCell) { | ||
13560 | + // this.graph.getModel().beginUpdate() | ||
13561 | + // try { | ||
13562 | + // const options = { | ||
13563 | + // hls: { | ||
13564 | + // withCredentials: true | ||
13565 | + // } | ||
13566 | + // } | ||
13567 | + // var player = videojs('my-player', options, function onPlayerReady() { | ||
13568 | + // videojs.log('Your player is ready!'); | ||
13569 | + | ||
13570 | + // // In this context, `this` is the player that was created by Video.js. | ||
13571 | + // this.play(); | ||
13572 | + | ||
13573 | + // // How about an event listener? | ||
13574 | + // this.on('ended', function () { | ||
13575 | + // videojs.log('Awww...over so soon?!'); | ||
13576 | + // }); | ||
13577 | + // }); | ||
13578 | + // this.graph.refresh(cell); | ||
13579 | + // } finally { | ||
13580 | + // this.graph.getModel().endUpdate() | ||
13581 | + // } | ||
13582 | + // } | ||
13583 | + } | ||
13584 | + | ||
13536 | /** | 13585 | /** |
13537 | * @description 验证是否满足条件列表中的任意一条 | 13586 | * @description 验证是否满足条件列表中的任意一条 |
13538 | * @param subscriptionId | 13587 | * @param subscriptionId |