flv视频格式批量截取封面图(不占内存版)--其他视频格式也通用

flv视频格式批量截取封面图(不占内存版)--其他视频格式也通用

  • 需求(实现的效果)
  • 功能实现
    • html
    • css
    • js

需求(实现的效果)

批量显示视频,后端若返回有imgUrl,则直接显示图1,
若无,则需要根据视频地址自己截取,截取中显示图2,
截取过程中如图3,截取完直接返回图片信息,如图1格式,未返回的仍显示加载动画,如图2

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

功能实现

需要使用插件播放、截取flv格式视频。当前使用的是mpegts.js
具体使用可移步 vue使用mpegts.js教程

html

<div
              :key="ind"
              v-for="(ite, ind) in objects"
              class="description-content"
            >
              <div
                v-if="ite.fileUrl"
                class="imgurlExit"
              >
               <!-- 显示图片封面背景 -->
                <img
                  v-if="ite.imgUrl"
                  :src="ite.imgUrl"
                  class="descriptionImg"
                />
               <!-- 无图片、纯黑背景 -->
                <div
                  class="descriptionImg"
                  v-else
                ></div>
                <!-- 播放图标 -->
                <a-icon
                  type="play-circle"
                  class="centerIcon"
                  v-if="ite.imgUrl"
                />
                <!-- 加载动画 -->
                <img
                  src="@/assets/images/initImg.gif"
                  class="centerIcon"
                  v-else
                />
              </div>
              <div
                class="descriptionImg"
                v-else
              >
                未抓取到视频
              </div>
            </div>

css

   .description-content {
      width: 220px;
      margin: 0 20px;
      margin-top: 20px;
      .imgurlExit {
        position: relative;
        height: 180px;
        .centerIcon {
          position: absolute;
          left: 50%;
          top: 50%;
          transform: translate(-50%, -50%);
          color: #fff;
          font-size: 40px;
        }
      }
      .descriptionImg {
        width: 220px;
        height: 180px;
        background: #000;
        color: #fff;
        font-weight: 800;
        text-align: center;
        line-height: 180px;
        border-radius: 10px;
      }
    }

js

mpegts.js具体使用可移步 vue使用mpegts.js教程

import mpegts from "mpegts.js";

  // 获取数据时进行判断 item.fileUrl存在且item.imgUrl不存在时。生成图片信息并返回更新数据
 async getData() {
      const res = await getList({});
      if (res.success) {
        this.objects = res.data; //objects 为data中定义的数据
        this.$nextTick(() => {
          this.objects.map((item) => {
            if (item.fileUrl && !item.imgUrl) {
              this.getImage(item.fileUrl).then((res) => {
                item.imgUrl = res;
              });
            }
          });
        });
      }
    },
    // 获取视频的图片
    getImage(url) {
      return new Promise((resolve, reject) => {
        const extension = url.split("."); //获取类型
        const videoElement = document.createElement("video");
        videoElement.muted = true; // 静音
        videoElement.autoplay = true; // 自动播放
        if (mpegts.isSupported()) {
           // mpegts 具体用法可移步首页教程
          const flvPlayer = mpegts.createPlayer(
            {
              type: extension[extension.length - 1],
              url,
              isLive: true,
              isAutoPlay: true,
              isContinue: true,
              lazyLoad: true,
              hasAudio: false,
            },
            {
              enableWorker: true,
              enableStashBuffer: false,
              stashInitialSize: 128,
            }
          );
          flvPlayer.attachMediaElement(videoElement);
          flvPlayer.load(); //加载
          setTimeout(() => {
            flvPlayer
              .play()
              .then(() => {
                this.destory(flvPlayer);
              })
              .catch((err) => {
                this.destory(flvPlayer);
                console.log("err", err);
              });
          });
        }
        // 监听视频数据加载事件
        videoElement.addEventListener("loadeddata", function () {
          // 播放及暂停
          const canvasElement = document.createElement("canvas");
          const ctx = canvasElement.getContext("2d");
          canvasElement.width = 220;
          canvasElement.height = 180;
          // 绘制当前帧到 canvas
          if (ctx) {
            ctx.drawImage(videoElement, 0, 0, canvasElement.width, canvasElement.height);
          }
          const imageDataUrl = canvasElement.toDataURL();
          resolve(imageDataUrl);
          videoElement.pause();
          // 移除video元素 注 document.createElemet创建的元素需要挂载到具体的dom才可以进行删除
          document.body.appendChild(videoElement);
          document.body.appendChild(canvasElement);
          document.body.removeChild(videoElement);
          document.body.removeChild(canvasElement);
        });
      });
    }, 
        // 销毁 mpegts 对象
    destory(player) {
      if (player) {
        try {
          player.pause();
          player.unload();
          player.detachMediaElement();
          player.destroy();
          player = null;
        } catch (e) {
          // console.log(e);
        }
      }
    },

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/366993.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用VSCode上运行Jupyter,详细案例过程出可视化图

Python作为最受AI喜欢的语言之一&#xff0c;我们与大家共同学习下如何在VS Code上运行Jupyter&#xff0c;并且用简单案例实现出图。 环境 VS Code version: 1.80.1 Python: 3.12.0 小白安装过程&#xff1a; 在准备好基础环境&#xff0c;小白心想&#xff0c;AI可是霸占科…

爬虫(二)使用urllib爬取百度贴吧的数据

下一期我就不用urllib来抓取数据了&#xff0c;因为urllib现在已经很少人用&#xff0c;大部分人用得是requests&#xff0c;requests也是基于底层urllib的一个模块。 首先我先来讲一下关于如何使用动态的UA&#xff01; 动态UA就是指在自己创建的一个列表里随机选择一个UA当做…

07 SB3之@HttpExchange(TBD)

