人生啊人生 2 months ago
parent
commit
24e95f6ee7
3 changed files with 430 additions and 0 deletions
  1. 201 0
      package-lock.json
  2. 1 0
      package.json
  3. 228 0
      src/utils/common/ModelHtml5Audio.js

+ 201 - 0
package-lock.json

@@ -16,6 +16,7 @@
         "element-plus": "^2.4.4",
         "js-md5": "^0.8.3",
         "jsencrypt": "^3.3.2",
+        "less": "^4.1.3",
         "lodash": "^4.17.21",
         "mitt": "^3.0.1",
         "pinia": "^2.1.7",
@@ -1115,6 +1116,18 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/copy-anything": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
+      "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+      "license": "MIT",
+      "dependencies": {
+        "is-what": "^3.14.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
     "node_modules/csstype": {
       "version": "3.1.3",
       "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
@@ -1197,6 +1210,19 @@
         "node": ">=0.12"
       }
     },
+    "node_modules/errno": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "prr": "~1.0.1"
+      },
+      "bin": {
+        "errno": "cli.js"
+      }
+    },
     "node_modules/es5-ext": {
       "version": "0.10.62",
       "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz",
@@ -1375,6 +1401,13 @@
         "node": ">= 6"
       }
     },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+      "license": "ISC",
+      "optional": true
+    },
     "node_modules/he": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
@@ -1400,6 +1433,32 @@
         "@babel/runtime": "^7.12.0"
       }
     },
+    "node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+      "license": "MIT",
+      "optional": true,
+      "bin": {
+        "image-size": "bin/image-size.js"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/immer": {
       "version": "9.0.21",
       "resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz",
@@ -1480,6 +1539,12 @@
       "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==",
       "license": "MIT"
     },
+    "node_modules/is-what": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
+      "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+      "license": "MIT"
+    },
     "node_modules/js-md5": {
       "version": "0.8.3",
       "resolved": "https://registry.npmmirror.com/js-md5/-/js-md5-0.8.3.tgz",
@@ -1492,6 +1557,32 @@
       "integrity": "sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A==",
       "license": "MIT"
     },
+    "node_modules/less": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/less/-/less-4.4.0.tgz",
+      "integrity": "sha512-kdTwsyRuncDfjEs0DlRILWNvxhDG/Zij4YLO4TMJgDLW+8OzpfkdPnRgrsRuY1o+oaxJGWsps5f/RVBgGmmN0w==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "copy-anything": "^2.0.1",
+        "parse-node-version": "^1.0.1",
+        "tslib": "^2.3.0"
+      },
+      "bin": {
+        "lessc": "bin/lessc"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "optionalDependencies": {
+        "errno": "^0.1.1",
+        "graceful-fs": "^4.1.2",
+        "image-size": "~0.5.0",
+        "make-dir": "^2.1.0",
+        "mime": "^1.4.1",
+        "needle": "^3.1.0",
+        "source-map": "~0.6.0"
+      }
+    },
     "node_modules/lodash": {
       "version": "4.17.21",
       "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
@@ -1582,12 +1673,49 @@
         "node": ">=12"
       }
     },
+    "node_modules/make-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "pify": "^4.0.1",
+        "semver": "^5.6.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/make-dir/node_modules/semver": {
+      "version": "5.7.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+      "license": "ISC",
+      "optional": true,
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
     "node_modules/memoize-one": {
       "version": "6.0.0",
       "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
       "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
       "license": "MIT"
     },
+    "node_modules/mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "license": "MIT",
+      "optional": true,
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
     "node_modules/mime-db": {
       "version": "1.52.0",
       "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
@@ -1662,6 +1790,23 @@
         "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
       }
     },
+    "node_modules/needle": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz",
+      "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "iconv-lite": "^0.6.3",
+        "sax": "^1.2.4"
+      },
+      "bin": {
+        "needle": "bin/needle"
+      },
+      "engines": {
+        "node": ">= 4.4.x"
+      }
+    },
     "node_modules/next-tick": {
       "version": "1.1.0",
       "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz",
@@ -1684,6 +1829,15 @@
       "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==",
       "license": "BSD-3-Clause"
     },
+    "node_modules/parse-node-version": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+      "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
     "node_modules/path-browserify": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz",
@@ -1707,6 +1861,16 @@
         "node": ">=8.6"
       }
     },
