自定义视频播放器(功能包括:播放/暂停,全屏,跳播)

最终效果:

1、demo结构

fontawesome字体下载:http://fontawesome.dashgame.com/

loading.gif:百度loading.gif选择一张下载

2、index.html

  功能包括:播放/暂停,全屏,跳播

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>自定义视频播放器</title>
    <link rel="stylesheet" href="./css/font-awesome.min.css">
    <link rel="stylesheet" href="./css/index.css">
</head>
<body>
<h3 class="player-title">视频播放器</h3>
<div class="player-container">
    <video src="./mp4/test.mp4"></video>
    <div class="controls-container">
        <!-- 播放/暂停 -->
        <a href="javascript:;" class="switch fa fa-play"></a>
        <!-- 全屏 -->
        <a href="javascript:;" class="expand fa fa-expand"></a>
        <!-- 进度条 -->
        <div class="progress"><!-- 进度条底色 -->
            <div class="bar"></div><!-- 进度条最外层,用于事件控制 -->
            <div class="loaded"></div><!-- 已加载 -->
            <div class="current-progress"></div><!-- 已播放 -->
        </div>
        <!-- 当前播放时间, 视频总长 -->
        <div class="time">
            <span class="current-time">00:00:00</span>
                        <span class="total-time">00:00:00</span>
        </div>
    </div>
</div>

<script type="text/javascript">
    // 播放器
    const video = document.querySelector(‘video‘);
    // "播放/暂停"切换按钮
    const switchBtn = document.querySelector(‘.switch‘);
    // 当前播放时间span
    const currentTimeSpan = document.querySelector(‘.current-time‘)
    // 视频总时长
    const totalTimeSpan = document.querySelector(‘.total-time‘)
    // 当前播放进度条
    const currentProgress = document.querySelector(‘.current-progress‘)
    // 获取进度条最外层,用于事件控制
    const bar = document.querySelector(‘.bar‘);

    // 实现"播放/暂停"
    switchBtn.onclick = function() {
        // 播放与暂停的切换
        if (video.paused) {
            video.play();
        } else {
            video.pause();
        }
        // 播放与暂停图标的切换
        this.classList.toggle(‘fa-pause‘);
        this.classList.toggle(‘fa-play‘);
    }

    // 实现"全屏"
    const playerContainer = document.querySelector(‘.player-container‘);
    document.querySelector(‘.expand‘).onclick = function() {
        if(playerContainer.requestFullScreen){
            playerContainer.requestFullScreen();
        } else if(playerContainer.webkitRequestFullScreen){
            playerContainer.webkitRequestFullScreen();
        } else if(playerContainer.mozRequestFullScreen){
            playerContainer.mozRequestFullScreen();
        } else if(playerContainer.msRequestFullScreen){
            playerContainer.msRequestFullScreen();
        }
    }

    // 当视频文件可以播放时触发
    // 当跳播时,修改了video.currentTime,也会触发该事件
    video.oncanplay = function() {
        console.log(‘触发oncanplay事件, video.currentTime=‘, video.currentTime)
        if (video.currentTime === 0) {
            setTimeout(function() {
                console.log(‘视频缓存完成,可以播放了。。。‘)
                // 显示视频第一帧画面
                video.style.display = ‘block‘
                // 获取当前视频文件总时长
                const totalTime = video.duration;
                console.log(`当前视频文件总时长: ${totalTime}秒`); // 单位为秒, 292.975736
                // 页面显示视频总时长
                totalTimeSpan.innerHTML = getTime(totalTime);
            }, 2000)
        }

    }

    // 当视频播放的时候会触发ontimeupdate事件,进度条同步,当前时间同步
    // 当跳播时,修改了video.currentTime,也会触发该事件
    video.ontimeupdate = function() {
        console.log(‘触发ontimeupdate事件。。。‘)
        // 获取当前时间
        const currentTime = video.currentTime;
        // 计算出视频的总时长
        const totalTime = video.duration;
        // 显示当前播放时间
        currentTimeSpan.innerHTML = getTime(currentTime);
        //进度条同步: 当前时间/总时间
        const value = currentTime / totalTime;
        currentProgress.style.width = value * 100 + "%";
        //当播放完毕之后,播放暂停按钮要转换成暂停按钮
        if (currentTime === totalTime) {
            switchBtn.classList.remove(‘fa-pause‘);
            switchBtn.classList.add(‘fa-pause‘);
        }
    }

    // 实现视频跳播
    bar.onclick = function(e) {
        // 获取鼠标点击位置相对bar最左侧的距离
        const offset = getOffsetX(e);
        // 获取bar的宽度
        const barWidth = this.style.width || this.clientWidth || this.offsetWidth || this.scrollWidth;
        console.log(`offset=${offset}, barWidth=${barWidth}`)
        const percent = offset / barWidth;
        const currentTime = percent * video.duration;
        video.currentTime = currentTime;
    }

    function getTime(time) {
        //转换时长
        let h = Math.floor(time / 3600);
        let m = Math.floor(time % 3600 / 60);
        let s = Math.floor(time % 60);
        //转换格式
        h = h > 10 ? h : "0" + h;
        m = m > 10 ? m : "0" + m;
        s = s > 10 ? s : "0" + s;
        return h + ":" + m + ":" + s;
    }

    // 火狐浏览器不支持e.offsetX,解决方法
    function getOffsetX(e){
        var e = e || window.event;
        var srcObj = e.target || e.srcElement;
        if (e.offsetX) {
            return e.offsetX;
        } else {
            var rect = srcObj.getBoundingClientRect();
            var clientx = e.clientX;
            return clientx - rect.left;
        }
    }
