微信小程序video控件的使用

  • 微信小程序video控件的使用

    • 一、简介
    • 二、属性
    • 三、相关实现api
      • 1、wx.createVideoContext
      • 2、videoContext对象
    • 四、代码实现
      • 实现效果,如下图
      • 实现原理:

一、简介

video控件是微信小程序提供的系统组件之一,用于实现播放视频的功能。

二、属性

| 属性名 | 类型 | 默认值 | 说明 | 最低版本 |

|——–|——–|——–|——–|——–|

| src | String| | 要播放视频的资源地址 | |

| initial-time| String | | 指定视频初始播放位置| 1.6.0 |

| duration |Number|| 指定视频时长 | 1.1.0 |

| controls |Boolean |true| 是否显示默认播放控件(播放/暂停按钮、播放进度、时间)| |

| danmu-list |Object Array||弹幕列表 | |

| danmu-btn |Boolean|false | 是否显示弹幕按钮,只在初始化时有效,不能动态变更| |

| enable-danmu |Boolean|false| 是否展示弹幕,只在初始化时有效,不能动态变更 | |

|autoplay|Boolean|false|是否自动播放| |

|loop|Boolean|false|是否循环播放| 1.4.0 |

|muted|Boolean|false|是否静音播放| 1.4.0 |

|page-gesture|Boolean|false|在非全屏模式下,是否开启亮度与音量调节手势|1.6.0 |

|direction|Number||设置全屏时视频的方向,不指定则根据宽高比自动判断。有效值为 0(正常竖向), 90(屏幕逆时针90度), -90(屏幕顺时针90度)|1.7.0|

|bindplay|EventHandle||当开始/继续播放时触发play事件| |

|bindpause|EventHandle||当暂停播放时触发 pause 事件| |

|bindended|EventHandle||当播放到末尾时触发 ended 事件| |

|bindtimeupdate|EventHandle||播放进度变化时触发,event.detail = {currentTime, duration} 。触发频率 250ms 一次| |

|bindfullscreenchange|EventHandle||当视频进入和退出全屏是触发,event.detail = {fullScreen, direction},direction取为 vertical 或 horizontal| |

|objectFit|String|contain|当视频大小与 video 容器大小不一致时,视频的表现形式。contain:包含,fill:填充,cover:覆盖| 1.4.0|

|poster|String||视频封面的图片网络资源地址,如果 controls 属性值为 false 则设置 poster 无效| |

||||||

video 组件 默认宽度300px、高度225px,可通过wxss设置宽高。

三、相关实现api

1、wx.createVideoContext

创建并返回 video 上下文 videoContext 对象。在自定义组件下,第二个参数传入组件实例this,以操作组件内 video 组件

2、videoContext对象

videoContext 通过 videoId 跟一个 video 组件绑定,通过它可以操作一个 video 组件。

videoContext 对象的方法列表:

| 方法 | 参数 | 说明 | 最低版本 |

|——–|——–|——–|——–|

|play | 无| 播放 | |

|pause| 无| 暂停 | |

|seek | position| 跳转到指定位置,单位 s| |

|sendDanmu|danmu|发送弹幕,danmu 包含两个属性 text, color。||

|sendDanmu|danmu|发送弹幕,danmu 包含两个属性 text, color。||

|sendDanmu|danmu|发送弹幕,danmu 包含两个属性 text, color。||

|playbackRate|rate|设置倍速播放,支持的倍率有 0.5/0.8/1.0/1.25/1.5|1.4.0|

|requestFullScreen|无|进入全屏,可传入{direction}参数(1.7.0起支持),详见video组件文档|1.4.0|

|exitFullScreen|无|退出全屏|1.4.0|

四、代码实现

在四川建设厅的代码实现中,我们未涉及弹幕功能的相关使用,所以以下代码不涉及弹幕的代码,如果想自己尝试使用,可以在官网查看其相关代码。

实现效果,如下图