+    "node_modules/pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/pinia": {
       "version": "2.1.7",
       "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.1.7.tgz",
@@ -1797,6 +1961,13 @@
       "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
       "license": "MIT"
     },
+    "node_modules/prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+      "license": "MIT",
+      "optional": true
+    },
     "node_modules/readdirp": {
       "version": "3.6.0",
       "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
@@ -1849,6 +2020,13 @@
         "fsevents": "~2.3.2"
       }
     },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "license": "MIT",
+      "optional": true
+    },
     "node_modules/sass": {
       "version": "1.70.0",
       "resolved": "https://registry.npmmirror.com/sass/-/sass-1.70.0.tgz",
@@ -1867,6 +2045,13 @@
         "node": ">=14.0.0"
       }
     },
+    "node_modules/sax": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
+      "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+      "license": "ISC",
+      "optional": true
+    },
     "node_modules/scroll-into-view-if-needed": {
       "version": "2.2.31",
       "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
@@ -1924,6 +2109,16 @@
         "node": ">=12.17.0"
       }
     },
+    "node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "license": "BSD-3-Clause",
+      "optional": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/source-map-js": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz",
@@ -1958,6 +2153,12 @@
         "node": ">=8.0"
       }
     },
+    "node_modules/tslib": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+      "license": "0BSD"
+    },
     "node_modules/type": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/type/-/type-1.2.0.tgz",

+ 1 - 0
package.json

@@ -19,6 +19,7 @@
     "jsencrypt": "^3.3.2",
     "lodash": "^4.17.21",
     "mitt": "^3.0.1",
+    "less": "^4.1.3",
     "pinia": "^2.1.7",
     "pinia-plugin-persistedstate": "^3.2.1",
     "vue": "^3.4.3",

+ 228 - 0
src/utils/common/ModelHtml5Audio.js

