自定义播放器

2018-04-19  本文已影响54人  他爱在黑暗中漫游
全屏操作API

注意:cancelFullScreen() 的调用时document

h5的api兼容问题

自定义播放器

多媒体API

音频和视频API一致

方法

方法 描述
addTextTrack() 向音频/视频添加新的文本轨道
canPlayType() 检测浏览器是否能播放指定的音频/视频类型
load() 重新加载音频/视频元素
play() 开始播放音频/视频
pause() 暂停当前播放的音频/视频

属性

属性 描述
audioTracks 返回表示可用音轨的 AudioTrackList 对象
autoplay 设置或返回是否在加载完成后随即播放音频/视频
buffered 返回表示音频/视频已缓冲部分的 TimeRanges 对象
controller 返回表示音频/视频当前媒体控制器的 MediaController 对象
controls 设置或返回音频/视频是否显示控件(比如播放/暂停等)
crossOrigin 设置或返回音频/视频的 CORS 设置
currentSrc 返回当前音频/视频的 URL
currentTime 设置或返回音频/视频中的当前播放位置(以秒计)
defaultMuted 设置或返回音频/视频默认是否静音
defaultPlaybackRate 设置或返回音频/视频的默认播放速度
duration 返回当前音频/视频的长度(以秒计)
ended 返回音频/视频的播放是否已结束
error 返回表示音频/视频错误状态的 MediaError 对象
loop 设置或返回音频/视频是否应在结束时重新播放
mediaGroup 设置或返回音频/视频所属的组合(用于连接多个音频/视频元素)
muted 设置或返回音频/视频是否静音
networkState 返回音频/视频的当前网络状态
paused 设置或返回音频/视频是否暂停
playbackRate 设置或返回音频/视频播放的速度
played 返回表示音频/视频已播放部分的 TimeRanges 对象
preload 设置或返回音频/视频是否应该在页面加载后进行加载
readyState 返回音频/视频当前的就绪状态
seekable 返回表示音频/视频可寻址部分的 TimeRanges 对象
seeking 返回用户是否正在音频/视频中进行查找
src 设置或返回音频/视频元素的当前来源
startDate 返回表示当前时间偏移的 Date 对象
textTracks 返回表示可用文本轨道的 TextTrackList 对象
videoTracks 返回表示可用视频轨道的 VideoTrackList 对象
volume 设置或返回音频/视频的音量

事件

事件 描述
abort 当音频/视频的加载已放弃时
canplay 当浏览器可以播放音频/视频时
canplaythrough 当浏览器可在不因缓冲而停顿的情况下进行播放时
durationchange 当音频/视频的时长已更改时
emptied 当目前的播放列表为空时
ended 当目前的播放列表已结束时
error 当在音频/视频加载期间发生错误时
loadeddata 当浏览器已加载音频/视频的当前帧时
loadedmetadata 当浏览器已加载音频/视频的元数据时
loadstart 当浏览器开始查找音频/视频时
pause 当音频/视频已暂停时
play 当音频/视频已开始或不再暂停时
playing 当音频/视频在已因缓冲而暂停或停止后已就绪时
progress 当浏览器正在下载音频/视频时
ratechange 当音频/视频的播放速度已更改时
seeked 当用户已移动/跳跃到音频/视频中的新位置时
seeking 当用户开始移动/跳跃到音频/视频中的新位置时
stalled 当浏览器尝试获取媒体数据,但数据不可用时
suspend 当浏览器刻意不获取媒体数据时
timeupdate 当目前的播放位置已更改时
volumechange 当音量已更改时
waiting 当视频由于需要缓冲下一帧而停止
细节注意
/*全屏操作后  自带的控制栏会显示  在显示的时候隐藏*/
video::-webkit-media-controls {
    display: none !important;
}
.controls {
    width: 700px;
    height: 40px;
    background-color: rgba(255, 255, 255, 0.2);
    border-radius: 4px;
    position: absolute;
    left: 50%;
    margin-left: -350px;
    bottom: 5px;
    /*比全屏的状态下的视频元素高*/
    z-index: 100000000000;
    opacity: 1;
}

本地存储

document.cookie

