video-05-videojs编写(全屏、非全屏)自定义控件!!!!

2023-10-27

兄弟们!!看到这里,你马上就可以自定义控件了,想想是不是都激动啊,但是这篇文章重在思路及简单实现,仔细看。

目录

一、控件分类

二、实现方案(方案二最好)

2.1 方案1(只能实现非全屏控件)

        2.1.1 思路

        2.1.2 效果

        2.1.3 代码

2.2 方法二(全屏、非全屏都可以实现!!)

        2.2.1 思路(仔细看,很重要!!!)

        2.2.2 效果 

         2.2.3 代码

三、到这里全屏控件和非全屏控件结束了,你肯定想到了那些炫酷的视频播放器都是怎么做的了吧 


一、控件分类

我把控件分为全屏控件,和非全屏控件,因为有的东西时单单需要全屏展示的

但是全屏控件这个东西,有点奇葩,没有思路很难写

二、实现方案(方案二最好

2.1 方案1(只能实现非全屏控件)

        2.1.1 思路

        我们可以通过简单的实现,就是css层级覆盖上面即可,(全屏的时候没有)

        2.1.2 效果

        2.1.3 代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>电视台</title>
    <!--引入video.js文件-->
    <link href="https://cdnjs.cloudflare.com/ajax/libs/video.js/7.3.0/video-js.min.css" rel="stylesheet">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/video.js/7.3.0/video.min.js"></script>
    <style type="text/css">
        .waike {
            position: relative;
        }

        #kongJianID {
            position: absolute;
            top: 10px;
            left: 10px;
            z-index: 9999;
            background-color: red;
        }
    </style>
</head>

<body>
    <div class="waike">
        <video id="example-video" class="video-js">
        </video>
        <div id="kongJianID">
            <button class="control" onclick=operation("play")>播放</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("stop")>停止</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("reload")>重载</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("reset")>重置</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("fastForward")>快进</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("back")>后退</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("volumeUp")>音量+</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("volumeDown")>音量-</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("fullScreen")>全屏</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("exitFullScreen")>退出全屏</button><br /><br /><br />
        </div>
    </div>



</body>

