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 |