vue-video-plus 1.2.3 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 鱿鱼溪学院
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,52 +1,545 @@
1
- # vueVideo++
2
-
3
- 使用 Vue3 构建的多功能视频播放器
4
-
5
- ## 安装
6
-
7
- npm 安装
8
-
9
- ```javascript
10
- npm i vue-video-plus
11
- ```
12
-
13
- pnpm 安装
14
-
15
- ```javascript
16
- pnpm i vue-video-plus
17
- ```
18
-
19
- yarn 安装
20
-
21
- ```javascript
22
- yarn add vue-video-plus
23
- ```
24
-
25
- ## 开始使用
26
-
27
- #### 全局使用
28
-
29
- ```javascript
30
- import { createApp } from 'vue'
31
- import App from './App.vue'
32
- let app = createApp(App)
33
-
34
- import vueVideoPlus from 'vue-video-plus' // 引入组件
35
- import 'vue-video-plus/dist/style.css' // 引入css
36
- app.use(vueVideoPlus)
37
-
38
- app.mount('#app')
39
- ```
40
-
41
- #### 组件内使用
42
-
43
- ```javascript
44
- // 引入样式
45
- import 'vue-video-plus/dist/style.css'
46
- import { videoPlay } from 'vue-video-plus'
47
- export default {
48
- components: {
49
- videoPlay
50
- }
51
- }
52
- ```
1
+ # 🎬 Vue Video Plus
2
+
3
+ <div align="center">
4
+
5
+ 一个基于 **Vue 3** 开发的功能丰富、高度可定制的现代化视频播放器组件
6
+
7
+ [![npm version](https://img.shields.io/npm/v/vue-video-plus.svg)](https://www.npmjs.com/package/vue-video-plus)
8
+ [![license](https://img.shields.io/npm/l/vue-video-plus.svg)](https://github.com/yourusername/vue-video-plus/blob/master/LICENSE)
9
+ [![downloads](https://img.shields.io/npm/dm/vue-video-plus.svg)](https://www.npmjs.com/package/vue-video-plus)
10
+
11
+ </div>
12
+
13
+ ## ✨ 特性
14
+
15
+ - 🎨 **主题定制** - 支持纯色/渐变主题,可自定义播放器颜色
16
+ - 📱 **响应式设计** - 完美适配桌面端和移动端
17
+ - 🎯 **丰富功能** - 倍速播放、画中画、全屏、关灯模式等
18
+ - ⌨️ **快捷键支持** - 空格播放/暂停、方向键快进快退、音量调节
19
+ - 🔄 **自动播放策略** - 智能处理浏览器自动播放限制
20
+ - 🎭 **镜像画面** - 支持视频镜像翻转
21
+ - 🔊 **音量记忆** - 自动记住用户音量设置
22
+ - 🎬 **循环播放** - 支持视频循环播放
23
+ - 💡 **关灯模式** - 沉浸式观看体验
24
+ - 🎪 **多种动画** - 播放按钮支持多种切换动画效果
25
+ - 🛠️ **TypeScript** - 完整的类型定义支持
26
+
27
+ ## 📦 安装
28
+
29
+ ### npm
30
+
31
+ ```bash
32
+ npm install vue-video-plus
33
+ ```
34
+
35
+ ### pnpm
36
+
37
+ ```bash
38
+ pnpm add vue-video-plus
39
+ ```
40
+
41
+ ### yarn
42
+
43
+ ```bash
44
+ yarn add vue-video-plus
45
+ ```
46
+
47
+ ## 🚀 快速开始
48
+
49
+ ### 全局注册
50
+
51
+ ```javascript
52
+ import { createApp } from 'vue'
53
+ import App from './App.vue'
54
+
55
+ // 引入组件和样式
56
+ import VueVideoPlus from 'vue-video-plus'
57
+ import 'vue-video-plus/dist/style.css'
58
+
59
+ const app = createApp(App)
60
+ app.use(VueVideoPlus)
61
+ app.mount('#app')
62
+ ```
63
+
64
+ ### 组件内使用
65
+
66
+ ```vue
67
+ <template>
68
+ <VueVideoPlus
69
+ v-bind="options"
70
+ @play="handlePlay"
71
+ @pause="handlePause"
72
+ />
73
+ </template>
74
+
75
+ <script setup>
76
+ import { reactive } from 'vue'
77
+ import { VueVideoPlus } from 'vue-video-plus'
78
+ import 'vue-video-plus/dist/style.css'
79
+
80
+ const options = reactive({
81
+ width: '800px',
82
+ height: '450px',
83
+ src: 'https://example.com/video.mp4',
84
+ title: '示例视频',
85
+ autoPlay: false,
86
+ muted: false,
87
+ volume: 0.5
88
+ })
89
+
90
+ const handlePlay = (event) => {
91
+ console.log('视频开始播放', event)
92
+ }
93
+
94
+ const handlePause = (event) => {
95
+ console.log('视频暂停', event)
96
+ }
97
+ </script>
98
+ ```
99
+
100
+ ## 📖 配置项
101
+
102
+ ### 基础配置
103
+
104
+ | 参数 | 说明 | 类型 | 默认值 |
105
+ |-----|------|------|--------|
106
+ | `src` | 视频源地址(必填) | `String` | - |
107
+ | `width` | 播放器宽度(桌面端) | `String` | `'800px'` |
108
+ | `height` | 播放器高度(桌面端) | `String` | `'450px'` |
109
+ | `title` | 视频标题 | `String` | `''` |
110
+ | `type` | 视频类型 | `String` | `'video/mp4'` |
111
+ | `poster` | 视频封面图 | `String` | `''` |
112
+ | `autoPlay` | 自动播放 | `Boolean` | `true` |
113
+ | `muted` | 静音 | `Boolean` | `true` |
114
+ | `volume` | 默认音量(0-1) | `Number` | `0.3` |
115
+ | `loop` | 循环播放 | `Boolean` | `false` |
116
+ | `currentTime` | 初始播放时间(秒) | `Number` | `0` |
117
+ | `control` | 是否显示控制器 | `Boolean` | `true` |
118
+ | `preload` | 预加载策略 | `String` | `'auto'` |
119
+
120
+ ### 主题配置
121
+
122
+ | 参数 | 说明 | 类型 | 默认值 |
123
+ |-----|------|------|--------|
124
+ | `colorStart` | 主题起始颜色 | `String` | `'#52a0fd'` |
125
+ | `colorEnd` | 主题结束颜色(空字符串为纯色,否则渐变) | `String` | `'#00e2fa'` |
126
+ | `borderRadius` | 播放器圆角 | `String` | `'0px'` |
127
+
128
+ **主题示例:**
129
+
130
+ ```javascript
131
+ // 纯色主题
132
+ { colorStart: '#52a0fd', colorEnd: '' }
133
+
134
+ // 渐变主题
135
+ { colorStart: '#52a0fd', colorEnd: '#00e2fa' }
136
+ ```
137
+
138
+ ### 功能配置
139
+
140
+ | 参数 | 说明 | 类型 | 默认值 |
141
+ |-----|------|------|--------|
142
+ | `speed` | 是否支持快进快退 | `Boolean` | `true` |
143
+ | `speedRate` | 倍速选项 | `Array` | `['2.0', '1.5', '1.25', '1.0', '0.75', '0.5']` |
144
+ | `mirror` | 镜像画面 | `Boolean` | `false` |
145
+ | `lightOff` | 关灯模式 | `Boolean` | `false` |
146
+ | `webFullScreen` | 网页全屏 | `Boolean` | `false` |
147
+ | `playsinline` | iOS 内联播放(不全屏) | `Boolean` | `false` |
148
+
149
+ ### UI 配置
150
+
151
+ | 参数 | 说明 | 类型 | 默认值 |
152
+ |-----|------|------|--------|
153
+ | `playBtnPosition` | 中央播放按钮位置 | `String` | `'center'` |
154
+ | `playBtnAnimation` | 播放按钮切换动画 | `String` | `'scale'` |
155
+ | `controlBtns` | 显示的控制按钮 | `Array` | 见下方说明 |
156
+
157
+ **playBtnPosition 可选值:**
158
+ - `'center'` - 居中
159
+ - `'bottom-right'` - 右下角
160
+ - `'bottom-left'` - 左下角
161
+
162
+ **playBtnAnimation 可选值:**
163
+ - `'rotate'` - 旋转
164
+ - `'scale'` - 缩放
165
+ - `'flip'` - 翻转
166
+ - `'slide'` - 滑动
167
+ - `'none'` - 无动画
168
+
169
+ **controlBtns 默认值:**
170
+ ```javascript
171
+ [
172
+ 'audioTrack', // 音轨(预留)
173
+ 'quality', // 清晰度(预留)
174
+ 'speedRate', // 倍速
175
+ 'volume', // 音量
176
+ 'setting', // 设置
177
+ 'pip', // 画中画
178
+ 'pageFullScreen', // 网页全屏
179
+ 'fullScreen' // 全屏
180
+ ]
181
+ ```
182
+
183
+ ### 高级配置
184
+
185
+ | 参数 | 说明 | 类型 | 默认值 |
186
+ |-----|------|------|--------|
187
+ | `playRetryTimeout` | 播放重试超时时间(毫秒) | `Number` | `500` |
188
+
189
+ ## 🎮 事件
190
+
191
+ ### 原生视频事件
192
+
193
+ 组件支持所有原生 HTML5 视频事件:
194
+
195
+ | 事件名 | 说明 | 回调参数 |
196
+ |-------|------|---------|
197
+ | `loadstart` | 开始加载视频 | `Event` |
198
+ | `play` | 开始播放 | `Event` |
199
+ | `pause` | 暂停播放 | `Event` |
200
+ | `playing` | 播放中 | `Event` |
201
+ | `seeking` | 开始跳转 | `Event` |
202
+ | `seeked` | 跳转完成 | `Event` |
203
+ | `canplay` | 可以播放 | `Event` |
204
+ | `waiting` | 缓冲中 | `Event` |
205
+ | `durationchange` | 时长变化 | `Event` |
206
+ | `progress` | 下载进度 | `Event` |
207
+ | `timeupdate` | 播放进度更新 | `Event` |
208
+ | `ended` | 播放结束 | `Event` |
209
+ | `error` | 播放错误 | `Event` |
210
+ | `stalled` | 数据获取失败 | `Event` |
211
+
212
+ ### 自定义事件
213
+
214
+ | 事件名 | 说明 | 回调参数 |
215
+ |-------|------|---------|
216
+ | `mirrorChange` | 镜像状态改变 | `(isMirror: Boolean, video: HTMLVideoElement)` |
217
+ | `loopChange` | 循环状态改变 | `(isLoop: Boolean, video: HTMLVideoElement)` |
218
+ | `lightOffChange` | 关灯模式改变 | `(isLightOff: Boolean, video: HTMLVideoElement)` |
219
+
220
+ **使用示例:**
221
+
222
+ ```vue
223
+ <template>
224
+ <VueVideoPlus
225
+ v-bind="options"
226
+ @play="handlePlay"
227
+ @pause="handlePause"
228
+ @timeupdate="handleTimeUpdate"
229
+ @ended="handleEnded"
230
+ @mirrorChange="handleMirrorChange"
231
+ @loopChange="handleLoopChange"
232
+ />
233
+ </template>
234
+
235
+ <script setup>
236
+ const handlePlay = (event) => {
237
+ console.log('播放开始', event)
238
+ }
239
+
240
+ const handlePause = (event) => {
241
+ console.log('播放暂停', event)
242
+ }
243
+
244
+ const handleTimeUpdate = (event) => {
245
+ const currentTime = event.target.currentTime
246
+ console.log('当前播放时间:', currentTime)
247
+ }
248
+
249
+ const handleEnded = (event) => {
250
+ console.log('播放结束', event)
251
+ }
252
+
253
+ const handleMirrorChange = (isMirror, video) => {
254
+ console.log('镜像模式:', isMirror, video)
255
+ }
256
+
257
+ const handleLoopChange = (isLoop, video) => {
258
+ console.log('循环播放:', isLoop, video)
259
+ }
260
+ </script>
261
+ ```
262
+
263
+ ## 🎯 方法
264
+
265
+ 通过 `ref` 可以调用播放器实例的方法:
266
+
267
+ | 方法名 | 说明 | 参数 |
268
+ |-------|------|------|
269
+ | `play()` | 播放视频 | - |
270
+ | `pause()` | 暂停视频 | - |
271
+ | `togglePlay()` | 切换播放/暂停 | - |
272
+
273
+ **使用示例:**
274
+
275
+ ```vue
276
+ <template>
277
+ <VueVideoPlus ref="videoRef" v-bind="options" />
278
+ <button @click="handlePlay">播放</button>
279
+ <button @click="handlePause">暂停</button>
280
+ <button @click="handleToggle">切换</button>
281
+ </template>
282
+
283
+ <script setup>
284
+ import { ref } from 'vue'
285
+
286
+ const videoRef = ref(null)
287
+
288
+ const handlePlay = () => {
289
+ videoRef.value?.play()
290
+ }
291
+
292
+ const handlePause = () => {
293
+ videoRef.value?.pause()
294
+ }
295
+
296
+ const handleToggle = () => {
297
+ videoRef.value?.togglePlay()
298
+ }
299
+ </script>
300
+ ```
301
+
302
+ ## ⌨️ 快捷键
303
+
304
+ 播放器支持以下键盘快捷键(仅桌面端):
305
+
306
+ | 快捷键 | 功能 |
307
+ |-------|------|
308
+ | `空格` | 播放/暂停 |
309
+ | `←` | 快退 10 秒 |
310
+ | `→` | 快进 10 秒 |
311
+ | `→ 长按` | 5 倍速播放 |
312
+ | `↑` | 增加音量 |
313
+ | `↓` | 减少音量 |
314
+ | `F` | 全屏/退出全屏 |
315
+ | `ESC` | 退出网页全屏 |
316
+
317
+ ## 💡 完整示例
318
+
319
+ ```vue
320
+ <template>
321
+ <div class="video-container">
322
+ <VueVideoPlus
323
+ ref="videoPlayer"
324
+ v-bind="options"
325
+ @play="onPlay"
326
+ @pause="onPause"
327
+ @timeupdate="onTimeUpdate"
328
+ @ended="onEnded"
329
+ @mirrorChange="onMirrorChange"
330
+ @loopChange="onLoopChange"
331
+ @lightOffChange="onLightOffChange"
332
+ />
333
+ </div>
334
+ </template>
335
+
336
+ <script setup lang="ts">
337
+ import { ref, reactive } from 'vue'
338
+ import { VueVideoPlus } from 'vue-video-plus'
339
+ import 'vue-video-plus/dist/style.css'
340
+
341
+ const videoPlayer = ref()
342
+
343
+ const options = reactive({
344
+ // 基础配置
345
+ width: '1080px',
346
+ height: '608px',
347
+ src: 'https://example.com/video.mp4',
348
+ title: '精彩视频',
349
+ type: 'video/mp4',
350
+ poster: 'https://example.com/poster.jpg',
351
+
352
+ // 主题配置
353
+ colorStart: '#52a0fd',
354
+ colorEnd: '#00e2fa',
355
+ borderRadius: '8px',
356
+
357
+ // 播放配置
358
+ autoPlay: true,
359
+ muted: false,
360
+ volume: 0.5,
361
+ loop: false,
362
+ currentTime: 0,
363
+
364
+ // 功能配置
365
+ speed: true,
366
+ speedRate: ['2.0', '1.5', '1.25', '1.0', '0.75', '0.5'],
367
+ mirror: false,
368
+ lightOff: false,
369
+ webFullScreen: false,
370
+
371
+ // UI 配置
372
+ playBtnPosition: 'center',
373
+ playBtnAnimation: 'scale',
374
+ control: true,
375
+ controlBtns: [
376
+ 'speedRate',
377
+ 'volume',
378
+ 'setting',
379
+ 'pip',
380
+ 'pageFullScreen',
381
+ 'fullScreen'
382
+ ],
383
+
384
+ // 高级配置
385
+ playRetryTimeout: 500
386
+ })
387
+
388
+ // 事件处理
389
+ const onPlay = (event: Event) => {
390
+ console.log('视频开始播放', event)
391
+ }
392
+
393
+ const onPause = (event: Event) => {
394
+ console.log('视频暂停', event)
395
+ }
396
+
397
+ const onTimeUpdate = (event: Event) => {
398
+ const video = event.target as HTMLVideoElement
399
+ console.log('播放进度:', video.currentTime, '/', video.duration)
400
+ }
401
+
402
+ const onEnded = (event: Event) => {
403
+ console.log('视频播放结束', event)
404
+ }
405
+
406
+ const onMirrorChange = (isMirror: boolean, video: HTMLVideoElement) => {
407
+ console.log('镜像模式:', isMirror)
408
+ }
409
+
410
+ const onLoopChange = (isLoop: boolean, video: HTMLVideoElement) => {
411
+ console.log('循环播放:', isLoop)
412
+ }
413
+
414
+ const onLightOffChange = (isLightOff: boolean, video: HTMLVideoElement) => {
415
+ console.log('关灯模式:', isLightOff)
416
+ }
417
+
418
+ // 控制方法
419
+ const playVideo = () => {
420
+ videoPlayer.value?.play()
421
+ }
422
+
423
+ const pauseVideo = () => {
424
+ videoPlayer.value?.pause()
425
+ }
426
+
427
+ const togglePlayVideo = () => {
428
+ videoPlayer.value?.togglePlay()
429
+ }
430
+ </script>
431
+
432
+ <style scoped>
433
+ .video-container {
434
+ max-width: 1200px;
435
+ margin: 0 auto;
436
+ padding: 20px;
437
+ }
438
+
439
+ /* 移动端适配 */
440
+ @media (max-width: 768px) {
441
+ .video-container {
442
+ padding: 10px;
443
+ }
444
+ }
445
+ </style>
446
+ ```
447
+
448
+ ## 🎨 主题示例
449
+
450
+ ### 纯色主题
451
+
452
+ ```javascript
453
+ // 经典蓝
454
+ { colorStart: '#52a0fd', colorEnd: '' }
455
+
456
+ // 玫瑰红
457
+ { colorStart: '#eb3b5a', colorEnd: '' }
458
+
459
+ // 薄荷绿
460
+ { colorStart: '#00b894', colorEnd: '' }
461
+ ```
462
+
463
+ ### 渐变主题
464
+
465
+ ```javascript
466
+ // 科技蓝(默认)
467
+ { colorStart: '#52a0fd', colorEnd: '#00e2fa' }
468
+
469
+ // 日落橙
470
+ { colorStart: '#ff6b6b', colorEnd: '#ffa500' }
471
+
472
+ // 炫彩紫
473
+ { colorStart: '#667eea', colorEnd: '#764ba2' }
474
+
475
+ // 海洋蓝
476
+ { colorStart: '#4b7bec', colorEnd: '#3867d6' }
477
+ ```
478
+
479
+ ## 📱 移动端适配
480
+
481
+ 播放器自动检测设备类型并适配:
482
+
483
+ - **桌面端**:使用配置的 `width` 和 `height`
484
+ - **移动端**:自动设置为 `100%` 宽度,高度按 16:9 比例计算
485
+ - **触摸支持**:移动端使用原生控制器
486
+ - **响应式**:窗口大小变化时自动调整
487
+
488
+ ## 🔧 常见问题
489
+
490
+ ### 1. 视频无法自动播放?
491
+
492
+ 浏览器的自动播放策略要求首次自动播放必须静音。播放器已内置处理:
493
+ - 首次自动播放会先静音
494
+ - 用户交互后自动恢复音量
495
+ - 或者设置 `autoPlay: false` 让用户手动播放
496
+
497
+ ### 2. 拖动进度条时音量闪烁?
498
+
499
+ 这个问题已在 v1.2.4 版本修复,确保使用最新版本。
500
+
501
+ ### 3. 如何支持 HLS(m3u8)视频?
502
+
503
+ 播放器支持浏览器原生支持的 HLS 格式(Safari),其他浏览器需要使用 hls.js:
504
+
505
+ ```javascript
506
+ import Hls from 'hls.js'
507
+
508
+ if (Hls.isSupported()) {
509
+ const hls = new Hls()
510
+ hls.loadSource('https://example.com/video.m3u8')
511
+ hls.attachMedia(videoElement)
512
+ }
513
+ ```
514
+
515
+ ### 4. 如何自定义控制器样式?
516
+
517
+ 使用深度选择器覆盖样式:
518
+
519
+ ```css
520
+ :deep(.player-wrap) {
521
+ /* 自定义样式 */
522
+ }
523
+
524
+ :deep(.control-tool) {
525
+ background: rgba(0, 0, 0, 0.8);
526
+ }
527
+ ```
528
+
529
+ ## 📄 License
530
+
531
+ MIT License
532
+
533
+ ## 👨‍💻 作者
534
+
535
+ **鱿鱼溪学院**
536
+
537
+ ## 🤝 贡献
538
+
539
+ 欢迎提交 Issue 和 Pull Request!
540
+
541
+ ---
542
+
543
+ <div align="center">
544
+ 如果这个项目对你有帮助,欢迎 ⭐ Star 支持一下!
545
+ </div>