使用:

1. 设置cookie数据:document.cookie = '键=值;Expires=日期'
2. 获取cookie数据:document.cookie

1、如果没有设置有效期,会话结束就失效
2、如果设置有效期,依据有效期时间失效
3、在会话过程中,每次请求在报文的头部会携带cookie信息

window.sessionStorage

使用:

1.获取sessionStorage的长度:window.sessionStorage.length
2.根据对应的索引去获取对应sessionStorage的key的值:window.sessionStorage.key(索引);
3.添加/编辑sessionStorage的内容:window.sessionStorage.setItem(键,值);
4.根据对应的key获取对应的的value:window.sessionStorage.getItem(键);
5.根据对应的key删除记录:window.sessionStorage.removeItem(键);
6.清空存储:window.sessionStorage.clear();

1、生命周期为关闭浏览器窗口
2、在同一个窗口(页面)下数据可以共享

window.localStorage

使用:

1.获取localStorage的长度:window.localStorage.length
2.根据对应的索引去获取对应localStorage的key的值:window.localStorage.key(索引);
3.添加/编辑localStorage的内容:window.localStorage.setItem(键,值);
4.根据对应的key获取对应的的value:window.localStorage.getItem(键);
5.根据对应的key删除记录:window.localStorage.removeItem(键);
6.清空存储:window.localStorage.clear();

1、永久生效,除非手动删除 关闭页面也会存在
2、可以多窗口(页面)共享(同一浏览器可以共享)

总结
特性 cookie sessionStorage localStorage
数据生命期 默认关闭浏览器失效 页面会话期间可用 除非数据被清除,否则一直存在
存放数据大小 4K左右(因为每次http请求都会携带cookie) 一般5M或更大 约20M
与服务器通信 由对服务器的请求来传递,每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题 数据不是由每个服务器请求传递的,而是只有在请求时使用数据,不参与和服务器的通信
易用性 cookie需要自己封装setCookie,getCookie 可以用源生接口
共同点 都是保存在浏览器端,和服务器端的session机制不同

代码示例

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>视频播放</title>
    <!--字体图标文件-->
    <link rel="stylesheet" href="css/font-awesome.css"/>
    <!--修饰视频播放器样式-->
    <link rel="stylesheet" href="css/player.css"/>
</head>
<body>
<!--多媒体语义标签-->
<figure>
    <!--多媒体区域的标题解释-->
    <figcaption>视频播放器</figcaption>
    <div class="player">
        <!--一开始隐藏 加载可以播放就显示-->
        <video src="./media/fun.mp4"></video>
        <!--自定义控制栏-->
        <div class="controls">
            <!-- 开始播放按钮  -->
            <a href="javascript:;" class="switch fa fa-play"></a>
            <!-- 进度显示区域 -->
            <div class="progress">
                <!--进度显示条-->
                <div class="line"></div>
                <!--默认的灰色进度条-->
                <div class="bar"></div>
            </div>
            <!--时间区域-->
            <div class="timer">
                <span class="current">00:00:00</span> / <span class="total">00:00:00</span>
            </div>
            <!--全屏按钮 取消全屏按钮-->
            <a href="javascript:;" class="expand fa fa-arrows-alt"></a>
        </div>
    </div>
    <input type="text" class="dm"><button class="send">发射</button>
