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);
  });
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在浏览器使用`<input type="file">`标签上传视频文件后,可以通过`URL.createObjectURL()`方法将文件转换成URL,然后将该URL赋值给`<video>`标签的`src`属性。然后在`loadedmetadata`事件获取视频的宽高和时长等信息,并在`loadeddata`事件绘制视频的第一帧画面。最后将canvas元素转换成图片,作为视频封面。 示例代码如下: ```html <input type="file" id="fileInput"> <video id="video" controls></video> <canvas id="canvas"></canvas> ``` ```javascript const fileInput = document.getElementById('fileInput'); const video = document.getElementById('video'); const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); // 监听input的change事件 fileInput.addEventListener('change', function() { const file = fileInput.files[0]; const url = URL.createObjectURL(file); // 将上传的视频文件赋值给video的src属性 video.src = url; }); // 监听视频加载完元数据事件 video.addEventListener('loadedmetadata', function() { // 获取视频的宽高和时长 const width = video.videoWidth; const height = video.videoHeight; const duration = video.duration; // 设置canvas的宽高为视频的宽高 canvas.width = width; canvas.height = height; // 在canvas上绘制视频的第一帧画面 video.currentTime = 0; // 将视频播放时间调整到0 video.pause(); // 暂停视频播放 video.addEventListener('loadeddata', function() { ctx.drawImage(video, 0, 0, width, height); // 将canvas转换成图片,作为视频封面 const cover = canvas.toDataURL(); console.log('视频宽度:', width); console.log('视频高度:', height); console.log('视频时长:', duration); console.log('视频封面:', cover); }); }); ``` 注意,`<input type="file">`标签上传的视频文件是异步加载的,因此需要在`change`事件获取文件对象,并将其转换成URL。在`loadedmetadata`事件获取视频的宽高和时长等信息,并在`loadeddata`事件绘制视频的第一帧画面。此外,为了获取视频的第一帧画面,需要将视频播放时间调整到0,并暂停视频播放。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值