实现原理:

在四川建设厅中,我们将视频播放控件进行了组件化的封装,将其放入一个名为courseVideoPlayer的组件中,组件的相关知识,可以查看佳斌写的自定义组件的实现,加以学习。

核心代码:

courseVideoPlayer.wxml


<view><!--poster="{{coverImageUrl}}" --><video id="myVideo" class="myVideo" src="{{playUrl}}" autoplay='false'  controls='true' bindtimeupdate='timeUpdate' bindended='endAction'><!-- <cover-view bindtap='startFirstPlayAction' class='cover-view' wx:if="{{isShowCoverView}}"></cover-view>  --><cover-view bindtap='_startFirstPlayAction' class='cover-view' wx:if="{{isShowCoverView}}"><cover-image class='cover-view' src="{{coverImageUrl}}" mode="aspectFill"/><cover-image style='position:absolute; top:50%; left:50%; width:132rpx; height:132rpx; margin:-66rpx 0 0 -66rpx; z-index:10000' src="/image/video-play.png"/></cover-view></video></view>

这部分代码主要是视频界面部分,除了使用到video控件之外,我们还用到了cover-view以及cover-image组件,这两个组件的使用,在此,我做一下简单的介绍:

(1)cover-view:覆盖在原生组件之上的文本视图,可覆盖的原生组件包括map、video、canvas、camera,只支持嵌套cover-view、cover-image。

(2)cover-image:覆盖在原生组件之上的图片视图,可覆盖的原生组件同cover-view,支持嵌套在cover-view里。

属性:src String 图标路径,支持临时路径、网络地址(1.6.0起支持)。暂不支持base64格式。

按照功能来说,cover-view和cover-image实质上与普通的基础控件view与image无异,只是这两个控件特殊在,他可以覆盖在map、video、canvas、camera控件中,也正是因为这个特殊性,导致了他们在试用时也存在这一些差异,试用这两个控件的过程中,我们需要考虑以下几个注意点:

* Bug & Tips *

tip: 基础库 1.6.0 起支持css transition动画,transition-property只支持transform (translateX, translateY)与opacity。

tip: 基础库 1.6.0 起支持css opacity。

tip: 只可嵌套在原生组件map、video、canvas、camera内,避免嵌套在其他组件内。

tip: 事件模型遵循冒泡模型,但不会冒泡到原生组件。

tip: 文本建议都套上cover-view标签,避免排版错误。

tip: 只支持基本的定位、布局、文本样式。不支持设置单边的border、background-image、shadow、overflow等。

tip: 建议子节点不要溢出父节点

courseVideoPlayer.js


