UNPKG

ps-tcplayer

Version:

Tencent Cloud Player component with Vue2/Vue3 compatibility

616 lines (487 loc) 15.6 kB
# ps-tcplayer 基于腾讯云视频播放器(TCPlayer)封装的Vue组件库,同时支持Vue2和Vue3,提供丰富的功能扩展和便捷的API。 ## 特性 - 🔄 同时兼容Vue2和Vue3,基于vue-demi实现 - 🎞️ 完整支持腾讯云视频播放器原生功能 - 🧩 提供丰富的扩展组件(倍速播放、清晰度切换、记忆播放等) - 📱 响应式设计,适配各种屏幕尺寸 - 🛠️ 简单易用的API,灵活的配置选项 - 🌟 支持SDK形式引入,可在Vue、原生JS等环境使用 ## 安装 ```bash npm install ps-tcplayer --save # 或 yarn add ps-tcplayer # 或 pnpm add ps-tcplayer ``` ## 使用方法 ### Vue2 项目使用说明 在 Vue2 项目中使用本组件库需要安装 `@vue/composition-api` 与 `vue-demi`: Vue2.7 不需要安装 `@vue/composition-api` ```bash # 安装 @vue/composition-api 依赖 npm install @vue/composition-api vue-demi --save ``` 然后在项目的入口文件(通常是 main.js)中添加: ```js // Vue2 项目入口文件 (main.js) import Vue from 'vue' import VueCompositionAPI from '@vue/composition-api' import { tcplayer } from 'ps-tcplayer' // 在使用任何 vue-demi 相关功能之前,必须先安装 VueCompositionAPI Vue.use(VueCompositionAPI) // 之后再安装 tcplayer 组件 Vue.use(tcplayer) new Vue({ // ... }).$mount('#app') ``` 如果使用的是局部注册方式,确保已安装 `@vue/composition-api`: ```js // Vue2 组件文件 import Vue from 'vue' import VueCompositionAPI from '@vue/composition-api' import { tcplayer } from 'ps-tcplayer' // 确保在整个项目中至少调用过一次 Vue.use(VueCompositionAPI) Vue.use(VueCompositionAPI) export default { components: { PsTcPlayer: tcplayer }, // ... } ``` ### 全局注册 ```js // Vue 2 import Vue from 'vue' import { tcplayer } from 'ps-tcplayer' Vue.use(tcplayer) // Vue 3 import { createApp } from 'vue' import { tcplayer } from 'ps-tcplayer' import App from './App.vue' const app = createApp(App) app.use(tcplayer) app.mount('#app') ``` ### 局部注册 ```js import { tcplayer } from 'ps-tcplayer' export default { components: { PsTcPlayer: tcplayer } } ``` ### SDK形式使用 ps-tcplayer提供了SDK模式,可以在各种环境中使用,包括原生JS、Vue2、Vue3等。 #### 引入SDK SDK提供两种版本: - **标准版**: 需要外部提供Vue和vue-demi - **独立版(Standalone)**: 所有依赖打包在内,适合无Vue环境 ##### 通过NPM使用 ```js // 在Vue项目中安装(标准版) npm install ps-tcplayer vue vue-demi // 在Vue2项目中还需要 npm install @vue/composition-api ``` ```js // 标准版(需要Vue环境) import PsTcPlayer from 'ps-tcplayer/dist/sdk/ps-tcplayer.js' // 独立版(适合无Vue环境) import PsTcPlayer from 'ps-tcplayer/dist/sdk-standalone/ps-tcplayer.standalone.js' // 检查环境 console.log(`当前Vue版本: ${PsTcPlayer.version}`) console.log(`是否Vue2: ${PsTcPlayer.isVue2}`) console.log(`是否Vue3: ${PsTcPlayer.isVue3}`) // 初始化播放器 const playerId = PsTcPlayer.init('#player-container', { tconfig: { m3u8: 'https://example.com/video.m3u8', autoplay: false, poster: 'https://example.com/poster.jpg' }, showNext: true, bulletScreen: true, bulletContent: '欢迎使用' }) // 销毁播放器 PsTcPlayer.destroy(playerId) ``` ##### 通过CDN引入(依赖模式) ```html <!-- 引入Vue --> <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script> <!-- 引入vue-demi --> <script src="https://unpkg.com/vue-demi/lib/index.iife.js"></script> <!-- 引入播放器SDK --> <script src="https://unpkg.com/ps-tcplayer/dist/sdk/ps-tcplayer.js"></script> <div id="player-container" style="width: 800px; height: 450px;"></div> <script> // 初始化播放器 const playerId = PsTcPlayer.init('#player-container', { tconfig: { m3u8: 'https://example.com/video.m3u8', autoplay: false } }) // 使用完后销毁 // PsTcPlayer.destroy(playerId) </script> ``` ##### 通过CDN引入(无Vue环境) ```html <!-- 无Vue环境,使用独立版 --> <script src="https://unpkg.com/ps-tcplayer/dist/sdk-standalone/ps-tcplayer.standalone.js"></script> <div id="player-container" style="width: 800px; height: 450px;"></div> <script> // 初始化播放器 - 无需引入Vue和vue-demi const playerId = PsTcPlayer.init('#player-container', { tconfig: { m3u8: 'https://example.com/video.m3u8', autoplay: false } }) </script> ``` #### SDK API | 方法 | 参数 | 返回值 | 说明 | | --- | --- | --- | --- | | `init` | `selector: string, config: Object` | `string` | 初始化播放器,返回实例ID | | `destroy` | `instanceId: string` | `boolean` | 销毁播放器实例 | | `getInstance` | `instanceId: string` | `Object` | 获取播放器实例 | | `getAllInstances` | - | `string[]` | 获取所有播放器实例ID | #### 静态属性 | 属性 | 类型 | 说明 | | --- | --- | --- | | `version` | `string` | 当前Vue版本 | | `isVue2` | `boolean` | 是否Vue2环境 | | `isVue3` | `boolean` | 是否Vue3环境 | | `TcPlayerComponent` | `Object` | 扩展组件集合 | ### 基础用法 ```html <template> <div style="width: 800px; height: 450px;"> <ps-tc-player :config="playerConfig" /> </div> </template> <script> export default { data() { return { playerConfig: { // 腾讯云播放器配置 tconfig: { m3u8: 'https://example.com/video.m3u8', // 视频地址 autoplay: false, // 自动播放 poster: 'https://example.com/poster.jpg', // 视频封面 plugins: { ContinuePlay: { auto: true }, // 启用记忆播放 ContextMenu: { open: true } // 启用右键菜单 } }, // 扩展功能配置 showNext: true, // 显示下一个视频按钮 showPre: true, // 显示上一个视频按钮 htime: 0, // 记忆播放时间点(秒) bulletScreen: true, // 启用跑马灯 bulletContent: '欢迎使用' // 跑马灯内容 } } }, methods: { // 功能回调方法 onnext() { console.log('播放下一个视频') }, onpre() { console.log('播放上一个视频') } } } </script> ``` ## 配置选项 ### 主要配置 | 属性 | 类型 | 说明 | | --- | --- | --- | | `tconfig` | Object | 腾讯云播放器原生配置,详见[腾讯云播放器文档](https://cloud.tencent.com/document/product/881/20207) | | `onnext` | Function | 下一个视频回调函数 | | `onpre` | Function | 上一个视频回调函数 | | `showNext` | Boolean | 是否显示下一个按钮 | | `showPre` | Boolean | 是否显示上一个按钮 | | `htime` | Number | 记忆播放时间点(秒) | | `bulletScreen` | Boolean | 是否启用跑马灯 | | `bulletContent` | String | 跑马灯内容 | | `star` | Boolean | 是否启用评分功能 | | `upStar` | Function | 评分回调函数 | ### 播放器事件 组件会自动监听并转发以下播放器事件: - `onready`: 播放器准备就绪 - `onerror`: 发生错误 - `ontimeupdate`: 播放进度更新 - `onpause`: 暂停播放 - `onplay`: 开始播放 - `onended`: 播放结束 - `onwaiting`: 缓冲等待 - `onsnapshoted`: 截图完成 ## 扩展组件 ps-tcplayer提供了以下扩展组件,可以通过TcPlayerComponent访问: ```js import { TcPlayerComponent } from 'ps-tcplayer' ``` ### 可用组件列表 - `PlayerNextComponent`: 下一个视频控制 - `PlayPrevComponent`: 上一个视频控制 - `MemoryPlayComponent`: 记忆播放功能 - `QualityComponent`: 清晰度切换 - `RateComponent`: 倍速播放 - `BulletScreenComponent`: 跑马灯功能 - `CountdownComponent`: 倒计时功能 - `SnapshotComponent`: 视频截图 - `StarRatingComponent`: 视频评分 ### 直接使用组件示例 ```js // 获取播放器实例后使用扩展组件 const player = this.$refs.playerRef.$player // 初始化倍速播放组件 const rateComponent = new TcPlayerComponent.RateComponent(player) // 设置播放速率 rateComponent.setRate(2.0) ``` ### 自定义组件配置 通过配置可以自定义扩展组件。优化后的插件系统支持更灵活的配置方式,并正确区分了腾讯云播放器原生插件和我们的自定义插件: #### 基本配置方式 ```js const playerConfig = { tconfig: { m3u8: 'https://example.com/video.m3u8', // 腾讯云播放器原生插件配置 plugins: { ContinuePlay: { auto: true // 记忆播放 }, ContextMenu: { open: true // 右键菜单 }, ProgressMarker: false // 进度标记 }, // 自定义插件配置 customPlugins: { // 布尔值配置:控制插件是否启用 QualityComponent: true, // 启用分辨率切换 RateComponent: false, // 禁用倍速播放 SnapshotComponent: true, // 启用截图功能 // 对象配置:详细控制插件行为 BulletScreenComponent: { enabled: true, args: ['自定义弹幕内容', { fontSize: '24px', color: 'red' }, 'random'] } } }, // 或者也可以直接在根级配置自定义插件 plugins: { QualityComponent: true, RateComponent: false } } ``` #### 两种配置位置 自定义插件支持两种配置位置: 1. `config.tconfig.customPlugins` - 推荐方式,结构更清晰 2. `config.plugins` - 简化方式,向下兼容 #### 默认插件列表 优化后的插件系统包含以下默认插件,除非明确禁用,否则都会默认启用: | 插件名称 | 说明 | 默认状态 | | --- | --- | --- | | `MemoryPlayComponent` | 记忆播放功能 | 默认启用 | | `QualityComponent` | 分辨率切换 | 默认启用 | | `RateComponent` | 倍速播放 | 默认启用 | | `SnapshotComponent` | 视频截图 | 默认启用 | | `BulletScreenComponent` | 跑马灯功能 | 默认启用 | | `PlayerNextComponent` | 下一个视频控制 | 根据配置启用 | | `PlayPrevComponent` | 上一个视频控制 | 根据配置启用 | | `CountdownComponent` | 倒计时功能 | 根据配置启用 | #### 完整配置示例 ```js const playerConfig = { tconfig: { m3u8: 'https://example.com/video.m3u8', // 腾讯云播放器原生插件配置 plugins: { ContinuePlay: { auto: true }, ContextMenu: { levelSwitch: { open: true, switchingText: '正在为您切换到', switchedText: '已为您切换到', switchErrorText: '切换失败' } }, ProgressMarker: false }, // 自定义插件配置 customPlugins: { // 分辨率配置 QualityComponent: { enabled: true, args: [null, 'HD', '高清'] }, // 倍速播放配置 RateComponent: { enabled: true }, // 截图功能配置 SnapshotComponent: { enabled: true }, // 跑马灯配置 BulletScreenComponent: { enabled: true, args: ['学习成就梦想', { fontSize: '16px', color: '#fff' }, 'random'] }, // 下一个视频按钮 PlayerNextComponent: { enabled: false // 禁用下一个视频按钮 }, // 上一个视频按钮 PlayPrevComponent: { enabled: false // 禁用上一个视频按钮 }, // 倒计时功能 CountdownComponent: { enabled: false // 禁用倒计时 } } }, // 传统配置方式仍然支持 showNext: true, bulletScreen: true, bulletContent: '欢迎使用', htime: 120 // 记忆播放时间点 } ``` #### 配置优先级 1. `tconfig.customPlugins` 或 `plugins` 中的具体配置优先级最高 2. 传统的配置属性(如 `bulletScreen`, `showNext` 等)作为后备 3. 系统默认配置优先级最低 #### 禁用所有插件 如果需要禁用所有默认插件,可以这样配置: ```js const playerConfig = { tconfig: { m3u8: 'https://example.com/video.m3u8', customPlugins: { MemoryPlayComponent: false, QualityComponent: false, RateComponent: false, SnapshotComponent: false, BulletScreenComponent: false, PlayerNextComponent: false, PlayPrevComponent: false, CountdownComponent: false } } } ``` #### 重要提醒 ⚠️ **注意**:请不要将自定义插件配置(如 `QualityComponent`、`RateComponent` 等)放在 `tconfig.plugins` 中,这会导致腾讯云播放器尝试加载不存在的原生插件而报错。 - ✅ **正确**:使用 `tconfig.customPlugins` 或 `plugins` 配置自定义插件 - ❌ **错误**:将自定义插件配置放在 `tconfig.plugins` 中 ## 在组合式API中使用 ps-tcplayer完全支持Vue3组合式API: ```html <template> <div style="width: 800px; height: 450px;"> <ps-tc-player :config="playerConfig" @ready="onPlayerReady" /> </div> </template> <script setup> import { ref } from 'vue' import { tcplayer } from 'ps-tcplayer' const playerConfig = ref({ tconfig: { m3u8: 'https://example.com/video.m3u8', autoplay: false }, showNext: true, bulletScreen: true, bulletContent: '欢迎使用' }) const onPlayerReady = (player) => { console.log('播放器已准备就绪', player) // 可以在这里访问播放器实例进行操作 } </script> ``` ### Vue2中的组合式API用法 在Vue2项目中,借助`@vue/composition-api`,也可以使用类似的组合式API风格: ```html <template> <div style="width: 800px; height: 450px;"> <ps-tc-player :config="playerConfig" @ready="onPlayerReady" /> </div> </template> <script> import Vue from 'vue' import VueCompositionAPI, { ref, onMounted } from '@vue/composition-api' import { tcplayer } from 'ps-tcplayer' // 确保已安装VueCompositionAPI Vue.use(VueCompositionAPI) export default { components: { PsTcPlayer: tcplayer }, setup() { const playerConfig = ref({ tconfig: { m3u8: 'https://example.com/video.m3u8', autoplay: false }, showNext: true, bulletScreen: true, bulletContent: '欢迎使用Vue2组合式API' }) const onPlayerReady = (player) => { console.log('播放器已准备就绪', player) // 可以在这里访问播放器实例进行操作 } onMounted(() => { console.log('组件已挂载') }) return { playerConfig, onPlayerReady } } } </script> ``` ## 开发与构建 ```bash # 安装依赖 npm install # 开发模式 npm run dev # 构建生产版本 npm run build ``` ## 兼容性说明 - Vue 2.6.0+(需要安装 `@vue/composition-api` >= 1.0.0-rc.1) - Vue 3.0.0+ - 基于vue-demi实现跨版本兼容(vue-demi >= 0.13.0### vue-demi 版本说明 `ps-tcplayer` 依赖 `vue-demi` 实现Vue2和Vue3的跨版本兼容。`vue-demi` 会根据项目中安装的Vue版本自动适配API: - 在 Vue2 项目中:将使用 `@vue/composition-api` 提供的API - 在 Vue3 项目中:将直接使用Vue3原生的组合式API 如果在Vue2项目中使用时遇到报错,请检查: 1. 是否已安装 `@vue/composition-api` 2. 是否在使用组件前调用了 `Vue.use(VueCompositionAPI)` 3. 依赖版本是否兼容(建议使用最新版本) ## 许可证 ISC