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

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

需求(实现的效果)

批量显示视频,后端若返回有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);
        }
      }
    },

最近更新

  1. TCP协议是安全的吗?

    2024-02-03 14:36:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-03 14:36:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-03 14:36:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-03 14:36:03       20 阅读

热门阅读

  1. [NOIP2013 提高组] 货车运输

    2024-02-03 14:36:03       32 阅读
  2. 函数大聚会(c++题解)

    2024-02-03 14:36:03       29 阅读
  3. Nest 测试 について 常用的函数的含义

    2024-02-03 14:36:03       31 阅读
  4. uniapp父子组件通信

    2024-02-03 14:36:03       31 阅读
  5. Linux 系统 ubuntu22.04 发行版本 固定 USB 设备端口号

    2024-02-03 14:36:03       34 阅读
  6. RNN的具体实现

    2024-02-03 14:36:03       34 阅读
  7. 关于sql关键字及敏感数据脱敏

    2024-02-03 14:36:03       33 阅读
  8. 蓝桥杯客观题练习笔记

    2024-02-03 14:36:03       35 阅读
  9. C++设计模式之工厂模式

    2024-02-03 14:36:03       29 阅读