当前位置:   article > 正文

微信小程序 video 组件[播新视频旧视频暂停,再次播放延续上次播放时长]_小程序video组件代码暂停怎么办

小程序video组件代码暂停怎么办

1、引言

微信官方文档网址:媒体组件 / video (qq.com)

2、播新视频旧视频暂停

 问题: 多个视频同时播放的问题

  • 需求:

        1. 在点击播放的事件中需要找到上一个播放的视频

        2. 在播放新的视频之前关闭上一个正在播放的视频

  • 关键:

        1. 如何找到上一个视频的实例对象媒体 / 地图 / wx.createMapContext (qq.com)

        2. 如何确认点击播放的视频和正在播放的视频不是同一个视频

  • 单例模式:

        1. 需要创建多个对象的场景下,通过一个变量接收,始终保持只有一个对象,

        2. 节省内存空间

 

属性类型默认值必填说明
srcstring要播放视频的资源地址,支持网络路径、本地临时路径、云文件ID(2.3.0
posterstring

视频封面的图片网络资源地址或云文件ID(2.3.0)。若 controls 属性值为 false 则设置 poster 无效

object-fitstringcontain

当视频大小与 video 容器大小不一致时,视频的表现形式

【contain  包含(原来尺寸)】【fill  填充(尺寸改变被拉伸)】【cover 覆盖(尺寸不变,等比例放大,短边贴合)】

bindplayeventhandle当开始/继续播放时触发play事件

  1. <view class="videoItem" wx:for="{{videoList}}" wx:key="id">
  2. <video
  3. src="{{item.data.urlInfo.url}}"
  4. bindplay="handlePlay"
  5. id="{{item.data.vid}}"
  6. poster="{{item.data.coverUrl}}"
  7. object-fit="cover"
  8. >
  9. </video>
  10. </view>
  1. ## 1、点击播放时,获取当前 video 组件中的 视频id
  2. ## 22.1 点击第一个视频,没有视频实例、vid,先在this上创建一个 vid 和创建 视频实例对象
  3. 2.2 点击另一个视频,新的视频开始播放,这时的 vid 和 视频实例 还是之前第一个视频的
  4. 2.3 判断 this 上的 vid 是否改变,改变了,去判断是否有视频实例
  5. 3.4 有视频实例,不管是否播放,去停止它播放,再去记录新的视频实例和vid
  6. // 点击播放/继续播放的回调
  7. handlePlay(event) {
  8. let vid = event.currentTarget.id;
  9. // 关闭上一个播放的视频
  10. if (this.vid !== vid) {
  11. if (this.videoContext) {
  12. // 停止播放视频
  13. this.videoContext.stop()
  14. }
  15. }
  16. this.vid = vid;
  17. // 创建控制video标签的实例对象【参数是 video 的 id】
  18. this.videoContext = wx.createVideoContext(vid);
  19. }

3、 再次播放延续上次播放时长

当我们切换到另一个 tabnav里面,比如 现场 切换到 翻唱,再切换回 现场【已经重新请求】,这个时候 现场 中之前的播放时长无了,现在我需要,可以这样做:

思路: 判断记录播放时长的videoUpdateTime数组中是否有当前视频的播放记录

        1. 如果有,在原有的播放记录中修改播放时间为当前的播放时间

        2. 如果没有,需要在数组中添加当前视频的播放对象

        3. 视频播放结束,去掉数组的该播放记录

  1. <view class="videoItem" wx:for="{{videoList}}" wx:key="id">
  2. <video
  3. src="{{item.data.urlInfo.url}}"
  4. id="{{item.data.vid}}"
  5. poster="{{item.data.coverUrl}}"
  6. object-fit="cover"
  7. bindplay="handlePlay"
  8. bindtimeupdate="handleTimeUpdate"
  9. bindended="handleEnded"
  10. >
  11. </video>
  12. </view>
  1. data: {
  2. videoList: [], // 视频列表数据
  3. videoUpdateTime: [], // 记录video播放的时长
  4. },
  5. // 点击播放/继续播放的回调
  6. handlePlay(event) {
  7. let vid = event.currentTarget.id;
  8. // 关闭上一个播放的视频
  9. if (this.vid !== vid) {
  10. if (this.videoContext) {
  11. // 关闭视频
  12. this.videoContext.stop()
  13. }
  14. }
  15. this.vid = vid;
  16. // 创建控制video标签的实例对象
  17. this.videoContext = wx.createVideoContext(vid);
  18. // 判断当前的视频之前是否播放过,是否有播放记录, 如果有,跳转至指定的播放位置
  19. let { videoUpdateTime } = this.data;
  20. // 查询到 find()第一个video元素的值。没有返回 undefined
  21. let videoItem = videoUpdateTime.find(item => item.vid === vid);
  22. if (videoItem) {
  23. // 查询有,跳转到指定位置,单位 s
  24. this.videoContext.seek(videoItem.currentTime);
  25. }
  26. // 播放视频
  27. this.videoContext.play();
  28. },
  29. // 监听视频播放进度的回调
  30. handleTimeUpdate(event) {
  31. let { videoUpdateTime } = this.data;
  32. let videoItem = videoUpdateTime.find(item => item.vid === event.currentTarget.id);
  33. if (videoItem) { // 之前有
  34. videoItem.currentTime = event.detail.currentTime;
  35. } else { // 之前没有
  36. let videoTimeObj = {
  37. vid: event.currentTarget.id,
  38. currentTime: event.detail.currentTime
  39. };
  40. videoUpdateTime.push(videoTimeObj);
  41. }
  42. // 更新videoUpdateTime的状态
  43. this.setData({
  44. videoUpdateTime
  45. })
  46. },
  47. // 视频播放结束调用的回调
  48. handleEnded(event) {
  49. // 移除记录播放时长数组中当前视频的对象
  50. let { videoUpdateTime } = this.data;
  51. // 查询到 findIndex()第一个元素值的下标。没有返回 undefined
  52. videoUpdateTime.splice(videoUpdateTime.findIndex(item => item.vid === event.currentTarget.id), 1);
  53. this.setData({
  54. videoUpdateTime
  55. })
  56. },

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/376492
推荐阅读
相关标签
  

闽ICP备14008679号