@@ -0,0 +1,228 @@
+
+/*eslint-disable*/
+/**
+ * 控制音乐播放的类
+ * Audio 对象属性
+ * 属性                      描述
+ * audioTracks             返回表示可用音频轨道的 AudioTrackList 对象。
+ * autoplay                设置或返回是否在就绪(加载完成)后随即播放音频。
+ * buffered                返回表示音频已缓冲部分的 TimeRanges 对象。
+ * controller              返回表示音频当前媒体控制器的 MediaController 对象。
+ * controls                设置或返回音频是否应该显示控件(比如播放/暂停等)。
+ * crossOrigin             设置或返回音频的 CORS 设置。
+ * currentSrc              返回当前音频的 URL。
+ * currentTime             设置或返回音频中的当前播放位置(以秒计)。
+ * defaultMuted            设置或返回音频默认是否静音。
+ * defaultPlaybackRate     设置或返回音频的默认播放速度。
+ * duration                返回音频的长度(以秒计)。
+ * ended                   返回音频的播放是否已结束。
+ * error                   返回表示音频错误状态的 MediaError 对象。
+ * loop                    设置或返回音频是否应在结束时再次播放。
+ * mediaGroup              设置或返回音频所属媒介组合的名称。
+ * muted                   设置或返回是否关闭声音。
+ * networkState            返回音频的当前网络状态。
+ * paused                  设置或返回音频是否暂停。
+ * playbackRate            设置或返回音频播放的速度。
+ * played                  返回表示音频已播放部分的 TimeRanges 对象。
+ * preload                 设置或返回音频的 preload 属性的值。
+ * readyState              返回音频当前的就绪状态。
+ * seekable                返回表示音频可寻址部分的 TimeRanges 对象。
+ * seeking                 返回用户当前是否正在音频中进行查找。
+ * src                     设置或返回音频的 src 属性的值。
+ * textTracks              返回表示可用文本轨道的 TextTrackList 对象。
+ * volume                  设置或返回音频的音量。
+ *
+ * Audio 对象方法
+ * 方法                  描述
+ * addTextTrack()      向音频添加新的文本轨道。
+ * canPlayType()       检查浏览器是否能够播放指定的音频类型。
+ * fastSeek()          在音频播放器中指定播放时间。
+ * getStartDate()      返回新的 Date 对象,表示当前时间线偏移量。
+ * load()              重新加载音频元素。
+ * play()              开始播放音频。
+ * pause()             暂停当前播放的音频。
+ * */
+export class ModelHtml5Audio {
+
+    // 每次 new 出对象则会调用这个构造函数
+    constructor() {
+
+        // 目标音乐文件 可以是本地项目的 例如  'demo/music/bg.mp3' 也可以是 网址 例如 'http://网址/demo/music/bg.mp3'
+        this.url = null;
+        // 是否循环音乐, true 循环播放, 否则不传,则为播放完成就结束
+        this.loop = false;
+        // 音乐播放的 Audio 对象
+        this.objAudio = null;
+        
+    }
+
+    // // 实现单例模式
+    // static find() {
+    //     if (!ModelHtml5Audio.instance) {
+    //         ModelHtml5Audio.instance = new GpsEvent();
+    //     }
+    //     return ModelHtml5Audio.instance;
+    // }
+
+    // 设置 目标音乐文件 可以是本地项目的 例如  'demo/music/bg.mp3' 也可以是 网址 例如 'http://网址/demo/music/bg.mp3'
+    setUrl(val) {
+
+        if (this.url != val) {
+            this.url = val;
+
+            // 通过判断,来保证,对象只会被new出来一次
+            if (this.objAudio == null || this.objAudio == 'undefined')
+            {
+                this.objAudio = new Audio(this.url);
+            }
+
+            // 改变音频播放的文件,或者地址
+            this.objAudio.src = (this.url);
+            // 彻底停止播放
+            this.end();
+
+            // 音乐播放结束事件
+            this.objAudio.addEventListener('ended', function() {
+                //console.log("音乐播放停止了");
+
+                // 如果 循环播放开启的话
+                if (this.loop == true) {
+                    // 开始播放音频。【此时就实现了重新播放】
+                    this.musicPlay();
+                }
+
+
+            }, false);
+        }
+
+        return this;
+    }
+
+    // 判断对象是否存在,存在返回 true,否则返回false
+    objExistenceBool() {
+        if (
+            this.objAudio == null || this.objAudio == 'undefined'
+            || this.url == null || this.url == 'undefined'
+        ) {
+            //console.log("请优先设置播放文件或者地址");
+            return false;
+        }
+
+        return true;
+
+    }
+
+    // 统一真正出发播放,后续方便,如果在这个方法增加逻辑的时候可以使用到
+    musicPlay() {
+        // 开始播放音频。
+        this.objAudio.play();
+    }
+
+    // 开始播放
+    start() {
+        if (this.objExistenceBool() == false) {
+            return this;
+        }
+
+        // 设置或返回是否在就绪(加载完成)后随即播放音频。
+        this.objAudio.autoplay = true;
+        // 是否循环
+        this.objAudio.loop = this.loop || false;
+
+        this.musicPlay();
+
+    }
+
+    // 暂停播放
+    pause() {
+        if (this.objExistenceBool() == false) {
+            return this;
+        }
+
+        // 暂停当前播放的音频
+        this.objAudio.pause();
+    }
+
+    // 重新开始播放
+    again() {
+        if (this.objExistenceBool() == false) {
+            return this;
+        }
+
+        // 暂停播放
+        this.pause();
+        // 在音频播放器中指定播放时间。 0 就是重头开始
+        this.objAudio.currentTime = 0;
+
+        this.musicPlay();
+    }
+
+    // 开启循环播放模式
+    loopOpen() {
+
+        if (this.objExistenceBool() == false) {
+            return this;
+        }
+
+        this.loop = true;
+        // 是否循环
+        this.objAudio.loop = this.loop || false;
+    }
+
+    // 关闭循环播放模式
+    loopClose() {
+
+        if (this.objExistenceBool() == false) {
+            return this;
+        }
+
+        this.loop = false;
+        // 是否循环
+        this.objAudio.loop = this.loop || false;
+    }
+
+    // 直接就是循环模式播放
+    loopPlay() {
+        if (this.objExistenceBool() == false) {
+            return this;
+        }
+
+        // 开启循环播放模式
+        this.loopOpen();
+        // 开始播放
+        this.start();
+    }
+
+    // 彻底停止播放
+    end() {
+        if (this.objExistenceBool() == false) {
+            return this;
+        }
+
+        // 暂停播放
+        this.pause();
+        // 在音频播放器中指定播放时间。 0 就是重头开始
+        this.objAudio.currentTime = 0;
+    }
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+