uniapp - 腾讯云点播小程序插件

欢迎关注微信公众号:FSA全栈行动 👋

一、简介

微信小程序播放教育类视频要求具备有相关资质,但这些资质一般公司很难短时间申请下来(甚至有的公司压根就申请不了),而【短视频播放器小程序插件】含有《信息网络传播视听节目许可证》的资质证书备案,可以利用该插件来解决资质问题,相关截图如下:

图片来源:https://cloud.tencent.com/document/product/266/36849

采购流程于技术无关,以下内容着重讲解如何集成该微信小程序插件。

注:【短视频播放器小程序插件】授权费 3 万/年(有 14 天试用 Licence),如果有购买腾讯云其他服务的话,满足一定条件,会赠送 1 年 免费使用 Licence,详情找腾讯云客服咨询(2022 年 04 月如此,赠送情况可能随时会变)。

二、使用

  • 激活:在腾讯云控制台激活插件 Licence 之后,才能正常使用该播放器插件。
  • appid:后面插件用到的 appid 需要在【腾讯云控制台】>账号信息中查看获取。
  • 云点播短视频播放器-开发文档:https://mp.weixin.qq.com/wxopen/plugindevdoc?appid=wx116d0dd5e6a39ac7&lang=zh_CN

1、绑定插件

因为微信小程序插件没有实质代码或 SDK,所以无法在本地添加集成,需要在微信小程序平台,将 小程序AppID插件AppID 进行绑定(即给小程序添加插件),开发者工具在编译时会自动引入,绑定有 2 种方式:

  • 方式 1:登录微信小程序平台,在 设置-第三方设置 中找到 添加插件,输入插件 AppID(wx116d0dd5e6a39ac7 )搜索并添加:

  • 方式 2:在 云点播短视频播放器文档 页面直接点击 添加插件

云点播短视频播放器文档:https://mp.weixin.qq.com/wxopen/pluginbasicprofile?action=intro&appid=wx116d0dd5e6a39ac7&lang=zh_CN

2、集成插件

微信小程序原生工程需要 在 app.json 里声明使用的插件及版本,对应到 uniapp 工程,则是在 manifest.json 文件中微信小程序特有配置(即 mp-weixin 节点) 处,进行 plugins 配置声明:

// manifest.json 源码视图
{/* 小程序特有相关 */"mp-weixin": {"appid": "wxxxxxxxxxxx","plugins": {// 云点播短视频播放器// 文档:https://mp.weixin.qq.com/wxopen/plugindevdoc?appid=wx116d0dd5e6a39ac7&token=1835838344&lang=zh_CN"cloudPlayer": {"version": "0.1.2","provider": "wx116d0dd5e6a39ac7"}}}
}

manifest.json 配置项说明:https://uniapp.dcloud.io/collocation/manifest.html

3、页面内使用播放器

微信小程序原生工程需要 在 页面的 xxxx.json 里声明,对应到 uniapp 工程,则是在 pages.json 文件中,在需要使用插件的 页面的 style 的微信小程序特有配置(即 mp-weixin 节点)处,进行 usingComponents 配置声明:

// pages.json
{"pages": [...,{"path": "pages/course/course","style": {"navigationBarTitleText": "课程","mp-weixin": {// 云点播短视频播放器"usingComponents": {"cloud-player": "plugin://cloudPlayer/player"}}}}],"globalStyle": {...}
}

pages.json 配置项说明:https://uniapp.dcloud.io/collocation/pages.html#style

声明完哪个页面需要使用插件播放器之后,就可以在那个页面的布局文件中使用插件播放器了:

// 在wxml里插入
<cloud-playerappid="xxxxx"fileid="xxxxxxxx"playerid="myPlayerId"
></cloud-player>

注:微信小程序原生工程中,页面是 wxml 文件,uniapp 工程中是 vue 文件。另外,目前这种声明方式只对单个配置过的页面有效,也就是说,如果其他页面也需要使用插件播放器,还需要在其他页面的style中单独进行配置,这就很麻烦了,不过现在不用烦恼,后面会解决这个问题。

4、组件内使用播放器

为了功能复用,以及方便代码维护,实际开发中,往往会自定义组件,对常用的布局、功能进行封装。微信小程序原生工程可以在自定义组件的 json 文件中进行配置,跟页面相同的 usingComponents 配置即可:

官方的 云点播短视频播放器-开发文档 只说明在了如何在网页中使用插件,但没有对组件中如何使用插件进行说明,很无语,希望后续官方能完善一下。另外,这是我发起工单询问之后,腾讯技术售后给我的 demo 工程中的代码,是否有效暂不确定 -_-!

uniapp 遵循 vue 规范,想要在自定义组件要使用其他自定义组件,需要在 vue 文件中的 <script> 标签中,配置 components ,例如:

<script>
import leadHeader from "./lead-header.vue";
export default {components: {leadHeader,},
};
</script>

那么依葫芦画瓢,是否也可以这样配置插件播放器呢?例如:

<script>
import cloudPlayer from "plugin://cloudPlayer/player";
export default {components: {cloudPlayer,},
};
</script>

可惜不行,编译时会报错 Error: Can't resolve 'plugin://cloudPlayer/player',而且 uniapp 也没有提供对应的配置项。不过呢,uniapp 是可以直接使用微信小程序自定义组件的,这是否意味着,可以将用到插件的自定义组件改用 wxml+wcss 的方式进行编写,然后再引入到 uniapp 工程中呢?

uniapp 使用小程序原生组件:https://uniapp.dcloud.io/tutorial/miniprogram-subject.html#小程序自定义组件支持

仔细想想,这个方案是有问题的。首先,对不熟悉微信小程序原生开发的人很不友好,其次,wxcomponents 目录下的小程序组件,要使用的话,还需要在 pages.json 中进行配置,这意味着 uniapp 自定义组件中是不能直接使用小程序组件的,无法解决 组件中引入组件 的情况,所以,这个方案不行。难道 uniapp 对此就无解了吗?非也,仔细阅读上面的 uniapp 官方文档,可以找到这么一句:当需要在 vue 组件中使用小程序组件时,注意在 pages.json 的 globalStyle 中配置 usingComponents,而不是页面级配置

于是,在 pages.json 文件中做如下修改:

// pages.json
{"pages": [...,{"path": "pages/course/course","style": {"navigationBarTitleText": "课程",// "mp-weixin": {//  "usingComponents": {//    "cloud-player": "plugin://cloudPlayer/player"//  }// }}}],"globalStyle": {// #ifdef MP-WEIXIN"usingComponents": {"cloud-player": "plugin://cloudPlayer/player"},// #endif...}
}

可以发现,我把页面 style 下的 mp-weixin 配置给注释掉了,原因是在 globalStyle 下配置了 usingComponents 之后,就可以全局使用插件播放器,不管是页面或是组件中,都不需要再单独去配置 usingComponents,这样就可以在项目中随心所欲地使用播放器插件了,nice~

5、获取播放器 Context

当需要在业务逻辑中控制视频播放或暂停时,会用到 videoContext,如果使用默认的 <video> 标签,那么可以通过 uni.createVideoContext(videoId, this) 来获取视频播放器上下文,再通过上下文执行 play()pause() 等方法,即可控制视频播放,详细说明见 uniapp 官方文档:

createVideoContext:https://uniapp.dcloud.io/api/media/video-context.html#createvideocontext

但是,uni.createVideoContext(videoId, this) 对腾讯云点播插件无效,需改用 requirePlugin(pluginName).getContext(videoId) 来获取,例如:

const plugin = requirePlugin("cloudPlayer");
let player = plugin.getContext("myVideo");

该解决方案源自一篇社区帖子 《腾讯云点播 wx.createVideoContext(“myVideo”).pause()无法暂停》:https://developers.weixin.qq.com/community/develop/doc/0004eae9e6cd08e31d6d827e657800

三、封装

腾讯云点播插件 <cloud-player> 与默认的 <video> 标签在使用上差异不多,就以下几点:

  • <cloud-player> 使用时需要配置 appid 属性。
  • <cloud-player> 使用时需要配置 widthheight 属性。
  • <cloud-player> 视频源属性是 fileid<video> 视频源属性是 src
  • <cloud-player> id 属性是 playerid<video> id 属性是 id
  • <cloud-player> 上下文通过 requirePlugin(pluginName).getContext(videoId) 获取,<video> 上下文通过 uni.createVideoContext(videoId, this) 获取。

所以,为了代码可维护性,统一模板代码,我们可以自定义组件(名为 video-mix)对两者进行封装,用法上跟 <video> 标签差不多:

<video-mixvideoId="videoPlayer"width="710rpx"height="400rpx":fileid="curPlayEpisode.code"src="http://xxxx/video1.mp4":poster="curPlayEpisode.cover_img":controls="true":autoplay="true":show-progress="showProgress"@error="onVideoError"@controlstoggle="onVideoControlsToggle"
></video-mix>

注:我个人设想在微信小程序上使用腾讯云点播插件播放视频,在其他平台上还是继续使用 <video> 标签,于是设计为 fileidsrc 共存。

以下是 video-mix.vue 的完整代码:

// video-mix.vue
<template><view class="video-mix-container"><!-- #ifdef MP-WEIXIN --><cloud-playerappid="GitLqr亲自打码":id="videoId":playerid="videoId":width="width":height="height":fileid="fileid":autoplay="autoplay":loop="loop":muted="muted":controls="controls":danmu-list="danmuList":danmu-btn="danmuBtn":enable-danmu="enableDanmu":page-gesture="pageGesture":show-progress="showProgress":show-fullscreen-btn="showFullscreenBtn":show-play-btn="showPlayBtn":show-center-play-btn="showCenterPlayBtn":enable-progress-gesture="enableProgressGesture":object-fit="objectFit":poster="poster":show-mute-btn="showMuteBtn":title="title":play-btn-position="playBtnPosition":enable-play-gesture="enablePlayGesture":auto-pause-if-navigate="autoPauseIfNavigate":auto-pause-if-open-native="autoPauseIfOpenNative":vslide-gesture="vslideGesture":vslide-gesture-in-fullscreen="vslideGestureInFullscreen":ad-unit-id="adUnitId":poster-for-crawler="posterForCrawler"@play="onPlay"@pause="onPause"@ended="onEnded"@timeupdate="onTimeUpdate"@fullscreenchange="onFullScreenChange"@waiting="onWaiting"@error="onError"@progress="onProgress"@loadedmetadata="onLoadedMetaData"@controlstoggle="onControlsToggle"></cloud-player><!-- #endif --><!-- #ifndef MP-WEIXIN --><video:id="videoId":style="{ width: width, height: height }":src="src":autoplay="autoplay":loop="loop":muted="muted":controls="controls":danmu-list="danmuList":danmu-btn="danmuBtn":enable-danmu="enableDanmu":page-gesture="pageGesture":show-progress="showProgress":show-fullscreen-btn="showFullscreenBtn":show-play-btn="showPlayBtn":show-center-play-btn="showCenterPlayBtn":enable-progress-gesture="enableProgressGesture":object-fit="objectFit":poster="poster":show-mute-btn="showMuteBtn":title="title":play-btn-position="playBtnPosition":enable-play-gesture="enablePlayGesture":auto-pause-if-navigate="autoPauseIfNavigate":auto-pause-if-open-native="autoPauseIfOpenNative":vslide-gesture="vslideGesture":vslide-gesture-in-fullscreen="vslideGestureInFullscreen":ad-unit-id="adUnitId":poster-for-crawler="posterForCrawler"@play="onPlay"@pause="onPause"@ended="onEnded"@timeupdate="onTimeUpdate"@fullscreenchange="onFullScreenChange"@waiting="onWaiting"@error="onError"@progress="onProgress"@loadedmetadata="onLoadedMetaData"@controlstoggle="onControlsToggle"></video><!-- #endif --></view>
</template><script>
export default {name: "video-mix",props: {videoId: {type: String,default: "",},width: {type: String,default: "750rpx",},height: {type: String,default: "420rpx",},fileid: {type: String,default: "",},src: {type: String,default: "",},autoplay: {type: Boolean,default: false,},loop: {type: Boolean,default: false,},muted: {type: Boolean,default: false,},initialTime: {type: Number,default: 0,},controls: {type: Boolean,default: true,},danmuList: {type: Array,default() {return [];},},danmuBtn: {type: Boolean,default: false,},enableDanmu: {type: Boolean,default: false,},pageGesture: {type: Boolean,default: false,},// direction: {// 	type: Number,// 	default: undefined,// },showProgress: {type: Boolean,default: true,},showFullscreenBtn: {type: Boolean,default: true,},showPlayBtn: {type: Boolean,default: true,},showCenterPlayBtn: {type: Boolean,default: true,},enableProgressGesture: {type: Boolean,default: true,},objectFit: {type: String,default: "contain",},poster: {type: String,default: "",},showMuteBtn: {type: Boolean,default: false,},title: {type: String,default: "",},playBtnPosition: {type: String,default: "bottom",},enablePlayGesture: {type: Boolean,default: false,},autoPauseIfNavigate: {type: Boolean,default: true,},autoPauseIfOpenNative: {type: Boolean,default: true,},vslideGesture: {type: Boolean,default: false,},vslideGestureInFullscreen: {type: Boolean,default: true,},adUnitId: {type: String,default: "",},posterForCrawler: {type: String,default: "",},},emits: ["play","pause","ended","timeupdate","fullscreenchange","waiting","error","progress","loadedmetadata","controlstoggle",],data() {return {isVideoPlaying: false,videoContext: null,};},methods: {onPlay(e) {this.isVideoPlaying = true;this.$emit("play", e);},onPause(e) {this.isVideoPlaying = false;this.$emit("pause", e);},onEnded(e) {this.isVideoPlaying = false;this.$emit("ended", e);},onTimeUpdate(e) {this.$emit("timeupdate", e);},onFullScreenChange(e) {this.$emit("fullscreenchange", e);},onWaiting(e) {this.$emit("waiting", e);},onError(e) {this.isVideoPlaying = false;this.$emit("error", e);},onProgress(e) {this.$emit("progress", e);},onLoadedMetaData(e) {this.$emit("loadedmetadata", e);},onControlsToggle(e) {this.$emit("controlstoggle", e);},isPlaying() {return this.isVideoPlaying;},play() {this._log("play");this._fetchVideoContext().then(() => {this.videoContext.play();});},pause() {this._log("pause");this._fetchVideoContext().then(() => {this.videoContext.pause();});},stop() {this._log("stop");this._fetchVideoContext().then(() => {this.videoContext.stop();});},_fetchVideoContext() {const operation = () =>new Promise((resolve, reject) => {if (!this.videoContext) {// #ifdef MP-WEIXIN// 这里的cloudPlayer是在json配置上引入的插件子组件名const plugin = requirePlugin("cloudPlayer");console.log('requirePlugin("cloudPlayer"): ', plugin);this.videoContext = plugin.getContext(this.videoId);console.log(`plugin.getContext(${this.videoId}): `,this.videoContext);// #endif// #ifndef MP-WEIXIN// this是在自定义组件下,当前组件实例的this,以操作组件内 video 组件(在自定义组件中药加上this,如果是普通页面即不需要加)this.videoContext = uni.createVideoContext(this.videoId, this);console.log("uni.createVideoContext(this.videoId, this): ",this.videoContext);// #endif}if (this.videoContext) {resolve(this.videoContext);} else {reject("videoContext is empty");}});return new Promise((resolve, reject) => {this.$utils.promiseRetry(operation, 500, 3).then(resolve).catch(reject);});},_log(msg) {console.log(`video-mix : ${msg}`);},},
};
</script><style lang="scss" scoped>
.video-mix-container {
}
</style>

上述代码中用到的工具方法:

// utils.js
/* Promise 包装好的 setTimeout */
export const promiseWait = (ms) => new Promise((r) => setTimeout(r, ms));
/*** Promise 重试* @param {Function} operation 操作函数* @param {Number} delay 时间间隔* @param {Number} retries 重试次数*/
export const promiseRetry = (operation, delay, retries) =>new Promise((resolve, reject) => {return operation().then(resolve).catch((reason) => {if (retries > 0) {return promiseWait(delay).then(promiseRetry.bind(null, operation, delay, retries - 1)).then(resolve).catch(reject);}return reject(reason);});});

如果文章对您有所帮助, 请不吝点击关注一下我的微信公众号:FSA全栈行动, 这将是对我最大的激励. 公众号不仅有Android技术, 还有iOS, Python等文章, 可能有你想要了解的技能知识点哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/253556.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

免费视频直播、点播H5播放器SkeyeWebPlayer适配移动端

免费视频直播、点播H5播放器SkeyeWebPlayer适配排除&#xff0c;移动端&#xff0c;常见移动端Web页面问题及解决方案 SkeyeVSS其独创的ws-rtsp流媒体直播技术&#xff0c;兼容传统安防流媒体的同时&#xff0c;不需要安装浏览器插件&#xff0c;解决互联网接入安防监控延迟高…

JAVA在线教育视频点播学习系统毕业设计 开题报告

本文给出的java毕业设计开题报告&#xff0c;仅供参考&#xff01;&#xff08;具体模板和要求按照自己学校给的要求修改&#xff09; 选题目的和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于java的视频点播系统&#xff0c;系统整体使用了基于浏览的javaMy…

如何搭建视频点播服务

要搭建一套高效、稳定、可靠的视频点播服务&#xff0c;通常考虑视频资源的数量、视频资源的格式、用户量和并发量等方面因素&#xff0c;具体包括&#xff1a; 1)视频资源的数量和格式&#xff0c;以及增量情况&#xff1b; 2)播放终端的适配&#xff1b; 3)播放并发量、访问鉴…

直播和点播的区别

先总述直播和点播的不同点&#xff1a; 一、时效性要求不同 二、内容存在形式不同 三、运作流程不同 四、常见场景 五、技术架构 很多时候&#xff0c;大家对直播和点播的区别还是很模糊&#xff0c;仅仅停留在一种感觉上&#xff0c;如果视频画面是实时的就是直播&#…

服务器点播直播系统,服务器点播直播系统

服务器点播直播系统 内容精选 换一换 当保护组的生产站点发生故障时&#xff0c;将保护组的生产站点切到当前的容灾站点&#xff0c;即另一端AZ&#xff0c;启用当前容灾站点的云硬盘以及云服务器等资源。故障切换完成之后&#xff0c;保护组的当前生产站点变成故障切换发生之前…

电影服务器点播系统,网上电影注册点播系统

内容提要&#xff1a;【编号&#xff1a;001】电影网站&#xff0c;灵活运用了JSP技术和sqlserver数据库开发&#xff0c;实现了在线电影的播放和注册用户免费体验的功能。 功能模块图如下&#xff1a; 权限模块分为&#xff1a; 管理员&#xff1a; (1) 影片管理&#xff1a;管…

使用HTTP协议在k780网站上获取天气-----天气预报

文章目录 项目介绍一、项目任务二、项目流程规划以及代码实现1.总流程2.引入库3.总体流程相关函数 三、功能函数的实现1. TCP函数2. 输入城市信息3. 查询今天天气4. 查询未来一周天气5. 查询历史天气6. 退出 总结 项目介绍 本期主要使用TCP网络编程实现天气预报的功能&#xff…

免费视频直播点播服务器系统,搭建一套完整的网络视频流媒体直播/点播服务系统需要具备哪些条件?...

原标题:搭建一套完整的网络视频流媒体直播/点播服务系统需要具备哪些条件? 随着Internet的飞速发展,网上现场直播已经从实验阶段走向了实用阶段。各式各样的社会活动都可以借助网上现场直播方式传遍全世界,如新闻发布会、体育比赛、商贸展览、企业宣传、远程会议、远程看护…

解决Vmware上的kali找不到virtualbox上的靶机的问题

解决kali找不到靶场ip问题的完整方法 1.配置靶机2.配置kali的虚拟网络3.配置kali中的eth0网络 1.配置靶机 靶机部署在Virtualbox上对其进行网络配置&#xff0c;选择连接方式为仅主机&#xff08;Host-Only&#xff09;网络。 2.配置kali的虚拟网络 在编辑中选择虚拟网络配…

IDEA 安装配置步骤详解

引言 IntelliJ IDEA 是一款功能强大的集成开发环境&#xff0c;它具有许多优势&#xff0c;适用于各种开发过程。本文将介绍 IDEA 的主要优势&#xff0c;并提供详细的安装配置步骤。 介绍 IntelliJ IDEA&#xff08;以下简称 IDEA&#xff09;之所以被广泛使用&#xff0c;…

西门子S7200方案 西门子S7200方案CPu型号LPC2136

西门子S7200方案 西门子S7200方案CPu型号LPC2136 id584474406888&

S7200源码及PCB文件,S7 224XP 226图纸

S7200源码及PCB文件,S7 224XP 226图纸 id651541838037&

西门子S7200下载线驱动

西门子S7200下载线驱动是官方提供的一款USB驱动&#xff0c;本站收集提供高速下载&#xff0c;用于解决USB接口不能正常识别&#xff0c;无法正常使用的问题&#xff0c;本动适用于&#xff1a;Windows XP / Windows 7 / Windows 8 / Windows 10 32/64位操作系统。有需要的朋友…

西门子 S7200 以太网模块连接力控组态方法

ETH-YC模块转以太网&#xff0c;型号有MPI-ETH-YC01和PPI-ETH-YC01&#xff0c;适用于西门子S7-200/S7-300/S7-400、SMART S7-200、西门子数控840D、840DSL、合信、亿维PLC的PPI/MPI/PROFIBUS转以太网。用于西门子S7-200/S7-300/S7-400程序上下载、上位监控、设备联网和数据采集…

西门子 S7200 以太网模块连接组态王方法

ETH-YC模块&#xff0c;型号有MPI-ETH-YC01和PPI-ETH-YC01&#xff0c;适用于西门子S7-200/S7-300/S7-400、SMART S7-200、西门子数控840D、840DSL、合信、亿维PLC的PPI/MPI/PROFIBUS转以太网。用于西门子S7-200/S7-300/S7-400程序上下载、上位监控、设备联网和数据采集。支持与…

C# 语言 和西门子S7200 smart通信

C# 语言 和西门子S7200 smart通信 界面如截图所示&#xff0c;关注公众号Aidu_auto,回复软件包&#xff0c;获得DEMO(VS2013 C#) 支持断线重连&#xff01;详细情况见软件包帮助文件。 或百度网盘&#xff1a; 链接: https://pan.baidu.com/s/1WL9VhYg8QJHzjjZFeCZAWA 提取码…

博图能打开s7200吗_流氓软件你能避免吗?赶紧看看你的安卓手机打开这个开关没...

1月21消息&#xff0c;国外媒体Cybernews曝光了数款存在安全隐患的安卓应用&#xff0c;从这些应用中我们发现大都是相机类应用。根据Cybernews的说法这些应用会寻求多项权限&#xff0c;而多数权限和应用本身功能并不相关。 其实在国内这类软件也并不缺乏&#xff0c;他们通常…

485通讯的校验和_S7200 SMART通过MODBUS库与称重仪表通讯

点击↑↑技成培训 ,关注并置顶即可长期免费订阅 20万+工控人关注的微信平台:技术分享、学习交流、工控视频 首先介绍我们的硬件准备工作1一台支持Modbus协议的称重仪表 支持Modbus协议的称重仪表 2设置好仪表的通讯参数 根据自己的要求可以调整,只要和PLC端统一就可以 波特率…

兴达易控CHNet-S7200PDPB西门子S7200PLCppi转以太网处理器

品牌&#xff1a;Endaic兴达易控 型号&#xff1a;CHNet-S7200PD&PB 产品简介 CHNet-S7200用于西门子S7-200/SMART S7-200PLC的以太网数据采集&#xff0c;非常方便构建生产管理系统。 CHNet-S7200不占用PLC编程口&#xff0c;即编程软件/上位机软件通过以太网对PLC数据监控…

关于S7200的PPI地址无法更改

作 者&#xff1a;武力戡乱 修改日期&#xff1a;2017-06-23 备 注&#xff1a; 1、总备注信息 2、联系方式 3、其它博文链接&#xff1a;武力戡乱博客目录总表 内 容&#xff1a; 1、看图 2、很多人这个地址改完后&#xff0c;改不回来了哈。在地址栏目里面…