</figure>
<script src="js/jquery.min.js"></script>
<script>
    $(function () {
        /*需求*/
        /*适配jquery对象*/
        var $video = $('video');
        /*视频操作的相关api不在jquery 在dom上*/
        var video = $video.get(0); //$video[0]
        /*播放或者暂停按钮*/
        var $switch = $('.switch');
        /*默认的灰色进度条*/
        var $bar = $('.bar');
        /*显示进度的条*/
        var $line = $('.line');
        /*当前播放时间*/
        var $current = $('.current');
        /*总时间*/
        var $total = $('.total');
        /*全屏或取消按钮*/
        var $expand = $('.expand');

        /*转换格式的方法*/
        var formatTime = function (time) {
            /*处理的业务逻辑*/
            var h = Math.floor(time / 3600);
            var m = Math.floor(time % 3600 / 60);
            var s = Math.floor(time % 60);
            return (h < 10 ? '0' + h : h) + ':' + (m < 10 ? '0' + m : m) + ':' + (s < 10 ? '0' + s : s);
        };

        /*1. 实现加载效果(需要去判断当视频可以播放,视频显示)*/
        video.oncanplay = function () {
            $video.show();
            /*5. 时间显示 (实时的获取当前的播放时间 转换为需要的格式) 总时间*/
            var duration = video.duration;
            $total.html(formatTime(duration));
        }
        /*2. 播放功能 (点击播放图标 进行播放 需要把当前的按钮改为暂停)*/
        /*3. 暂停功能 (点击暂停图标 进行暂停 需要把当前的按钮改为播放)*/
        $switch.on('click', function () {
            /*播放操作*/
            if ($switch.hasClass('fa-play')) {
                video.play();
                $switch.removeClass('fa-play').addClass('fa-pause');
            }
            /*暂停操作*/
            else {
                video.pause();
                $switch.removeClass('fa-pause').addClass('fa-play');
            }
        });
        /*4. 进度显示 (实时的获取当前的播放时间 需要获取总时间  根据比设置宽度)*/
        video.ontimeupdate = function () {
            /*5. 时间显示 (实时的获取当前的播放时间 转换为需要的格式)*/
            var currentTime = video.currentTime;
            $current.html(formatTime(currentTime));
            /*设置宽度 使用的是 当前播放时间和总时间的比例*/
            var ratio = video.currentTime / video.duration * 100 + '%';
            $line.css('width', ratio);
        }
        /*8. 跃进功能 (获取当前点击的位置和总宽度的比例 去获取需要跳转的时间点)*/
        $bar.on('click', function (e) {
            /*获取点击的位置*/
            var offsetX = e.offsetX;
            /*获取进度条宽度*/
            var width = $bar.width();
            /*计算比例  获取需要跳转的时间点*/
            var ratio = offsetX/width;
            /*需要跳转的时间点*/
            var time = ratio * video.duration;
            /*怎么改变当前播放的时间*/
            video.currentTime = time;
        });

        /*6. 全屏功能 (全屏操作)*/
        /*7. 取消全屏功能 (取消全屏操作)*/
        $expand.on('click',function () {
            /*判断当前是全屏就是*/
            if($expand.hasClass('fa-arrows-alt')){
                $('.player')[0].webkitRequestFullScreen();
                $expand.removeClass('fa-arrows-alt').addClass('fa-compress');
            }
            /*如果不是执行取消全屏操作*/
            else {
                document.webkitCancelFullScreen();
                $expand.addClass('fa-arrows-alt').removeClass('fa-compress');
            }
        });
        /*问题:在使用esc取消全屏的时候  按钮样式不更改*/
        /*1. 方案:监听esc的按键事件 判断keyCode 去更改样式 在全屏操作的时候会禁用key相关事件*/
        /*2. 方案:监听页面尺寸改变  当视频处于取消全屏状态  才去修改样式*/
        $(window).on('resize',function () {
            /*判断全屏状态 如果不是全屏 需要改回全屏按钮*/
            if(!document.webkitIsFullScreen){
                $expand.addClass('fa-arrows-alt').removeClass('fa-compress');
            }
        });

        /*同学们的新需求 */
        $('.send').on('click',function () {
            var text = $('.dm').val();
            var $player = $('.player');
            $player.append($('<span></span>').text(text).css({
                width:200,
                position:'absolute',
                right:-200,
                fontWeight:'bold',
                top:300*Math.random(),
                color:'rgb('+Math.floor(256*Math.random())+','+Math.floor(256*Math.random())+','+Math.floor(256*Math.random())+')',
                zIndex:10000
            }).animate({right:720},10000,function () {
                $(this).remove();
            }));
        });

        /*1. 跃进功能  file://打开 */
        /*2. 谷歌浏览器62  你们的呢? 64版本以上兼容问题  全屏后控制栏可见 不可点击 */
        /*3. 插件 video.js  ckplayer.js */
    });
</script>
</body>
</html>
上一篇下一篇

猜你喜欢

热点阅读