</html>
<script type="text/javascript">
    var kongJianDom = null
    var videoDom = null
    //      	video标签id,
    //      	配置选项(data-setup='{}'),
    //      	videojs初始化完成回调函数
    // var kongJianChange = () => {
    //     kongJianDom = document.getElementById("kongJianID")
    //     videoDom = document.getElementById("example-video")
    //     videoDom.appendChild(kongJianDom)
    // }
    var myPlayer = videojs('example-video', {
        title: 'Oceans',
        autoplay: true, // 设置自动播放
        muted: true, // 设置了它为true,才可实现自动播放,同时视频也被静音 (Chrome66及以上版本,禁止音视频的自动播放)
        preload: 'auto', // 预加载
        controls: true, // 显示播放的控件
        fluid: true, // 自适应宽高
        playbackRates: [0.5, 1, 1.5, 2, 3, 4],
        "sources": [{
            src: 'https://jf360videos.peopletech.cn/production/464f2fe20b1211ee83bef3d9bb3dfecd_1_video.mp4',
            type: 'video/mp4'
        }],
        controlBar: {
            // 设置控制条组件
            currentTimeDisplay: true,
            timeDivider: true,
            durationDisplay: true,
            remainingTimeDisplay: true,
            volumePanel: {
                inline: true
            },
            children: [{
                name: 'playToggle'
            }, // 播放/暂停按钮
            {
                name: 'currentTimeDisplay'
            }, // 视频当前已播放时间
            {
                name: 'progressControl'
            }, // 播放进度条
            {
                name: 'durationDisplay'
            }, // 视频播放总时间
            {
                // 倍速播放
                name: 'playbackRateMenuButton',
                playbackRates: [0.5, 1, 1.5, 2]
            },
            {
                name: 'volumePanel', // 音量控制
                inline: false // 不使用水平方式
            },
            {
                name: 'FullscreenToggle'
            } // 全屏
            ]
        }
    }, function onPlayerReady() {
        // var myPlayer = this;
        //在回调函数中,this代表当前播放器,
        //可以调用方法,也可以绑定事件。
        /**
         * 事件events    绑定事件用on    移除事件用off
         */
        this.on('suspend', function () {//延迟下载
            console.log("延迟下载")
        });
        this.on('loadstart', function () { //客户端开始请求数据
            console.log("客户端开始请求数据")
        });
        this.on('fullscreenchange', function () { //客户端开始请求数据
            console.log("全屏切换事件")
        });
        this.on('progress', function () {//客户端正在请求数据
            console.log("客户端正在请求数据")
        });
        this.on('abort', function () {//客户端主动终止下载(不是因为错误引起)
            console.log("客户端主动终止下载")
        });
        this.on('error', function () {//请求数据时遇到错误
            console.log("请求数据时遇到错误")
        });
        this.on('stalled', function () {//网速失速
            console.log("网速失速")
        });
        this.on('play', function () {//开始播放
            console.log("开始播放")
        });
        this.on('pause', function () {//暂停
            console.log("暂停")
        });
        this.on('loadedmetadata', function () {//成功获取资源长度
            console.log("成功获取资源长度")
        });
        this.on('loadeddata', function () {//渲染播放画面
            console.log("渲染播放画面")
        });
        this.on('waiting', function () {//等待数据,并非错误
            console.log("等待数据")
        });
        this.on('playing', function () {//开始回放
            console.log("开始回放")
        });
        this.on('canplay', function () {//可以播放,但中途可能因为加载而暂停
            console.log("可以播放,但中途可能因为加载而暂停")
        });
        this.on('canplaythrough', function () { //可以播放,歌曲全部加载完毕
            console.log("可以播放,歌曲全部加载完毕")
        });
        this.on('seeking', function () { //寻找中
            console.log("寻找中")
        });
        this.on('seeked', function () {//寻找完毕
            console.log("寻找完毕")
        });
        this.on('timeupdate', function () {//播放时间改变
            console.log("播放时间改变")
        });
        this.on('ended', function () {//播放结束
            console.log("播放结束")
        });
        this.on('ratechange', function () {//播放速率改变
            console.log("播放速率改变")
        });
        this.on('durationchange', function () {//资源长度改变
            console.log("资源长度改变")
        });
        this.on('volumechange', function () {//音量改变
            console.log("音量改变")
        });
    });
    /**
     * 方法
     */
    function operation(param) {
        console.log(param)
        if ("play" == param) {	//开始播放
            myPlayer.play();
        } else if ("stop" == param) {	//停止播放
            myPlayer.pause();
        } else if ("fastForward" == param) { //快进
            var whereYouAt = myPlayer.currentTime();
            myPlayer.currentTime(10 + whereYouAt);
        } else if ("reload" == param) {	//重新加载
            myPlayer.pause();
            myPlayer.load();
            myPlayer.play();
        } else if ("back" == param) {	//后退
            var whereYouAt = myPlayer.currentTime();
            myPlayer.currentTime(whereYouAt - 10);
        } else if ("fullScreen" == param) {	//全屏
            myPlayer.requestFullscreen();
        } else if ("exitFullScreen" == param) {	//退出全屏
            myPlayer.exitFullscreen();
        } else if ("volumeUp" == param) {	//音量加
            var howLoudIsIt = myPlayer.volume();
            myPlayer.volume(howLoudIsIt + 10);
        } else if ("volumeDown" == param) {	//音量减
            var howLoudIsIt = myPlayer.volume();
            console.log(howLoudIsIt)
            myPlayer.volume(howLoudIsIt - 10);
        } else if ("reset" == param) {	//重置,视频不会播放	
            myPlayer.reset();
        }
    }
</script>

2.2 方法二(全屏、非全屏都可以实现!!)

        2.2.1 思路(仔细看,很重要!!!)

        这个当时项目编写的时候写了很久,因为没有思路,我需要写一个全屏控件,但是各种方案都试了,什么层级覆盖啥的,都不行,后来我看了看dom结构,只有被id为example-video的盒子包裹住的dom,全屏才会展示,所以我当时,想可不可以通过创建一个dom,然后添加到这里是不是也可以,测试了一下是可行的,但是我很块发现,创建dom,编写上去好难,因为我的页面逻辑比较多询问了公司大佬,大佬提供了牛逼牛逼思路:就是先将页面写好,再将实体dom移动到对应位置!!!

        2.2.2 效果 

非全屏

全屏

         2.2.3 代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>电视台</title>
    <!--引入video.js文件-->
    <link href="https://cdnjs.cloudflare.com/ajax/libs/video.js/7.3.0/video-js.min.css" rel="stylesheet">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/video.js/7.3.0/video.min.js"></script>
    <style type="text/css">
        .waike {
            position: relative;
        }

        #kongJianID {
            position: absolute;
            top: 10px;
            left: 10px;
            z-index: 9999;
            background-color: red;
        }
    </style>