</script>
</body>
</html>

3、index.css

body {
    padding: 0;
    margin: 0;
    font-family: ‘microsofy yahei‘;
    background-color: #F7F7F7;
}

a {
    text-decoration: none;
}

.player-title {
    width: 100%;
    margin: 0 auto;
    line-height: 100px;
    font-size: 40px;
    text-align: center;
}

.player-container {
    width: 720px;
    height: 360px;
    margin: 0 auto;
    background: url(‘../images/loading.gif‘) center no-repeat;
    background-size: cover;
    position: relative;
}
video {
    height: 100%;
    margin: 0 auto;
    display: none;
}

/* ================ 播放器控制面板样式 start ================ */
.controls-container {
    width: 720px;
    height: 40px;
    position: absolute;
    left: 0px;
    bottom: -40px;
    background-color: #000;
}

/* 播放/暂停 */
.controls-container .switch {
    width: 20px;
    height: 20px;
    display: block;
    font-size: 20px;
    color: #fff;
    position: absolute;
    left: 10px;
    top: 10px;
}
/* 全屏 */
.controls-container .expand {
    width: 20px;
    height: 20px;
    display: block;
    font-size: 20px;
    color: #fff;
    position: absolute;
    right: 10px;
    top: 10px;
}
/* 进度条 */
.controls-container .progress {
    width: 430px;
    height: 10px;
    position: absolute;
    left: 40px;
    bottom: 15px;
    background-color: #555;
}
.controls-container .progress .bar {
    /*width: 100%;*/
    width: 430px;
    height: 100%;
    border-radius: 3px;
    cursor: pointer;
    position: absolute;
    left: 0;
    top: 0;
    opacity: 0;
    z-index: 999;
}
.controls-container .progress .loaded {
    width: 60%; /* 视频缓存的进度, 后期可动态变化 */
    height: 100%;
    background-color: #999;
    border-radius: 3px;
    position: absolute;
    left: 0;
    top: 0;
    z-index: 2;
}
.controls-container .progress .current-progress {
    width: 0%; /* 初始播放进度为0 */
    height: 100%;
    background-color: #fff;
    border-radius: 3px;
    position: absolute;
    left: 0;
    top: 0;
    z-index: 3;
}
.controls-container .time {
    height: 20px;
    position: absolute;
    left: 490px;
    top: 10px;
    color: #fff;
    font-size: 14px;
}
/* ================ 播放器控制面板样式 end ================ */

4、测试

  1)打开index.html页面,视频加载完成打印"视频缓存完成,可以播放了。。。";

  2)点击进度条某个位置,首先触发了bar.onclick事件,计算并更新video.currentTime;然后触发了ontimeupdate事件和oncanplay事件。

  3)点击播放按钮;

  4)播放完毕后,发现一个小bug

  解决:

  删除代码:

//当播放完毕之后,播放暂停按钮要转换成暂停按钮
// if (currentTime === totalTime) {
//     switchBtn.classList.remove(‘fa-pause‘);
//     switchBtn.classList.add(‘fa-pause‘);
// }

  添加代码:

// 视频播放完毕,重置播放状态为初始状态
video.onended = function() {
    video.currentTime = 0;
    switchBtn.classList.remove(‘fa-pause‘);
    switchBtn.classList.add(‘fa-pause‘);
}

---

原文地址:https://www.cnblogs.com/xy-ouyang/p/12349549.html

时间: 2024-10-13 12:20:44

自定义视频播放器(功能包括:播放/暂停,全屏,跳播)的相关文章

淘宝店铺装修如何实现全屏轮播

淘宝店装移植有一个神秘的模块,那就是—全屏轮播,这个神奇的模块,能提高店铺的档次,给与顾客视觉冲击,提升顾客印象但是由于淘宝常规用户不支持CSS(用来定义网页样貌的能力),所以我们无法用简单的div+CSS来做出属于自己的全屏轮播强大的装修师们几经研究,终于摆脱了CSS的束绷,结合淘宝的轮播组件,单靠DIV代码就实现了全屏轮播(有缺点) 那么.不要CSS,我们怎么实现全屏轮播呢? 首先我要告诉大家全屏轮播的核心CSS属性—position:absolute 第一节:核心属性 position :

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