let studyPlayerManager = require('../../../../utils/studyManager/studyPlayerManager.js')let currentTime = 0let videoCtx = nulllet app = getApp()Component({/*** 组件的属性列表*/properties: {playUrl:{type:String,value:'',observer: function (newVal, oldVal) {if (newVal.length){videoCtx.play()}}},totalSecondsTime:{type:Number,value:10},playInfo:{type: Object,value: {},observer: function (newVal, oldVal) {}},coverImageUrl:{type: String,value: '../../../image/course-img.jpg',observer: function (newVal, oldVal) {}},isShowCoverView:{type:Boolean,value:true,observer: function (newVal, oldVal) {}},// 初始播放时间initialTime : {type:Number,value:0}},/*** 组件的初始数据*/data: {lastTime: 0,zindex: Math.max,currentTime: 0,isTest:false},attached: function () {wx.setStorageSync('lastTime', '0');wx.setStorageSync('maxTime', '0');videoCtx = wx.createVideoContext('myVideo', this)// 初始化toastnew app.WeToast(this)studyPlayerManager.initStudyPlayerManager(this)},moved: function () {},detached: function () {this.studyPlayerManager.deallocStudyPlayerManager()},/*** 组件的方法列表*/methods: {play() {videoCtx.play()},pause() {videoCtx.pause()},timeUpdate(e) {this.triggerEvent("videoTimeUpdate", e.detail.currentTime)var maxTime = parseInt(wx.getStorageSync('maxTime'));console.log('maxTime:' + maxTime);var lastTime = parseInt(wx.getStorageSync('lastTime'));console.log('lastTime:' + lastTime);currentTime = e.detail.currentTime;console.log('currentTime:' + currentTime)if (currentTime != 0 && ((currentTime - lastTime) < 3)) {wx.setStorageSync('lastTime', currentTime);}if (currentTime != 0 && currentTime > maxTime && (((currentTime - lastTime) > 0) && ((currentTime - lastTime) < 3))) {wx.setStorageSync('maxTime', currentTime);console.log('设置最大时间!')}if (!this.data.isTest && currentTime > maxTime) {if ((currentTime - lastTime) > 3) {//跳转到上次的进度videoCtx.seek(maxTime);wx.setStorageSync('lastTime', maxTime);this.wetoast.toast({title: '不能进行跳转!请认真学习'})}}},endAction(e) {let maxTime = parseInt(wx.getStorageSync('maxTime'));if (!this.data.isTest && ((this.properties.totalSecondsTime - maxTime) > 3)) {this.wetoast.toast({title: '不能进行跳转!请认真学习'})videoCtx.seek(maxTime)videoCtx.play()}else{this.triggerEvent("videoPlayEndEvent")this._playEndAction()}},fullScreenChangeAction(e) {console.log(e)},changeScreenTap() {this.videoCtx.requestFullScreen({ direction: 90 })},// 跳转到某个点seekToPoint(time){console.log('跳转到时间:'+time)videoCtx.seek(time)}}})

代码中,主要实现了对video控件的进度条的拖拽进行了控制,如果在用户将进度条拖拽到还未观看过的视频位置,那么视频将会跳回到用户观看过的最大位置,并提示用户不能进装操作。

由于系统未提供video进度条拖拽的事件监听接口,我们只能“绕个弯”实现该功能。

实现的原理就是通过监听video控件开放的bindtimeupdate播放过程中的进度监听事件,我们通过监听进度条当前的进度与上一次回调的进度进行比较,如果两者之差大于3,便视为用户进行了拖拽操作,具体的代码,查看上述的timeUpdate(e)与endAction(e)事件中的相关代码。

起初,原本想自定义控制器来实现监听视频进度条拖拽的相关功能,但通过实践,我们发现,在video上的cover-view中无法嵌套系统提供的slider组件,同时在video控件上,无法进行自定义拖拽事件的监听(开发工具上可以监听,真机上无法进行监听,具体的原因还需考察),所以目前只能通过该方法实现控制拖拽进度条的操作。

微信小程序video控件的使用相关推荐

  1. 微信小程序地图控件Map的使用

    本文介绍微信小程序map控件的使用 map为原生控件之一-- 介绍完map控件之后下面直接来看代码怎么实现吧 和往常一样,这些代码贴过去就可以直接通用的 首先wxml文件(极简): <map i ...

  2. 【delphi】开发微信小程序后台控件(一)(含源代码、演示程序、控件使用帮助)

    1. 前言 微信小程序已经非常普及,但是遗憾的是官方提供的 SDK 等没有Delphi语言的,这样使用Delphi语言开发微信小程序后台就相对比较困难,需要研究平台API,费时费力,特别是调试API很 ...

  3. 微信小程序视图控件与bindtap之间的问题的解决

    在微信小程序中 最常用的<view>控件 可以用bindtap(冒泡反应) 如<view bindtap="ItemOnclick" data-mType=&qu ...

  4. 微信小程序text控件部分字体文字大小和颜色设置四

    在我们android中有的时候会要求textview控件显示文字部分颜色不同而且大小也不同,这个在微信小程序中怎么做呢?因为在微信小程序中所有的显示都是通过标签来实现的,那么标签时可以嵌套的,比如显示 ...

  5. 【delphi】开发微信小程序后台控件(三)(含源代码、演示程序、控件使用帮助)

    7. 微信小程序控件测试 7.1 设置参数 选择[公共功能]-[编辑控件属性]菜单,设置相关参数并保存 7.2 双击绿色运行按键或者 启动小程序功能 菜单 至此,小程序后台服务已经成功启动,可以在前端 ...

  6. 微信小程序view控件自动换行

    使用场景:微信小程序.注册协议动态下发多个,需要view自动换行,同时点击跳转协议内容场景需求 1.效果图.  2.xml界面代码 <!-- view自动换行 --><view cl ...

  7. 小程序背景图片从服务器获取,微信小程序button控件去边框、加背景图

    button边框去除 相信大家开发微信小程序时使用button会遇到一些与预期效果不同的样式问题.例如button的边框无法去除,在为button设置圆角的时候周围会有一些"杂质" ...

  8. 微信小程序按钮控件设置呈现效果

    1.效果图 在小程序中完成上述布局,需要设置四个按钮位置,控制每个按钮大小.设置按钮背景颜色,设置标题和图标的位置. 2.代码说明 2.1 index.wxml <view class=&quo ...

  9. 微信小程序view动态长度_微信小程序 关于控件尺寸动态计算的问题

    自定义相机界面,顶部80rpx,底部210rpx,中间剩余高度填充相机视频流view. 实现思路是获取屏幕高度,减去顶部80rpx再减去底部210rpx,结果赋值给相机视频流view的高度.这个高度需 ...

  10. 微信小程序-UI控件的使用(1)

    button的初体验: 初始化一个项目,新建一个目录firstPage,结构如下: 在firtst.wxml中写UI <view class="content">< ...

最新文章

  1. redis mysql排行榜实现_redis实现排行榜
  2. [实验]-从汇编代码来看volatile关键字的作用
  3. Jenkins持续集成环境之插件管理和角色管理
  4. cent os数据库安装
  5. 如何求两个向交矩形的交集的面积?
  6. Cocos2d-x快速打包脚本
  7. 如何在CRM WebClient UI里创建HANA live report
  8. linux gcc g++编译命令选项
  9. 封装属性_「Python基础学习」之封装大法
  10. router vue 页签文字_vue-router实现tab标签页(单页面)详解
  11. 联想拯救者电竞手机成功“截胡”:全球首发骁龙865+
  12. centos 7 mysql 源码安装_centos7 mysql5.7.17源码安装
  13. 【java学习之路】数据库连接JDBC
  14. c语言内循环和外循环作用是什么,空调内循环和外循环的作用
  15. centos 切换终端_centos进入不同终端的几种方法
  16. iso 绝对pe_通用PE工具箱 V5.0(WIN7PE内核)U盘ISO硬盘完美三合一版
  17. 作为空降领导,该如何做?
  18. php循环26个英文字母,有趣的真人字母操,形象生动容易学,帮孩子瞬间搞定26个英文字母,效果满分!...
  19. 美颜特效、黑白照片上色、AI人像动漫化,达摩院的学习营来了!
  20. 简单NLP分析套路(2)----分词,词频,命名实体识别与关键词抽取

热门文章

  1. DAY64 Django基础1
  2. Excel函数(4)日期、文本函数
  3. 从Oppo手机拍照无法展示谈图片压缩
  4. 你了解PowerBI中的去年同期吗
  5. CPU多级缓存与缓存一致性,详细的讲解
  6. Spring Cloud 快速入门指南(二)
  7. kali linux网卡推荐,BT5 Kali Linux 网卡选择
  8. android微信支付指纹支付,为什么微信支付不能指纹支付?微信怎么指纹支付?
  9. win10计算机丢失msvcr,Win10计算机丢失MSVCR120.dll怎么解决
  10. archlinux + dwm系统美化