</head>

<body>
    <div class="waike">
        <video id="example-video" class="video-js">
        </video>
        <div id="kongJianID">
            <button class="control" onclick=operation("play")>播放</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("stop")>停止</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("reload")>重载</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("reset")>重置</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("fastForward")>快进</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("back")>后退</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("volumeUp")>音量+</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("volumeDown")>音量-</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("fullScreen")>全屏</button>&nbsp&nbsp&nbsp&nbsp&nbsp
            <button class="control" onclick=operation("exitFullScreen")>退出全屏</button><br /><br /><br />
        </div>
    </div>



</body>

</html>
<script type="text/javascript">
    var kongJianDom = null
    var videoDom = null
    //      	video标签id,
    //      	配置选项(data-setup='{}'),
    //      	videojs初始化完成回调函数
    var kongJianChange = () => {
        //核心函数
        kongJianDom = document.getElementById("kongJianID")
        videoDom = document.getElementById("example-video")
        videoDom.appendChild(kongJianDom)
    }
    var myPlayer = videojs('example-video', {
        title: 'Oceans',
        autoplay: true, // 设置自动播放
        muted: true, // 设置了它为true,才可实现自动播放,同时视频也被静音 (Chrome66及以上版本,禁止音视频的自动播放)
        preload: 'auto', // 预加载
        controls: true, // 显示播放的控件
        fluid: true, // 自适应宽高
        playbackRates: [0.5, 1, 1.5, 2, 3, 4],
        "sources": [{
            src: 'https://jf360videos.peopletech.cn/production/464f2fe20b1211ee83bef3d9bb3dfecd_1_video.mp4',
            type: 'video/mp4'
        }],
        controlBar: {
            // 设置控制条组件
            currentTimeDisplay: true,
            timeDivider: true,
            durationDisplay: true,
            remainingTimeDisplay: true,
            volumePanel: {
                inline: true
            },
            children: [{
                name: 'playToggle'
            }, // 播放/暂停按钮
            {
                name: 'currentTimeDisplay'
            }, // 视频当前已播放时间
            {
                name: 'progressControl'
            }, // 播放进度条
            {
                name: 'durationDisplay'
            }, // 视频播放总时间
            {
                // 倍速播放
                name: 'playbackRateMenuButton',
                playbackRates: [0.5, 1, 1.5, 2]
            },
            {
                name: 'volumePanel', // 音量控制
                inline: false // 不使用水平方式
            },
            {
                name: 'FullscreenToggle'
            } // 全屏
            ]
        }
    }, function onPlayerReady() {
        // var myPlayer = this;
        //在回调函数中,this代表当前播放器,
        //可以调用方法,也可以绑定事件。
        /**
         * 事件events    绑定事件用on    移除事件用off
         */
        this.on('suspend', function () {//延迟下载
            console.log("延迟下载")
        });
        this.on('loadstart', function () { //客户端开始请求数据
            console.log("客户端开始请求数据")
        });
        this.on('fullscreenchange', function () { //客户端开始请求数据
            console.log("全屏切换事件")
        });
        this.on('progress', function () {//客户端正在请求数据
            console.log("客户端正在请求数据")
        });
        this.on('abort', function () {//客户端主动终止下载(不是因为错误引起)
            console.log("客户端主动终止下载")
        });
        this.on('error', function () {//请求数据时遇到错误
            console.log("请求数据时遇到错误")
        });
        this.on('stalled', function () {//网速失速
            console.log("网速失速")
        });
        this.on('play', function () {//开始播放
            console.log("开始播放")
        });
        this.on('pause', function () {//暂停
            console.log("暂停")
        });
        this.on('loadedmetadata', function () {//成功获取资源长度
            console.log("成功获取资源长度")
            kongJianChange()
        });
        this.on('loadeddata', function () {//渲染播放画面
            console.log("渲染播放画面")
        });
        this.on('waiting', function () {//等待数据,并非错误
            console.log("等待数据")
        });
        this.on('playing', function () {//开始回放
            console.log("开始回放")
        });
        this.on('canplay', function () {//可以播放,但中途可能因为加载而暂停
            console.log("可以播放,但中途可能因为加载而暂停")
        });
        this.on('canplaythrough', function () { //可以播放,歌曲全部加载完毕
            console.log("可以播放,歌曲全部加载完毕")
        });
        this.on('seeking', function () { //寻找中
            console.log("寻找中")
        });
        this.on('seeked', function () {//寻找完毕
            console.log("寻找完毕")
        });
        this.on('timeupdate', function () {//播放时间改变
            console.log("播放时间改变")
        });
        this.on('ended', function () {//播放结束
            console.log("播放结束")
        });
        this.on('ratechange', function () {//播放速率改变
            console.log("播放速率改变")
        });
        this.on('durationchange', function () {//资源长度改变
            console.log("资源长度改变")
        });
        this.on('volumechange', function () {//音量改变
            console.log("音量改变")
        });
    });
    /**
     * 方法
     */
    function operation(param) {
        console.log(param)
        if ("play" == param) {	//开始播放
            myPlayer.play();
        } else if ("stop" == param) {	//停止播放
            myPlayer.pause();
        } else if ("fastForward" == param) { //快进
            var whereYouAt = myPlayer.currentTime();
            myPlayer.currentTime(10 + whereYouAt);
        } else if ("reload" == param) {	//重新加载
            myPlayer.pause();
            myPlayer.load();
            myPlayer.play();
        } else if ("back" == param) {	//后退
            var whereYouAt = myPlayer.currentTime();
            myPlayer.currentTime(whereYouAt - 10);
        } else if ("fullScreen" == param) {	//全屏
            myPlayer.requestFullscreen();
        } else if ("exitFullScreen" == param) {	//退出全屏
            myPlayer.exitFullscreen();
        } else if ("volumeUp" == param) {	//音量加
            var howLoudIsIt = myPlayer.volume();
            myPlayer.volume(howLoudIsIt + 10);
        } else if ("volumeDown" == param) {	//音量减
            var howLoudIsIt = myPlayer.volume();
            console.log(howLoudIsIt)
            myPlayer.volume(howLoudIsIt - 10);
        } else if ("reset" == param) {	//重置,视频不会播放	
            myPlayer.reset();
        }
    }
