前端小知识(四):video视频获取第一帧作为展示

video视频获取第一帧作为展示

移动端h5中使用video标签展示第一帧内容为空白,所以手动添加第一帧图片用来展示

handleVideoPosterFun 生成视频的第一帧,并添加到video标签上

function handleVideoPosterFun(videos) {
  // 创建一个 Promise 数组来跟踪每个视频的处理状态
  const promises = Array.from(videos).map((video, index) => {
    return new Promise((resolve, reject) => {
      // 创建一个新的video元素
      const tempVideo = document.createElement('video');
      tempVideo.src = video.querySelector('source').src;
      tempVideo.crossOrigin = 'anonymous'; // 处理跨域问题

      // 等待视频元数据加载完成
      tempVideo.addEventListener('loadeddata', function () {
        // 确保视频能够播放
        tempVideo.currentTime = 0.1; // 确保当前时间稍微超出0秒
        tempVideo.addEventListener('seeked', function () {
          // 创建一个canvas元素
          const canvas = document.createElement('canvas');
          canvas.width = tempVideo.videoWidth;
          canvas.height = tempVideo.videoHeight;

          // 将视频的第一帧绘制到canvas上
          const ctx = canvas.getContext('2d');
          ctx.drawImage(tempVideo, 0, 0, canvas.width, canvas.height);

          // 将canvas内容转换为数据URL,并设置为poster属性
          const dataURL = canvas.toDataURL('image/png');
          video.setAttribute('poster', dataURL);

          resolve(); // 处理完成,解析Promise
        });

        // 触发seek事件
        tempVideo.currentTime = 0.1;
      });

      tempVideo.addEventListener('error', reject);
      tempVideo.load();
    });
  });

  // 返回一个Promise,等待所有视频处理完成
  return Promise.all(promises);
}

此处例子是把富文本中的video添加上poster,然后在移动端中展示
此处返回的内容是一个promise 对象

async function setVideoPosterFromFirstFrame(htmlString) {
  // 创建一个临时的DOM元素
  const parser = new DOMParser();
  const doc = parser.parseFromString(htmlString, 'text/html');

  // 获取所有的video标签
  const videos = doc.querySelectorAll('video');

  // 检查是否有video标签
  if (videos.length === 0) {
    console.log('No video tags found');
    return htmlString; // 如果没有video标签,返回原始字符串
  }
  try {
    await handleVideoPosterFun(videos); // 等待所有视频处理完成
  } catch (error) {
    console.error('Error processing video posters:', error);
  }

  // 返回处理后的HTML字符串
  return doc.body.innerHTML;
}

获取值

let a = await setVideoPosterFromFirstFrame(res.content)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值