vue video 播完第一个视频以后,再无缝衔接第二个视频并循环播放

这是一个项目中的实际需求,特此记录一下

思路:

  1. 页面中创建两个 video 标签
  2. 在组件加载时同时加载两个视频资源(autoplay),暂时不播放的视频在 canpl了解规则ay 事件中调用暂停方法,使之实现预加载
  3. 使用绝对定位将预加载的视频移出可视窗口
  4. 第一个视频结束后,通过 ended 事件播放之前预加载的视频 

核心代码:

模板:

// :class 动态控制class展示  
<video ref="video" :class="{'video-hide':!playVideoTag}" @ended="onEnded('video')" autoplay="autoplay" muted="muted" src="./images/act220618/banner.mp4" class="banner-inner-video"></video>

<video ref="video1"  :class="{'video-hide':playVideoTag}" @ended="onEnded('video1')" autoplay="autoplay" muted="muted" src="https://res.hc-cdn.com/cpage-pep-custom-promotion/1.0.7/images/banner_video.mp4" class="banner-inner-video"></video>

data:

    data: function() {
            return {
				
				playVideoTag:true, // 是否ref video 准备播放
            ...
            }
        }

方法:

// 播放video 相关
			 onEnded: function(e) {
                  // 改变playVideoTag  实则是改变了video的class 是否显示在可视区域
				  this.playVideoTag = false
                  // 第二个视频开始播放 即第一个视频播放完成后 开始播放第二个视频;
                  // ... 第二个视频播放完毕时 调用该方法 再次播放 实现循环效果
			      this.$refs.video1.play()
			      this.$emit('ended')
			},
			playVideo: function() {
				this.$refs.video.play() // 第一个video 播放
                // 利用canplay事件 将第二个video暂停 实现预加载
				this.$refs.video1.addEventListener('canplay', function(e) {
					e.target.pause()
				}, { once: true })
			},

	 // 播放video 相关 end
 mounted: function() {
			this.playVideo()
}

CSS:

使用绝对定位将预加载的视频移出可视窗口

	.video-hide{
		  position: absolute;
		  top: -10000px !important;
		  left: -10000px !important;
		}

成果:

 可以看到视频无缝切换,实现功能 (第二个视频会loop循环,由于gif大小限制未展示)

参考链接:

vue h5 video 多视频无缝切换

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
你可以通过以下的代码实现你的需求: ``` <template> <div> <video ref="videoPlayer" @ended="playNextVideo"> <source :src="currentVideoSrc" type="video/mp4"> </video> </div> </template> <script> export default { data() { return { currentVideoIndex: 0, // 当前播放视频索引 videoList: [ // 视频列表 { src: 'video1.mp4' }, { src: 'video2.mp4' }, { src: 'video3.mp4' } ] } }, computed: { currentVideoSrc() { return this.videoList[this.currentVideoIndex].src } }, mounted() { this.$refs.videoPlayer.play() }, methods: { playNextVideo() { this.currentVideoIndex++ if (this.currentVideoIndex >= this.videoList.length) { this.currentVideoIndex = 0 } this.$refs.videoPlayer.src = this.currentVideoSrc this.$refs.videoPlayer.play() } } } </script> ``` 以上代码通过监听视频的 `ended` 事件来判断当前视频播放完成后自动播放下一个视频,当播放到最后一个视频时,重新从第一个视频开始播放。 在模板中使用 `video` 标签来播放视频,通过 `ref` 属性来获取视频元素的引用,通过 `v-bind:src` 动态绑定视频源地址。在 `mounted` 钩子函数中,调用 `play` 方法来播放视频。 在 `playNextVideo` 方法中,首先判断当前视频是否是最后一个,如果是,将 `currentVideoIndex` 重置为 0,否则将 `currentVideoIndex` 自增 1。然后将 `video` 标签的 `src` 属性设置为当前视频的源地址,最后调用 `play` 方法来播放视频。 这样就可以实现连续播放多个视频的需求了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值