HTML5的多个video标签:截取视频源的封面图poster,监听视频播放状态的功能;

2023-11-20

在日常项目中,html5的video标签还是比较常用到的,开发过程中,我们都会使用到,通过监听video标签的播放、暂停、停止等等来使用;

  • 我们是否也会遇到过,有些浏览器在显示这标签,兼容不太友好,video标签的封面是一层黑色的;
  • ok,那么我们可以使用video标签的poster(封面图)属性,存储起来,进行展示;
  • 存储方式:h5的canvas画布,简单处理一下;
  • 需注意先用本地视频,非本地视频会有跨域截取问题,这个得跟后端开发协作处理后;video标签需加属性 crossOrigin=“anonymous”
  • 如非本地资源报错跨域问题:`Uncaught DOMException: Failed to execute ‘toDataURL’ on ‘HTMLCanvasElement’: Tainted canvases may not be exported.``

效果图如下:
效果图展示

案例的代码如下:
html结构:


<h1>视频video应用:截取封面图;监听播放状态</h1>

<div class="video-con">
    <video class="video" crossOrigin="anonymous"  poster="">
        <source src="1.mp4" >
    </video>
    <button type="button" class="btn js-play-btn"></button>
</div>

<div class="video-con">
    <video class="video" crossOrigin="anonymous" poster="">
        <source src="2.mp4" >
    </video>
    <button type="button" class="btn js-play-btn"></button>
</div>

js功能:

  // 视频------视频截图 ~~ 视频播放状态 ~~
    const setMedia = (video, scale = 0.8)=> {
        // 设置poster属性:(非本地视频资源会有跨域截图问题)
        video.addEventListener('loadeddata', (e)=> {
            setTimeout(()=>{
                // 拿到图片
                let canvas = document.createElement('canvas'),
                    ctx = canvas.getContext("2d");
                canvas.width = video.videoWidth * scale;
                canvas.height = video.videoHeight * scale;
                ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
                let src = canvas.toDataURL('image/png');
                // 设置属性
                video.setAttribute('poster', src);

                // 显示在dom,测试用
                (function(flag = true) {
                    // if (!flag) {
                    //     return;
                    // }
                    let img = document.createElement('img');
                    img.src = src;
                    document.body.appendChild(img);
                })(0);

            },.5e3);
        });

        //检测视频播放状态:
        //播放按钮
        let playBtn =  video.parentNode.childNodes[2].nextSibling;
        //设置状态
        function vidplaySate(e) {
            if (video.paused) {
                video.play();
                playBtn.classList.add('pause');
            } else {
                video.pause();
                playBtn.classList.remove('pause');
            }
        }
        //点击监听
        video.addEventListener('click', vidplaySate, false);
        playBtn.addEventListener('click', vidplaySate, false);
        //结束监听
        video.addEventListener('ended',()=> {
            playBtn.classList.remove('pause');
        });
    };
    //视频:
    let videos = document.querySelectorAll('video');
    videos.forEach((video) => {
        setMedia(video);
    });

方便的话,加个关注哦,博主会不定时更新写的前端案例哟…
在这里插入图片描述

有什么错误或优化的地方,可以提出来,大家一起学习研究…

其他案例:
[js复制图文分享到微信/QQ]
[js仿淘宝收货地址列表,设置默认地址]
[js实现多个日期时间倒计时效果]

想学习vue可移步到:vue相关的技术

想学习小程序可移步到:小程序相关的技术

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

HTML5的多个video标签:截取视频源的封面图poster,监听视频播放状态的功能; 的相关文章

随机推荐

  • JAVA自学之路

    JAVA自学之路 一 学会选择 为了就业 不少同学参加各种各样的培训 决心做软件的 大多数人选的是java 或是 net 也有一些选择了手机 嵌入式 游戏 3G 测试等 那么究竟应该选择什么方向呢 我的意见是 不要太过相信各种培训机构或是抢
  • ctfshow web7

    文章目录 题目分析 解题过程 题目分析 打开题目后 有三个文章 随便点一个之后发现网址上有个后缀 id 2 应该是get传参的注入了 在后缀上加 id 1 1 显示全部文章 可能是整形注入 还是盲注 他这个过滤了空格 用 代替 详见web6
  • MySQL 8.0数据库在Win10的位置

    MySQL 8 0的配置文件位置在下面的ini文件中 C ProgramData MySQL MySQL Server 8 0 my ini C ProgramData 一般是隐藏的 修改文件夹选项可见 或者直接输入位置就能打开文件加了 m
  • wifidog浏览器弹窗认证 — 基于OpenWRT路由器

    一 移植 wifidog功能 1 功能介绍 wifidog是一种能够实现让路由器局域网设备 包括wifi连接和网线连接设备 在上网前先进行 portal认证的工具 主要应用于手机端上网认证 手机在连接wifi后会自动打开浏览器并跳转出 lo
  • C++顺序链表

    include
  • Android AutoCompleteTextView实现自动补全

    辛苦堆砌 转载请注明出处 谢谢 最近工作用到了自动补全 这里做一个简单记录 首先上我们的布局
  • 类函数重载

    函数重载必然发生在同一个作用域 重载函数 本事为不同函数 函数名和参数列表决定函数 函数必须发生在同一个作用域中 include
  • IDEA 编写JDBC 第一个示例

    知心惟有雕梁燕 自来相伴 东风不管琵琶怨 落花吹遍 一 新建一个Module 二 在此Module下新建一个包 在包再建一个包 命名为lib 三 导入mysql驱动 四 将mysql驱动添加到项目的库里 五 代码实现 package Con
  • 协同过滤算法代码

    此算法主要用来推荐的 找出ui uj两个用户同时打过分的课程集合 function getPSet uid ujd select 课程编号 from 评分 where 用户编号 ui and 课程编号 in select 课程编号 from
  • linux使用date命令获取系统时间

    转载自Linux系统date命令的参数及获取时间戳的方法 date指令相关用法示例 date 用法 date OPTION FORMAT date u utc universal MMDDhhmm CC YY ss 直接输入date dat
  • 微信小程序开发之——用户登录-登录流程(1)

    一 概述 新建微信小程序自带用户登录简化 小程序登录流程时序 二 新建微信小程序自带用户登录简化 新建的微信小程序默认有用户登录功能 将多余功能去除后 简化如下 2 1 index wxml
  • 文心一言续写太监小说《名侦探世界的巫师》

    名侦探世界的巫师 是我的童年回忆 总是想着续写一下 但是又没有时间和文笔 文心一言出了 由于目前大模型貌似可以联网 可以尝试搞一波 目录 文章1 前六个故事还能看 后面就是在重复 故事2 辣眼睛 毁童年 非请勿看 故事3 流水账 故事4 其
  • JDK介绍

    JDK JRE和JVM之间的关系 JVM是运行环境 JRE是含运行环境和相关的类库 跟node环境是一个意思 JDK目录介绍 目录名称 说明 bin 该路径下存放了JDK的各种工具命令 javac和java就放在这个目录 conf 该路径下
  • C++学习笔记(十六):对vector进行更多的操作——泛型算法

    先强调一下 这里的泛型算法实际不光光是对vector的操作 对于 顺序容器 均可以 但是什么是顺序容器 我们都知道 容器就是一些特定类型对象的集合 而顺序容器为程序员提供了控制元素存储和访问的能力 这种容器的一个显著的特征 就是容器中元素的
  • ES6.x版本单机三节点配置discovery.zen.ping.unicast.hosts 错误

    问题 在同一个机子利用不同端口搭建3个ES节点 单节点正常运行 集群间无法联通 找不到主节点 表现 cluster uuid 一直没有注册成功 curl 0 0 0 0 29200 name es 01 cluster name es te
  • 浏览器地址栏输入url以后发生了什么

    在浏览器输入url后会发生的过程 1 DNS对域名进行解析 2 建立TCP连接 三次握手 3 发送HTTP请求 4 服务器处理请求 5 返回响应结果 6 关闭TCP连接 四次挥手 7 浏览器解析HTML 8 浏览器布局渲染 1 浏览器对输入
  • 华为OD机试 - 需要打开多少监控器(Java & JS & Python)

    题目描述 某长方形停车场 每个车位上方都有对应监控器 当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时 监控器才需要打开 给出某一时刻停车场的停车分布 请统计最少需要打开多少个监控器 输入描述 第一行输入m n表示长宽 满足1
  • 按照 C++ 11 标准,数组,指针,传递问题!

    一 一维数组 静态 int array 100 定义了数组array 并未对数组进行初始化 静态 int array 100 1 2 定义并初始化了数组array 动态 int array new int 100 delete array
  • Java 日历的制作 心得 写给自己

    之前已经跟着老师做过一次这个日历 但是时间一久便又拿出来自己再复习一遍 果然不出所料 已经做不出来了 而且因为在学习的时候使用的是Myeclipse 其中话中操作是由软件自己操作的 每写出一句代码软件也会自动提示哪里有问题 半傻瓜式的操作果
  • HTML5的多个video标签:截取视频源的封面图poster,监听视频播放状态的功能;

    在日常项目中 html5的video标签还是比较常用到的 开发过程中 我们都会使用到 通过监听video标签的播放 暂停 停止等等来使用 我们是否也会遇到过 有些浏览器在显示这标签 兼容不太友好 video标签的封面是一层黑色的 ok 那么