video标签自定义控件适配安卓IOS

引文

众所周知,video标签在安卓和IOS系统表现差异较大,自身所带控件有许多是我们不需要的,并且video控件样式较为丑陋,所以我的做法是摒弃了video自身的控件,自己去实现所需功能和样式。

常用属性

属性 描述
src 设置或返回音频/视频元素的当前来源。
poster 规定视频正在下载时显示的图像,直到用户点击播放按钮。
autoplay 设置或返回是否在加载完成后随即播放音频/视频。
controls 设置或返回音频/视频是否显示控件(比如播放/暂停等)。
currentTime 设置或返回音频/视频中的当前播放位置(以秒计)。
duration 返回当前音频/视频的长度(以秒计)。
ended 返回音频/视频的播放是否已结束。
muted 设置或返回音频/视频是否静音。
paused 设置或返回音频/视频是否暂停。
playbackRate 设置或返回音频/视频播放的速度。
preload 设置或返回音频/视频是否应该在页面加载后进行加载。
volume 设置或返回音频/视频的音量。

常用事件

事件 描述
canplay 当浏览器可以开始播放音频/视频时触发。
ended 当目前的播放列表已结束时触发。
pause 当音频/视频已暂停时触发。
play 当音频/视频已开始或不再暂停时触发。
ratechange 当音频/视频的播放速度已更改时触发。
timeupdate 当目前的播放位置已更改时触发。

常用方法

方法 描述
load() 重新加载音频/视频元素。
play() 开始播放音频/视频。
pause() 暂停当前播放的音频/视频。

video

要实现自定义video控件,所以对video的基础属性进行配置就可以了

<video
  ref="player"
  :src="url%20+%20'#t=0.01'"
  :muted="muted"
  :autoplay="autoplay"
  preload="auto"
  @timeupdate="getPercentage"
  @ended="endedHandle"
>
  您的浏览器不支持 video 标签。
</video>

控件

常用控件:播放、暂停、时间、进度条、倍速、全屏。

// 播放
this.$refs.player.play();

// 暂停
this.$refs.player.pause();

// 时间:video当前时间和总时间 (都是以秒计)
this.$refs.player.currentTime // 当前时间
this.$refs.player.duration // 总时间

// 进度: 当前时间和总时间的比值
(this.$refs.player.currentTime / this.$refs.player.duration) * 100

// 倍速
this.$refs.player.playbackRate // 获取和设置video倍速

// 全屏:我的需求是横向全屏、下面会讲我的全屏方法

遇到的问题

1、video默认播放

问题:autoplay设置为true,但是不自动播放

解决办法:video标签加上muted 设置静音就可以自动播放,如果还不能播放就调用下play()方法

2、ios没有默认加载第一帧

问题:设置video的preload属性后,一旦页面加载,则开始加载音频/视频,但是ios没有加载出video的第一帧,如果也没有设置poster,那就会出现黑屏的情况。

解决办法: :src=”url%20+%20’#t=0.01′” 在src属性后增加t参数,他的意义是当前视频时间是0.01秒

3、自定义进度条拖拽引起回弹

问题:进度条拖拽引起系统回弹效果

解决方法:进度条本身touchmove事件 e.preventDefault();

body阻止默认事件document.body.addEventListener(‘touchmove’,(e) =>e.preventDefault(),{ passive: false });

4、ios获取播放时间播放失败

问题:全屏时全屏video获取列表video的播放时间播放,但是获取失败从头播放。

解决办法: ios监听video的canplay事件,在事件监听函数中获取列表video的播放时间。

video全屏

我的做法是将元素宽高修改并旋转,适应横屏,简单粗暴。

this.$nextTick(() => {
    let player = document.getElementById('fullWrapper'),
      w = document.documentElement.clientWidth || document.body.clientWidth,
      h = document.documentElement.clientHeight || document.body.clientHeigth,
      cha = Math.abs(h - w) / 2;
      
    player.style.width = h + 'px';
    player.style.height = w + 'px';
    player.style.transform = 'translate(-' + cha + 'px,' + cha + 'px) rotate(90deg)';

    // 设置全屏播放器播放时间和属性
    this.$refs.fullPlayer.setCurrentTime(currentPlayer.player.currentTime);
  });

效果截屏

竖屏播放

video标签自定义控件适配安卓IOS

video标签自定义控件适配安卓IOS

横屏播放

video标签自定义控件适配安卓IOS

结语

我的实现方法比较简单,没有用其他的插件,本篇文章主要分享使用原生video标签遇到的问题,像使用video原生控件修改样式等其他方法我也有尝试过,但是在俩个系统表现还是有差异,终于放弃了使用它自身的控件,读到这里假设你有更好的解决方案和插件,请分享和交流一下吧。

原文链接:https://juejin.cn/post/7216130963276283959 作者:小撕夜

(0)
上一篇 2023年3月30日 上午10:00
下一篇 2023年3月30日 上午10:10

相关推荐

发表回复

登录后才能评论