更新:

关于第二点,也就是说计算进度条拖放按钮定位的问题。

很感谢 batsing 同学提供了更好的方案: 滑块左偏量 = (进度条长 - 滑块长) * (已播时间/总时长)

尝试过之后发现除了拖曳滑片的时候会抛锚外,其它暂时没发现什么问题,并且较之前的算法省了很多不必要的步骤,所以如今除了拖曳操作的时候使用旧方法外,已经进行修改。如果还有其它建议欢迎告诉我~~(づ ̄ 3 ̄)づ

 

 

正文:

本以为写一个video播放器不难,可写着写着坑就越挖越大了。

 

先看一下播放器大概是长这样的:

 

模拟video播放器

 

 

在开发过程中这几个问题深深地困扰着我:

  1、各机器兼容问题

  2、关于视频播放过程中进度条显示情况

  3、关于改变播放进度和音量大小的操作问题

  

1、各机器兼容问题

  除了chrome很乖支持良好外,其中UC获取不到duration属性,也就获取不到视频的总长度了,但这部分可以由后台传参数解决,但是不能禁用系统播放器这个就不太好了。。。。

  抛开其它浏览器,来看看腾讯X5内核的浏览器的支持情况:http://x5.tencent.com/guide?id=2009  

 

  解决剩下问题前先了解一下video中常用的一些方法、属性和事件:

  duration:返回当前音频/视频的长度(以秒计)

  currentTime:设置或返回音频/视频中的当前播放位置(以秒计)

  play(): 开始播放音频/视频

  pause(): 暂停当前播放的音频/视频

  监听timeupdate事件,获得当前视频播放的进度。

 

嗯,了解了这些之后也大概明白播放器是怎样工作的了,看着API撸代码就行了:http://www.w3school.com.cn/tags/html_ref_audio_video_dom.asp

 

2、关于视频播放过程中进度条显示情况 主要指的是:进度条和拖放按钮需要按照视频的播放情况而进行调整的问题。

  本来进度条的计算方法是显而易见的:

  已播放进度 = 进度条长度 / (总时长 / 已播放时间)

 

  但是因为进度条多了一个拖放按钮,而且拖放按钮的定位是跟随视频的播放而改变的。

  如果按照上面的算法,很有可能在视频播放完成的时候,拖放按钮会超出进度条的范围,变成了这样:

模拟video播放器

  

  也考虑过当按钮的宽度 + 按钮的position.left >= 进度条长度的时候,拖放按钮不再移动。但这样就又产生了一个问题了:视频并未播放完,但拖放按钮已经到了尽头,很容易给用户造成以为视频已经播放完毕的错觉:

模拟video播放器

  ( 在已播放时间 < 总时长的情况下,拖放按钮已经到尽头了)

 

  花了好多时间,地思来想去才灵光一闪想到解决方案:

    为啥不在视频播放过程中把正在向前移动的按钮一点点地往后退呢:

 

  是时候展示我高超的画技了(*^__^*) 嘻嘻……

模拟video播放器

  如上图所示,涂黑的部分根据百分比慢慢地增加(为方便起见给上图中涂黑的部分设一个变量: iconDetract;)根据视频已播放的时间占总时长的百分比,计算出占按钮宽度的百分比iconDetract。然后再用按钮原来的position.left - iconDetract,得出按钮的实际定位。

  由于一点点地减去iconDetract,直到iconDetract == 按钮的总宽度为止。(这时候视频也播放完毕了):

 

  先计算出 按钮原来的定位(activeTol) = 进度条长度 / (总时长 / 已播放时间)

  再根据视频的播放进度计算出 iconDetract = 按钮宽度 / (总时长 / 已播放时间)

  最后得出 按钮的实际定位 = activeTol - iconDetract 

  (嗯,第一个问题就这样妥妥地解决掉了,目前只想到了这么一个解决方法。如果你有更好的方法,请告诉我。

 

3、关于改变播放时间点和音量大小的操作问题

  改变视频的时间点有两种方法:

    1:拖动拖放按钮,慢慢改变视频的播放时间点(慢)

    2:点击进度条的某一个位置,让视频直接跳到相对应的时间点(快)

 

  改变音量的两种方法:

    1:拖动拖放按钮,一点点慢慢改变音量的大小(慢)

    2:点击音量条的某一个位置,让音量直接跳到相对应的位置上(快)

  它们的共同的地方都有拖动按钮操作,以及点击进度条,按钮直接到相对于的位置上。唯一不同的是,操作的是视频的进度条抑或是音量条。)

 

  怎样可以各自调用一套代码实现各自不同的功能咧,这是目前所要解决的。

  实现方法并不难,只是繁琐。

 

  因为拖放按钮的时候需要先点击拖放按钮,但由于冒泡机制,会同时点击进度条。这时候是就会把上面列出来的1和2的操作都一起做了,并不符合现实所需。

  所以,调用的方法的时候传一个参数moveing,当moveing == true的时候,当前对象是按钮,而不是它的父级进度条,并且阻止冒泡 e.stopPropagation();

  但由于拖放按钮,和点击进度条使得改变视频的播放时间点以及改变音量,需要获取到焦点的X、Y坐标,这时候除了区分当前操作的是视频的进度抑或是调整音量的大小外还需要区分this的指向到底是当前操作对象还是它的父级。(代码中liveEvent部分)

  

demo完整代码如下

css:

1     <style type="text/css">
2     .control_bar{background-color:black;height:30px;line-height:30px;}
3     .control_bar span{ height:20px;line-height:20px; vertical-align:middle; display:inline-block;background-color:#fff;opacity:0.8;margin:0 10px;cursor:pointer;}
4     .control_bar #progress_bar,.control_bar #volume_bar{width:32%;border-radius:5px;height:10px; line-height:10px; position:relative;}
5     #progress_bar em,#volume_bar em{background-color:#5CA66A;height:100%; display:inline-block;}
6     .control_bar #time{color:#fff;font-size:14px;background:none;}
7     .control_bar #volume_bar{width:100px;}
8     #progress_bar_icon,#volume_bar_icon{position:absolute;top:-3px;left:0px; border-radius:50%;height:20px;width:20px;display:block;background:#964E4E;}
9     </style>
View Code

相关文章:

  • 2021-11-14
  • 2021-08-08
  • 2021-09-13
  • 2021-08-22
  • 2022-12-23
  • 2022-12-23
  • 2021-12-23
猜你喜欢
  • 2022-12-23
  • 2021-11-27
  • 2021-09-29
  • 2022-12-23
  • 2021-12-04
  • 2021-04-07
相关资源
相似解决方案