</script>

三、到这里全屏控件和非全屏控件结束了,你肯定想到了那些炫酷的视频播放器都是怎么做的了吧 

博主在这里有一个点没有尝试,就是不使用videojs怎么写全屏控件

有了解的大牛,可以放在评论区,大家一块学习!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

video-05-videojs编写(全屏、非全屏)自定义控件!!!! 的相关文章

随机推荐

  • Angular4.0_开发准备

    启动Angular过程介绍 启动时加载了哪个页面 启动时加载了哪些脚本 这些脚本做了什么事 默认情况下是index对应的文件是启动时加载的页面 main ts是启动时的起点文件 main ts 核心模块提供的enableProdMode用来
  • 多媒体指令(灰度像素最大值)

    如果不是处理的灰度图像 那么最大值也就没什么意思了 彩色图也可以转成灰度图嘛 虽然用了汇编 不过没有使用多媒体指令 灰度图像的RGB都一样 没必要使用mmx寄存器了 直接对单个字节处理就行了 获得最小值和获得最大值原理一样 只需改一个指令
  • 基础指南 之 归并排序

    归并排序 两个有序数组的归并 数组 a 和数组 b 都是非降序的数组 数组长度分别为 m 和 n 将两个数组合并成一个升序数组 c 程序如下所示 void merge int a int m int b int n int c int i
  • com.rabbitmq.client.ShutdownSignalException: connection error;连接rabbitMQ失败

    com rabbitmq client ShutdownSignalException connection error 连接rabbitMQ失败 大概率原因是权限不足 rabbitmqctl set permissions p admin
  • 51单片机-LED篇

    目录 准备工作 点亮一个LED灯 写程序 烧录 LED闪烁 延时代码Delay500ms 烧录 LED流水灯 代码 对LED流水灯代码进行优化 增加复用性 延时代码 代码 准备工作 使用到的单片机是普中51单片机 使用到的软件是Keil u
  • 写作副业怎么弄?写文章的副业应该怎么做?

    现在越来越流行 斜杠青年 这个词了 人们总是希望在做好本职工作的基础上 还能够有另外一份获取收入的工作 也就是 副业 而在 副业 的众多选项里 很多人都看好 写作 这一项 但是 当我们普通人想要开启写作之路 赚取副业收入的时候 具体应该怎么
  • 用户友好性检测

    我们一般通过三个指标来检验一个网站是否对于用户友好 这三个指标分别是 链接的可用性 访问速度体验和查找信息的便捷度 一 链接的可用性 试想 一个访问者来到你的网站 点击一个超级链接 却发现浏览器只返回一个错误404 页面 如果网页中不可用链
  • Unity3D 引擎学习2022资料整理(二)

    Utils C APR Apache Portable Runtime 另一个跨平台的实用函数库 Apache2 0 官网 C Algorithms 一个常用算法和数据结构的集合 官网 CPL The Common Pipeline Lib
  • edge浏览器受信任_Edge 浏览器如何添加信任站点

    Microsoft Edge 无法添加信任站点 组策略没有批量设置 只能逐条设置 然后从DC推到所向域内客户端 如果你是用Site to Zone Assignment List Enabled策略或来设置信任站点的话 客户端确实无法手动添
  • OpenHarmony之docker容器的基本用法

    Docker使用示例 docker移植至OpenHarmony的过程可参考 https blog 51cto com u 14601312 5692202 下面以rk3568 OpenHarmony为例 介绍一下如何进行容器制作 导入及使用
  • 一招解决报错:pyassimp.errors.AssimpError: assimp library not found

    文章目录 1 问题描述 2 原因分析 3 解决方法 1 问题描述 在使用pip install pyassimp安装pyassimp库后 调用时会出现错误 File root anaconda3 envs kgn lib python3 8
  • qt5.12.10 在linux(国产系统)的源码编译、移植问题记录

    1 概述 Qt版本 Qt5 12 10 Qt 官网下载地址 Qt官网 路径 Qt5 12 10源码目录目录下下载 qt everywhere src 5 12 10 tar xz 编译平台 方德 其余架构亦可考 2 编译源码记录 1 下载源
  • Flutter 最常出现的错误

    哔哩哔哩漫画APP实践Flutter也有大半年时间了 我针对线上收集到的错误进行分析 挑选出了一些有一般代表性的错误 列在本文 可供实践 Flutter 的初学者们作为一点参考 典型错误一 无法掌握的Future 典型错误信息 NoSuch
  • spring boot 实现注解+自定义配置多数据库

    spring boot 实现注解 自定义配置多数据库 配置多数据库 注解 AOP maven依赖 多数据源配置 代码实现 存在问题 配置多数据库 注解 AOP 你好 这是你第一次使用 Markdown编辑器 所展示的欢迎页 如果你想学习如何
  • shell编程(六) : [shell基础] 基本shell脚本

    接上一篇文章Linux shell编程 五 Linux文件权限管理 三 Linux shell 脚本编程基础 了解了Linux系统和命令行的基础知识 是时候开始编程了 3 1 基本shell脚本 shell脚本的关键在于输入多个命令并处理每
  • Google-Guava-EventBus源码解读

    Guava是Google开源的一个Java基础类库 它在Google内部被广泛使用 Guava提供了很多功能模块比如 集合 并发库 缓存等 EventBus是其中的一个module 本篇结合EventBus源码来谈谈它的设计与实现 概要 首
  • 基础算法题——奇怪的分式(避免小数运算)

    奇怪的分式 上小学的时候 小明经常自己发明新算法 一次 老师出的题目是 1 4 乘以 8 5 小明居然把分子拼接在一起 分母拼接在一起 答案是 18 45 参见图1 png 老师刚想批评他 转念一想 这个答案凑巧也对啊 真是见鬼 对于分子
  • 强大的.NET反编译工具Reflector及插件

    刚接触 net 时就听说 Reflector这个强大反编译工具呢 只是一直没有去使用他 今天update跟我说Reflector如何 如何有用 用的如何 如何爽 还得意的说反编译了不少DLL 本来本人对新鲜事就非常有兴趣 听他这么一说 决定
  • Oracle 存储过程 与 函数 区别

    定义 存储过程 Stored Procedure 是一组为了完成特定功能的SQL 语句集 经编译后存储在数据库中 用户通过指定存储过程的名字并给出参数 如果该存储过程 带有参数 来执行它 存储过程是数据库中的一个重要对象 任何一个设计良好的
  • video-05-videojs编写(全屏、非全屏)自定义控件!!!!

    兄弟们 看到这里 你马上就可以自定义控件了 想想是不是都激动啊 但是这篇文章重在思路及简单实现 仔细看 目录 一 控件分类 二 实现方案 方案二最好 2 1 方案1 只能实现非全屏控件 2 1 1 思路 2 1 2 效果 2 1 3 代码