HTML5+CSS3+JQuery打造自定义视频播放器

简介
HTML5的
WebM,旨在帮助开发者为开放网络制作出世界级媒体格式,Opera, Firefox, Chrome和IE9都将支持VP8,而且Flash Player也将可以播放VP8,这就意味着我们很快就可以只制作一个版本的视频然后在所有主流浏览器上播放了。另外一个主要的问题就是如何构建自定义的HTML5
视频控制工具条
做为一个专业的web开发人员,我们创建一个视频播放器时一定希望它的外观在各个浏览器中看起来一致(consistent),但是通过下面的图可以看到目前各个浏览器提供的视频控制工具条外观各不相同:

那就没办法了,我们得自己从头来创建这个控制工具条,利用HTML和CSS再加上一些图片实现起来并不算很难,另外通过HTML5多媒体元素提供的API我们可以很方便将创建的任何按钮与播放/暂停等事件进行绑定。

视频控制按钮
基本的视频控制工具条要包含一个播放/暂停按钮,一个进度条,一个计时器和一个音量控制按钮,我们将这些按钮放在

  1.         
  2.         

  3.         
    00:00

  4.         

  5.                

  6.                
  7.         

  • 复制代码 注意,我们使用元素的class属性来代替ID属性是为了方便在一个页面上使用多个播放器。

    打包成jQuery插件
    创建好控制按钮后我们需要配合多媒体元素的API来实现视频控制的目的,正如前面提到的一样我们将我们的播放器打包成jQuery插件,这样可以很好的实现复用,代码如下:
    1. $.fn.gVideo = function(options) {
    2.         // build main options before element iteration
    3.         var defaults = {
    4.                 theme: 'simpledark',
    5.                 childtheme: ''
    6.         };
    7.         var options = $.extend(defaults, options);
    8.         // iterate and reformat each matched element
    9.         return this.each(function() {
    10.                 var $gVideo = $(this);
    11.                 
    12.                 //create html structure
    13.                 //main wrapper
    14.                 var $video_wrap = $('
      ').addClass('ghinda-video-player').addClass(options.theme).addClass(options.childtheme);
    15.                 //controls wraper
    16.                 var $video_controls = $('
      00:00
      ');                                                
    17.                 $gVideo.wrap($video_wrap);
    18.                 $gVideo.after($video_controls);
    复制代码
    这里先假设您了解jQuery并知道如何创建一个jQuery插件,因为这个不在本文的讨论范围之内,在上面这段脚本中我们使用jQuery动态创建视频控制工具条的元素,接下来为了绑定事件我们需要获取对应的元素:
    1. //get newly created elements
    2. var $video_container = $gVideo.parent('.ghinda-video-player');
    3. var $video_controls = $('.ghinda-video-controls', $video_container);
    4. var $ghinda_play_btn = $('.ghinda-video-play', $video_container);
    5. var $ghinda_video_seek = $('.ghinda-video-seek', $video_container);
    6. var $ghinda_video_timer = $('.ghinda-video-timer', $video_container);
    7. var $ghinda_volume = $('.ghinda-volume-slider', $video_container);
    8. var $ghinda_volume_btn = $('.ghinda-volume-button', $video_container);

    9. $video_controls.hide(); // keep the controls hidden
    复制代码
    这里我们通过className方式获取,先让工具条隐藏直到所有资源加载完成,现在来实现播放/暂停按钮:
    1. var gPlay = function() {
    2.         if($gVideo.attr('paused') == false) {
    3.                 $gVideo[0].pause();                                        
    4.         } else {                                        
    5.                 $gVideo[0].play();                                
    6.         }
    7. };

    8. $ghinda_play_btn.click(gPlay);
    9. $gVideo.click(gPlay);

    10. $gVideo.bind('play', function() {
    11.         $ghinda_play_btn.addClass('ghinda-paused-button');
    12. });

    13. $gVideo.bind('pause', function() {
    14.         $ghinda_play_btn.removeClass('ghinda-paused-button');
    15. });

    16. $gVideo.bind('ended', function() {
    17.         $ghinda_play_btn.removeClass('ghinda-paused-button');
    18. });
    复制代码
    大多数浏览器在右键点击视频时会提供一个独立的菜单,它也提供了视频控制功能,如果用户通过这个右键菜单控制视频那就会跟我们的自定义控件冲突,所以为了避免这一点我们需要绑定视频播放器自身的“播放”,“暂停”和“结束”事件,在事件处理函数中处理播放/暂停按钮,控制按钮的样式。
    为了创建进度条的拖动块,我们使用了jQuery UI的Slider组件:
    1. var createSeek = function() {
    2.         if($gVideo.attr('readyState')) {
    3.                 var video_duration = $gVideo.attr('duration');
    4.                 $ghinda_video_seek.slider({
    5.                         value: 0,
    6.                         step: 0.01,
    7.                         orientation: "horizontal",
    8.                         range: "min",
    9.                         max: video_duration,
    10.                         animate: true,                                        
    11.                         slide: function(){                                                        
    12.                                 seeksliding = true;
    13.                         },
    14.                         stop:function(e,ui){
    15.                                 seeksliding = false;                                                
    16.                                 $gVideo.attr("currentTime",ui.value);
    17.                         }
    18.                 });
    19.                 $video_controls.show();                                        
    20.         } else {
    21.                 setTimeout(createSeek, 150);
    22.         }
    23. };

    24. createSeek();
    复制代码
    正如你所看到的,这里我们写了一个递归函数,通过循环比较video的readyState属性来判断视频是否已经准备好,否则我们就不能获得视频的时长也无法创建滑动块,当视频准备好后我们初始化滑动块并显示控制工具条,下一步我们通过绑定video元素的timeupdate事件实现计时器功能:
    1. var gTimeFormat=function(seconds){
    2.         var m=Math.floor(seconds/60)<10?"0"+Math.floor(seconds/60):Math.floor(seconds/60);
    3.         var s=Math.floor(seconds-(m*60))<10?"0"+Math.floor(seconds-(m*60)):Math.floor(seconds-(m*60));
    4.         return m+":"+s;
    5. };

    6. var seekUpdate = function() {
    7.         var currenttime = $gVideo.attr('currentTime');
    8.         if(!seeksliding) $ghinda_video_seek.slider('value', currenttime);
    9.         $ghinda_video_timer.text(gTimeFormat(currenttime));                                                        
    10. };

    11. $gVideo.bind('timeupdate', seekUpdate);
    复制代码
    这里我们用seekUpdate函数获取video的currentTime属性值然后调用gTimeFormat函数进行格式化后得到当前播放的时间点。
    至于音量控制控件我们还是利用jQuery UI的Slider组件然后利用自定义函数实现静音和取消静音的功能:
    1. $ghinda_volume.slider({
    2.         value: 1,
    3.         orientation: "vertical",
    4.         range: "min",
    5.         max: 1,
    6.         step: 0.05,
    7.         animate: true,
    8.         slide:function(e,ui){
    9.                 $gVideo.attr('muted',false);
    10.                 video_volume = ui.value;
    11.                 $gVideo.attr('volume',ui.value);
    12.         }
    13. });

    14. var muteVolume = function() {
    15.         if($gVideo.attr('muted')==true) {
    16.                 $gVideo.attr('muted', false);
    17.                 $ghinda_volume.slider('value', video_volume);
    18.                 
    19.                 $ghinda_volume_btn.removeClass('ghinda-volume-mute');                                        
    20.         } else {
    21.                 $gVideo.attr('muted', true);
    22.                 $ghinda_volume.slider('value', '0');
    23.                 
    24.                 $ghinda_volume_btn.addClass('ghinda-volume-mute');
    25.         };
    26. };

    27. $ghinda_volume_btn.click(muteVolume);
    复制代码
    最后当我们自己的自定义视频控制工具条构造完成后需要移除

    你可能感兴趣的:(Html5,文章)