当前位置: 首页 > article >正文

JS获取页面中video标签视频的封面和时长

从HTML中提取Video信息

/**
 *  从html字符串中提取video标签
 *  入参: {String} htmlString
 *  出参:{Array} 数组
 */
function extractVideosFromHTML(htmlString) {
  const dom = new DOMParser().parseFromString(htmlString, 'text/html');

  const videos = Array.from(dom.querySelectorAll('video'));
  
  return videos.map(videoElement => videoElement.getAttribute('src'));
}

获取视频的第一帧作为视频封面

/**
 * 获取视频的第一帧
 * 入参:视频文件的url地址
 * 返回第一帧图片 
 */
function getFirstVideoFrame(videoUrl) {
  return new Promise((resolve, reject) => {
    const videoElement = document.createElement('video');
    videoElement.crossOrigin = 'anonymous';
    videoElement.muted = true; // 可选,静音视频防止音频自动播放问题
    videoElement.style.display = 'none'; // 隐藏视频元素
    document.body.appendChild(videoElement); // 添加到DOM中以便加载

    videoElement.addEventListener('loadedmetadata', () => {
      // 设置canvas大小与视频一致
      const canvas = document.createElement('canvas');
      canvas.width = videoElement.videoWidth;
      canvas.height = videoElement.videoHeight;
      const ctx = canvas.getContext('2d');

      videoElement.addEventListener('seeked', async () => {
        // 移动到视频开始位置并绘制第一帧
        ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
        // 转换canvas内容为Data URL
        const imageData = canvas.toDataURL('image/jpeg'); // 或'image/png'
        // 清理DOM
        document.body.removeChild(videoElement);
        resolve(imageData)
        });
      }, { once: true });

      // 快速跳转至视频开始处
      videoElement.currentTime = 0;
    });

    videoElement.onerror = (error) => {
      reject(error); // 如果加载视频出错,返回Promise的reject值
    };

    videoElement.src = videoUrl;
  });
}

获取视频的播放时长

/**
 *  获取视频的时长
 *  入参:视频文件,file对象
 *  返回: 视频时长,单位为 秒
 */
function getVideoDuration(file) {
  return new Promise((resolve, reject) => {        
    const fileReader = new FileReader();
    fileReader.onload = (event) => {
      const blob = new Blob([event.target.result], {type: file.type});
      const video = document.createElement('video');
      video.src = URL.createObjectURL(blob);
      video.onloadedmetadata = () => {
        resolve(video.duration);
        URL.revokeObjectURL(video.src);
        video.remove();
      };
      video.onerror = (err) => {
 		URL.revokeObjectURL(video.src);
 		video.remove()
 		reject(err)
      }
    };
    fileReader.readAsArrayBuffer(file);
  });
}

http://www.kler.cn/a/303887.html

相关文章:

  • 分享 pdf 转 word 的免费平台
  • 传奇996_19——常用函数
  • 随时随地编码:香橙派Zero3上安装Code Server远程开发指南
  • 基于碎纸片的拼接复原算法及MATLAB实现
  • C++中的栈(Stack)和堆(Heap)
  • Flutter Getx状态管理
  • 代理IP池纯净度对数据抓取有影响吗?
  • ​2024年最新python教程全套,现在分享给大家(python全栈)
  • 2024年最新软件测试面试题【附文档答案】
  • websim.ai 体验过程+感受
  • 《创新电力巡检,机器人铸就安全高效未来》
  • Windows编译MongoDB的C++库,并使用Qt调用
  • centos8构建nginx1.27.1+BoringSSL+http3+lua+openresty
  • 如何在 Vue 3 中使用 Element Plus
  • 3.3k star开源的Notepad++文本编辑器替代品,跨平台
  • 从底层原理上解释 clickhouse 保证完全的幂等性
  • 皮皮鲁周边商品网络销售系统的设计与实现---附源码74752
  • Android前台服务如何在后台启动activity?
  • Leetcode 每日一题:Word Ladder
  • Autosar模式管理实战系列-COMM模块状态机及重要函数讲解
  • neo4j docker 运行4.35 community 版本失败
  • 氢能源多旋翼无人机技术详解
  • vue3.0 使用echarts与echarts-gl 实现3D饼图
  • Spring Boot中实现跨域请求
  • 网约车APP开发指南:基于同城代驾系统源码的实现路径
  • STM32G474RE之RTC