diff --git a/core/core-frontend/package.json b/core/core-frontend/package.json index 85bec973ac..9741a9d41d 100644 --- a/core/core-frontend/package.json +++ b/core/core-frontend/package.json @@ -27,6 +27,7 @@ "element-plus-secondary": "^0.5.8", "element-resize-detector": "^1.2.4", "file-saver": "^2.0.5", + "flv.js": "^1.6.2", "html-to-image": "^1.11.11", "html2canvas": "^1.4.1", "js-base64": "^3.7.5", diff --git a/core/core-frontend/src/assets/svg/icon-stream.svg b/core/core-frontend/src/assets/svg/icon-stream.svg new file mode 100644 index 0000000000..a52a91d463 --- /dev/null +++ b/core/core-frontend/src/assets/svg/icon-stream.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core/core-frontend/src/custom-component/component-list.ts b/core/core-frontend/src/custom-component/component-list.ts index d975fc8db6..16c51b8bae 100644 --- a/core/core-frontend/src/custom-component/component-list.ts +++ b/core/core-frontend/src/custom-component/component-list.ts @@ -8,6 +8,19 @@ export const commonStyle = { opacity: 1 } +// 流媒体视频信息配置 +export const STREAMMEDIALINKS = { + videoType: 'flv', + flv: { + type: 'flv', + isLive: false, + cors: true, // 允许跨域 + loop: true, + autoplay: false + // url: null // 网络动画视频 + } +} + // 视频信息配置 export const VIDEO_LINKS_DE2 = { videoType: 'web', @@ -248,6 +261,25 @@ const list = [ videoLinks: VIDEO_LINKS_DE2, matrixStyle: {} }, + { + component: 'DeStreamMedia', + name: '媒体', + label: '媒体', + innerType: 'DeStreamMedia', + editing: false, + canvasActive: false, + icon: 'icon-stream', + x: 1, + y: 1, + sizeX: 36, + sizeY: 14, + style: { + width: 600, + height: 300 + }, + streamMediaLinks: STREAMMEDIALINKS, + matrixStyle: {} + }, { component: 'DeFrame', name: '网页', diff --git a/core/core-frontend/src/custom-component/de-stream-media/Attr.vue b/core/core-frontend/src/custom-component/de-stream-media/Attr.vue new file mode 100644 index 0000000000..c49fe3ad8e --- /dev/null +++ b/core/core-frontend/src/custom-component/de-stream-media/Attr.vue @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/core/core-frontend/src/custom-component/de-stream-media/Component.vue b/core/core-frontend/src/custom-component/de-stream-media/Component.vue new file mode 100644 index 0000000000..08cfa3168b --- /dev/null +++ b/core/core-frontend/src/custom-component/de-stream-media/Component.vue @@ -0,0 +1,156 @@ + + + + + + + + {{ $t('panel.link_add_tips_pre') }} + + {{ $t('panel.stream_media_add_tips') }} + + + + + + diff --git a/core/core-frontend/src/style/custom-theme.css b/core/core-frontend/src/style/custom-theme.css new file mode 100755 index 0000000000..f477a08585 --- /dev/null +++ b/core/core-frontend/src/style/custom-theme.css @@ -0,0 +1,181 @@ +.vjs-custom-skin > .video-js { + width: 100%; + background-color: rgba(0, 0, 0, 0); + font-family: "AlibabaPuHuiTi","Helvetica Neue","Hiragino Sans GB","Segoe UI","Microsoft YaHei","微软雅黑",sans-serif; +} + +.vjs-custom-skin > .video-js .vjs-menu-button-inline.vjs-slider-active,.vjs-custom-skin > .video-js .vjs-menu-button-inline:focus,.vjs-custom-skin > .video-js .vjs-menu-button-inline:hover,.video-js.vjs-no-flex .vjs-menu-button-inline { + width: 10em +} + +.vjs-custom-skin > .video-js .vjs-controls-disabled .vjs-big-play-button { + display: none!important +} + +.vjs-custom-skin > .video-js .vjs-control { + width: 3em +} + +.vjs-custom-skin > .video-js .vjs-control.vjs-live-control{ + width: auto; + padding-left: .5em; + letter-spacing: .1em; +} + +.vjs-custom-skin > .video-js .vjs-menu-button-inline:before { + width: 1.5em +} + +.vjs-menu-button-inline .vjs-menu { + left: 3em +} + +.vjs-paused.vjs-has-started.vjs-custom-skin > .video-js .vjs-big-play-button,.video-js.vjs-ended .vjs-big-play-button,.video-js.vjs-paused .vjs-big-play-button { + display: block +} + +.vjs-custom-skin > .video-js .vjs-load-progress div,.vjs-seeking .vjs-big-play-button,.vjs-waiting .vjs-big-play-button { + display: none!important +} + +.vjs-custom-skin > .video-js .vjs-mouse-display:after,.vjs-custom-skin > .video-js .vjs-play-progress:after { + padding: 0 .4em .3em +} + +.video-js.vjs-ended .vjs-loading-spinner { + display: none; +} + +.video-js.vjs-ended .vjs-big-play-button { + display: block !important; +} + +.video-js.vjs-ended .vjs-big-play-button,.video-js.vjs-paused .vjs-big-play-button,.vjs-paused.vjs-has-started.vjs-custom-skin > .video-js .vjs-big-play-button { + display: block +} + +.vjs-custom-skin > .video-js .vjs-big-play-button { + top: 50%; + left: 50%; + margin-left: -1.5em; + margin-top: -1em +} + +.vjs-custom-skin > .video-js .vjs-big-play-button { + background-color: rgba(0,0,0,0.45); + font-size: 3.5em; + /*border-radius: 50%;*/ + height: 2em !important; + line-height: 2em !important; + margin-top: -1em !important +} + +.video-js:hover .vjs-big-play-button,.vjs-custom-skin > .video-js .vjs-big-play-button:focus,.vjs-custom-skin > .video-js .vjs-big-play-button:active { + background-color: rgba(36,131,213,0.9) +} + +.vjs-custom-skin > .video-js .vjs-loading-spinner { + border-color: rgba(36,131,213,0.8) +} + +.vjs-custom-skin > .video-js .vjs-control-bar2 { + background-color: #000000 +} + +.vjs-custom-skin > .video-js .vjs-control-bar { + /*background-color: rgba(0,0,0,0.3) !important;*/ + color: #ffffff; + font-size: 14px +} + +.vjs-custom-skin > .video-js .vjs-play-progress,.vjs-custom-skin > .video-js .vjs-volume-level { + background-color: #2483d5 +} + +.vjs-custom-skin > .video-js .vjs-play-progress:before { + top: -0.3em; +} + +.vjs-custom-skin > .video-js .vjs-progress-control:hover .vjs-progress-holder { + font-size: 1.3em; +} + +.vjs-menu-button-popup.vjs-volume-menu-button-vertical .vjs-menu { + left: 0em; +} + +.vjs-custom-skin > .video-js .vjs-menu li { + padding: 0; + line-height: 2em; + font-size: 1.1em; + font-family: "AlibabaPuHuiTi","Helvetica Neue","Hiragino Sans GB","Segoe UI","Microsoft YaHei","微软雅黑",sans-serif; +} + +.vjs-custom-skin > .video-js .vjs-time-tooltip, +.vjs-custom-skin > .video-js .vjs-mouse-display:after, +.vjs-custom-skin > .video-js .vjs-play-progress:after { + border-radius: 0; + font-size: 1em; + padding: 0; + width: 3em; + height: 1.5em; + line-height: 1.5em; + top: -3em; +} + +.vjs-custom-skin > .video-js .vjs-menu-button-popup .vjs-menu { + width: 5em; + left: -1em; +} + +.vjs-custom-skin > .video-js .vjs-menu-button-popup.vjs-volume-menu-button-vertical .vjs-menu { + left: 0; +} + +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-resolution-button .vjs-menu { + /*order: 4;*/ +} + + /*排序顺序*/ +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-play-control { + order: 0; +} + +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-time-control { + min-width: 1em; + padding: 0; + margin: 0 .1em; + text-align: center; + display: block; + order: 1; +} + +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-playback-rate .vjs-playback-rate-value{ + font-size: 1.2em; + line-height: 2.4; +} + +.vjs-custom-skin > .video-js .vjs-progress-control.vjs-control { + order: 2; +} + +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-volume-menu-button { + order: 3; +} + +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-resolution-button { + order: 4; +} + +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-resolution-button .vjs-resolution-button-label { + display: block; + line-height: 3em; +} + +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-playback-rate { + order: 5; +} + +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-fullscreen-control { + order: 6; +} diff --git a/core/core-frontend/src/utils/components.ts b/core/core-frontend/src/utils/components.ts index a83f1d58ee..6ad1314f04 100644 --- a/core/core-frontend/src/utils/components.ts +++ b/core/core-frontend/src/utils/components.ts @@ -29,6 +29,8 @@ import DeFrame from '@/custom-component/de-frame/ComponentFrame.vue' import DeFrameAttr from '@/custom-component/de-frame/Attr.vue' import DeVideo from '@/custom-component/de-video/Component.vue' import DeVideoAttr from '@/custom-component/de-video/Attr.vue' +import DeStreamMedia from '@/custom-component/de-stream-media/Component.vue' +import DeStreamMediaAttr from '@/custom-component/de-stream-media/Attr.vue' export const componentsMap = { VText: VText, VQuery, @@ -60,7 +62,9 @@ export const componentsMap = { DeFrame: DeFrame, DeFrameAttr: DeFrameAttr, DeVideo: DeVideo, - DeVideoAttr: DeVideoAttr + DeVideoAttr: DeVideoAttr, + DeStreamMedia: DeStreamMedia, + DeStreamMediaAttr: DeStreamMediaAttr } export default function findComponent(key) {