来源:http://www.html5china.com/HTML5features/video/201109206_1994.html 简介HTML5的<video>标签已经被目前大多数主流浏览器所支持,包括还未正式发布的IE9也声明将支持<video>标签,利用浏览器原生特性嵌入视频有很多好处,所以很多开发者想尽快用上,但是真正使用前还有些问题要考虑,尤其是 Opera/Firefox 和IE/Safari浏览器所支持的视频编码不同的问题,Google几个月前发布的开源视频编码

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

简介 HTML5的<video>标签已经被目前大多数主流浏览器所支持,包括还未正式发布的IE9也声明将支持<video>标签,利用浏览器原生特性嵌入视频有很多好处,所以很多开发者想尽快用上,但是真正使用前还有些问题要考虑,尤其是 Opera/Firefox 和IE/Safari浏览器所支持的视频编码不同的问题,Google几个月前发布的开源视频编码VP8有望能解决这一问题,另外Google还发布了开放网络媒体项目WebM,旨在帮助开发者为开放网络制作出世界级媒体格式,Opera,

Swift中使用MPMoviePlayerController实现自定义视频播放器界面

默认情况下播放器自带各种控制按钮,比如前进后退播放暂停等: var url = NSBundle.mainBundle().URLForResource("1", withExtension: "mp4") var play1 = MPMoviePlayerViewController(contentURL: url) self.presentMoviePlayerViewControllerAnimated(play1) 效果如下: 有时候希望自定义播放器界面.各

jqm视频播放器,html5视频播放器,html5音乐播放器,html5播放器,video开发demo,html5视频播放示例,html5手机视频播放器

最近在论坛中看到了很多实用html5开发视频播放,音乐播放的功能,大部分都在寻找答案.因此我就在这里做一个demo,供大家相互学习.html5开发越来越流行了,而对于视频这一块也是必不可少的一部分.如何让你的网站占据优势,就要看你的功能和用户体验了.html5对video还是做了很多优惠的东西,我们使用起来很得心应手. 在过去 flash 是网页上最好的解决视频的方法,截至到目前还算是主流,像那些优酷之类的视频网站.虾米那样的在线音乐网站,仍然使用 flash 来提供播放服务.但是这种状况将会随

Android进阶:自定义视频播放器开发(上)

随着快手,抖音,西瓜视频等视频APP的崛起,视频播放已经成为主流,此时作为Android研发的你,想要提高自己的能力还不知道怎么开发视频播放器怎么行?所以今天就带着大家一起开发一个简易播放器:SmallVideoPlayer 需求分析 我们观察一个视频播放器,可以看到视频播放器除了正在播放的视频还有很多控件,比如播放按钮,暂停按钮,播放进度条,播放计时器等.这么多控件显然无法播放视频,但是他们都在控制视频的播放.由此可见视频播放器可以分为两层,一层为视频播放器控制层,一层为真正的视频播放层. 所

Android进阶 自定义视频播放器

随着快手,抖音,西瓜视频等视频APP的崛起,视频播放已经成为主流,此时作为Android研发的你,想要提高自己的能力还不知道怎么开发视频播放器怎么行?所以今天就带着大家一起开发一个简易播放器:SmallVideoPlayer 一.需求分析 我们观察一个视频播放器,可以看到视频播放器除了正在播放的视频还有很多控件,比如播放按钮,暂停按钮,播放进度条,播放计时器等.这么多控件显然无法播放视频,但是他们都在控制视频的播放.由此可见视频播放器可以分为两层,一层为视频播放器控制层,一层为真正的视频播放层.

Android进阶:自定义视频播放器开发(下)

上一篇文章我们主要讲了视频播放器开发之前需要准备的一个知识,TextureView,用于对图像流的处理.这篇文章开始构建一个基础的视频播放器. 一.准备工作 在之前的文章已经说过了,播放器也是一个view,我们要在这个view上播放视频流.所以我们要自定义一个简单的viewgroup,比如继承FrameLayout.还出就是布局简单,其他控件可以往上面添加.大家见过的视频播放器的控制器都是放在视频的上方的.这样就是用FrameLayout布局是最好的. class SmallVideoPlaye

android求助:关于播放器中的“播放/暂停”键: 用ImageButton来设置点击效果时的问题

============问题描述============ 大家好,我最近遇到个问题: 大家都知道,播放器中的播放/暂停键是这样的逻辑:当用户点击了这个键,如果当前显示的是"播放"图案,会变为"暂停"图案:反之,如果当前是"暂停"图案,会变为"播放"图案 , 如此反复... 现在我正在实现这个效果,我是这样做的: 在以上的基本效果的基础上,我还添加了点击过程中的效果,就是当点下还木有松开时,会有一个点击效果(比如给当前图片加个光