HttpExchange是SpringBoot3的新特性. Spring Boot3 提供了新的 HTTP 的访问能力&#xff0c;封装了Http底层细节. 通过接口简化 HTTP远程访问&#xff0c;类似 Feign 功能。 SpringBoot 中定义接口提供 HTTP 服务 --> 框架生成的代理对象实现此接口 --> 框架生成的代理…

RabbitMQ下载与安装

一、Docker安装 1.单机部署 我们在Centos7虚拟机中使用Docker来安装。 1.1.下载镜像 方式一&#xff1a;在线拉取 docker pull rabbitmq:3-management方式二&#xff1a;从本地加载 上传到虚拟机中后&#xff0c;使用命令加载镜像即可&#xff1a; docker load -i mq.ta…

全面认识DOS系统

目录 一、DOS系统的功能 1.执行命令和程序&#xff08;处理器管理&#xff09; 2.内存管理 3.设备管理 4.文件管理 5.作业管理 二、文件与目录 三、文件类型与属性 1.系统属性&#xff08;S&#xff09; 2.隐含属性&#xff08;H&#xff09; 3.只读属性&#xff08…

Window命令行 如何查看以及关闭进程

目录 前言1. 基本知识2. Demo 前言 用习惯了Linux操作系统&#xff0c;突然想用Window&#xff0c;发现很陌生&#xff01; 补充一波Linux的基本命令&#xff1a; 查看进程和端口信息&#xff1a; 通过 netstat -tanp 命令查看系统上的所有网络连接&#xff0c;然后通过 grep…

Docker 集群配置

1、配置 MySQL MySQL 简单安装 docker安装完MySQL并run出容器后&#xff0c;建议请先修改完字符集编码后再新建mysql库-表-插数据 docker run -d -p 2222:3306 --privilegedtrue -e MYSQL_ROOT_PASSWORD123456 \ -v /opt/mysql/log:/var/log/mysql \ -v /opt/mysql/data:/va…

day36 无重叠区间 划分字母区间 合并区间

题目1&#xff1a;435 无重叠区间 题目链接&#xff1a;435 无重叠区间 题意 intervals[i][starti&#xff0c;endi] 移除区间&#xff0c;使得区间互不重叠&#xff0c;返回移除区间的最小数量 相邻区间挨在一起&#xff0c;尽量移除重叠区间 代码 class Solution { publ…

【C语言】异常处理 | assert函数 | errno错误码

文章目录 C语言传统的处理错误的方式1. 终止程序&#xff08;例如使用 assert&#xff09;2. 返回/设置错误码手动实现C语言库函数内置的错误码Linux系统调用内置的错误码 C语言传统的处理错误的方式 C语言传统的处理错误的方式主要包括assert终止程序和返回或设置错误码两种方…

面试经典150题 -- 区间(总结)

总的链接 : 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台最经典 150 题&#xff0c;掌握面试所有知识点https://leetcode.cn/studyplan/top-interview-150/ 228 汇总区间 直接用双指针模拟即可 ; class Solution { public…

数据结构——实验01-线性表的链式存储和操作

一、实验内容 二、算法思想与算法实现 1、解题思想 &#xff08;1&#xff09;逆序创建链表La就是使用头插法创建一个链表&#xff0c;所谓头插法就是在创建链表时始终将新元素插入到头结点之后&#xff0c;而正序创建链表Lb就是使用尾插法创建一个链表&#xff0c;所谓尾插法…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--强化学习、模仿学习

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 为了答谢各位网友的支持&#xff0c;从今日起…

Latex学习记录

目录 1.Latex各种箭头符号总结 2.[Latex]公式编辑&#xff0c;编号、对齐 3.Latex公式编号: 多行公式多编号&#xff0c;多行公式单编号 4.LaTex中输入空格以及换行 1.Latex各种箭头符号总结 箭头符号 - ➚ (piliapp.com)https://cn.piliapp.com/symbol/arrow/Latex各种箭头…

【LeetCode: 462. 最小操作次数使数组元素相等 II + 贪心】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

根据路由动态注册组件失败

动态注册组件 方式1 import 这种跟webpack的版本有关系 import低版本不支持传入动态参数 <template><components :is"componentName" v-show"isShow" :key"componentName"></components> </template>const _import fi…

网络基础【Linux网络编程】

目录 一、网络发展 二、协议和协议分层 OSI七层网络模型 TCP/IP协议栈 三、网络和OS的关系 四、网络传输基本流程 五、数据包封装和分用 六、IP地址和MAC地址 MAC地址 局域网通信原理 IP地址 一、网络发展 详细参考此篇博文&#xff1a;网络发展史 独立模式 计算机…

第三百零三回

文章目录 1. 概念介绍2. 实现方法2.1 文字信息2.2 红色边框 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何实现密码输入框"相关的内容&#xff0c;本章回中将介绍如何在在输入框中提示错误.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们…

Qt加载网页崩溃 ASSERT:“m_adapterClient“ in file ...

1、软件启动后加载网页无异常&#xff0c;点击按钮&#xff0c;加载新网页时崩溃 崩溃代码&#xff1a; QWebEngineView *createWindow(QWebEnginePage::WebWindowType type) { Q_UNUSED(type); return this; } 2、原因 Qt只是调用谷歌的浏览器引擎&#xff…

构建用于预警大型语言模型辅助生物威胁创建的系统

深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领域的领跑者。点击订阅&#xff0c;与未来同行&#xff01; 订阅&#xff1a;https://rengongzhineng.io/ 。 Op…

vivado jesd204核综合错误

用204核的时候老是报如下错误。 [Opt 31-67] Problem: A LUT2 cell in the design is missing a connection on input pin I0, which is used by the LUT equation. This pin has either been left unconnected in the design or the connection was removed due to the trimm…