用html5新增的js媒体 API手写的一个视频播放器

2 篇文章 0 订阅
2 篇文章 0 订阅
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>html5视频测试</title>
        <style>
        *{margin: 0;padding: 0;list-style-type: none;font-family: "微软雅黑";}
            .player{width: 1024px;margin: 50px auto;position: relative;}
            .player video{width:1024px;}
            .player .ctl{width: 1024px;height: 30px;background: rgba(90,90,90,.6);position: absolute;right: 0; bottom: 4px;cursor:default;opacity:0.8;transition:opacity 0.8s;}
            .player .ctl .btn,.player .ctl .time{padding: 0 5px; font-size: 14px;line-height: 20px;border-radius: 5px; background: #fff;position: absolute;bottom: 5px;}
            .player .ctl .btn-play{left: 20px;}
            .player .ctl .btn-jy{right: 200px;}
            .player .ctl .btn-qp{right: 20px;}
            .player .ctl .sch{height: 12px;border:1px solid #fff;border-radius: 10px;
            position: absolute; bottom: 8px;overflow: hidden;z-index: 1;}
            .player .ctl .sch-play{width: 400px;left:230px;}
            .player .ctl .sch-yl{width:100px;right:80px;}
            .player .ctl .sch-play .sch-sp{width: 200px;}
            .player .ctl .sch-yl .sch-sp{width: 80px;}
            .player .ctl .sch .sch-sp{position: absolute;height: 12px; top: 0;background: #fff;}
            .player .ctl .sch-btn{position: absolute;width: 30px;height: 20px;border-radius: 5px; top: 5px;z-index: 2;background: #fff;}
            .player .ctl .sch-s{left:430px;}
            .player .ctl .sch-y{left:900px;}
            /*.player .ctl li:nth-child(1){position: absolute;left:20px;top: 50%;margin-top:-15px; }*/
        </style>
    </head>
    <body>

        <div class="player">
            <video>
                <source src="潭州教育.mp4" type="video/mp4">
                您的浏览器不支持Video标签。
            </video>
            <ul class="ctl" onselectstart="return false">
                <li class="btn btn-play">播放</li>
                <li class="time" style="left:100px">00:00:00</li>
                <li class="sch sch-play">
                    <span class="sch-sp" style = "width:0px;"></span>
                </li>
                <li class="sch-btn sch-s" style="left:215px;"></li>
                <li class="time" style="right:300px">00:00:00</li>
                <li class="btn btn-jy">静音</li>
                <li class="sch sch-yl">
                    <span class="sch-sp"></span>
                </li>
                <li class="sch-btn sch-y"></li>
                <li class="btn btn-qp">全屏</li>
            </ul>
        </div>
        <script type="text/javascript">


        var oVid = document.getElementsByClassName("player")[0];
        var oVideo = oVid.children[0];  //拿到video
        var oCtl = oVid.children[1]
        var oUl = oCtl.children;  //拿到所有li


        var oUlWidth = parseInt(oUl[2].offsetWidth)-2;

        var maxTime;
        var thisTime;
        var oSp = oUl[2].children[0];
        console.log(parseInt(oUl[3].style.left));
        var oLeft = parseInt(oUl[2].offsetLeft)+parseInt(oVid.offsetLeft)+parseInt(oCtl.offsetLeft);
        var oSchSp = parseInt(oVid.offsetLeft);




        oUl[0].onclick = function(){
            if(oVideo.paused){
                oVideo.play();
                oUl[0].innerHTML = "暂停";
                oVid.onmouseover = function(){
                    oCtl.style.opacity=0.8;
                }
                oVid.onmouseout = function(){
                    oCtl.style.opacity=0;
                }
            }else{
                oVideo.pause();
                oUl[0].innerHTML = "播放";
                oVid.onmouseover=null;
                oVid.onmouseout =null;
            }

        }
        var oDateOvideo = function(time){
            time = ""+time;
            time = time.length<2?0+time:time;
            return time;
        }
        oVideo.onloadedmetadata = function(){
            maxTime = oVideo.duration;
            var h = oDateOvideo(Math.floor(maxTime/3600));      //时
            var m = oDateOvideo(Math.floor(maxTime%3600/60));   //分
            var s = oDateOvideo(Math.floor(maxTime%3600%60));   //秒
            oUl[4].innerHTML = h+":"+m+":"+s;
        }
        function date(){
            thisTime = oVideo.currentTime;
            var h = oDateOvideo(Math.floor(thisTime/3600));     //时
            var m = oDateOvideo(Math.floor(thisTime%3600/60));  //分
            var s = oDateOvideo(Math.floor(thisTime%3600%60));  //秒
            oUl[1].innerHTML = h+":"+m+":"+s;

            var t = (thisTime/maxTime);

            //console.log(oUl[2].children[0].width);
            oSp.style.width = parseInt(oUlWidth-2) * t.toFixed(2)+"px";
            oUl[3].style.left = 215+parseInt( oSp.style.width ) +"px";
        }
        oVideo.ontimeupdate = date;
        oUl[5].onclick = function(){
            if(oVideo.muted){
                oVideo.muted=false;
                oUl[5].innerHTML = "静音";
            }else{
                oVideo.muted=true;
                oUl[5].innerHTML = "声音";
            }
        }
        var move = function(ev){
            ev = ev || window.event;
            var _X = ev.clientX;
            //oUl[3].style.left = parseInt(_X) - oSchSp;
            //var strae = parseInt(oUl[3].style.left);

            oVideo.ontimeupdate = null;
            //console.log(_X-oLeft);
            var t = _X-oLeft;
            oVideo.currentTime = parseInt(maxTime * (t/oUlWidth).toFixed(2));
            //console.log(parseInt(oUl[3].style.left));
            oSp.style.width = oUlWidth * (t/oUlWidth).toFixed(2)+"px";
            oUl[3].style.left = _X - oSchSp-15 +"px";
            document.onmousemove = function(ev){
                ev = ev || window.event;
                var _x = ev.clientX;
                var xChange = parseInt(_x)-parseInt(_X);

                //oUl[3].style.left = xChange + _X - oSchSp - 15 +"px";

                var t = _x - oLeft;
                console.log(oVideo.currentTime);
                oVideo.currentTime = parseInt(maxTime * (t/oUlWidth).toFixed(2));
                oSp.style.width = oUlWidth * (t/oUlWidth).toFixed(2)+"px";
                if ((_x - oSchSp-15)<200) {
                    oUl[3].style.left = 200+"px";
                }
                else if ((_x - oSchSp-15)>600) {
                    oUl[3].style.left = 600+"px";
                }
                else{
                    oUl[3].style.left = _x - oSchSp-15+"px";
                }
                //console.log(parseInt(_x)-parseInt(_X));
                date();
            }
            document.onmouseup = function(){
                //oUl[2].onmousedown = null;

                document.onmousemove = null;
                oVideo.ontimeupdate = date;
                //alert(oSp.onmousemove);
            }

        }
        oUl[2].onmousedown = move;
        oUl[3].onmousedown = move;
        oUl[8].onclick = function(){
            //oVideo.webkitRequestFullScreen();
             if(oVideo.requestFullScreen) {  
                oVideo.requestFullScreen();  
              } else if(oVideo.mozRequestFullScreen) {  
                oVideo.mozRequestFullScreen();  
              } else if(oVideo.webkitRequestFullScreen) {  
                oVideo.webkitRequestFullScreen();  
              }
        }






















        /*
        video和audio属性:
            Autoplay    视频就绪自动播放
            controls    向用户显示播放控件
            Width       设置播放器宽度             //audio没有
            Height      设置播放器高度         //audio没有
            Loop        播放完是否继续播放该视频,循环播放
            Preload     属性描述了在页面加载后是否预加载音视频;
                        如果设置了 autoplay 属性,则忽略该属性;
                        属性值:
                            none:不执行预加载也不执行元数据
                            mete:加载元数据(不加预载视频,但要获取视频时长等等属性)
                            auto:默认值(预加载或缓冲)
            Src         视频url地址
            Poster      加载等待的画面图片


        Video  API方法
            play()
            pause()
            load()
            全屏:   webkit    element.webkitRequestFullScreen();
                    Firefox    element.mozRequestFullScreen();
                    W3C        element.requestFullscreen();
            退出全屏:
                    webkit    document.webkitCancelFullScreen(); 
                    Firefox    document.mozCancelFullScreen(); 
                    W3C       document.exitFullscreen();


        Video  API属性
            currentTime  :  开始到播放现在所用的时间
            duration  :  媒体总时间(只读)
            volume  :   0.0-1.0的音量相对值
            muted  :   是否静音 false /true
            paused  :   媒体是否暂停(只读)
            ended   :   媒体是否播放完毕(只读)
            error   :  媒体发生错误的时候,返回错误代码 (只读)
            currentSrc  :   以字符串的形式返回媒体地址(只读)

                    loadstart progress suspend emptied stalled play pause loadedmetadata                                    loadeddata waiting playing canplay canplaythrough seeking seeked 
                    timeupdate ended ratechange durationchange volumechange


        HTML5支持的音频格式:

            Ogg        免费   支持的浏览器:C、F、O
            MP3        收费   支持的浏览器: I、C、S
            Wav        收费   支持的浏览器: F、O、S


            audio   属性  
                autoplay    自动播放
                controls    向用户显示播放控件
                loop        循环
                preload 是否等加载完再播放
                src     要播放的音频的 URL。


        */
        </script>
    </body>
</html>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值