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

诗林  高级会员 | 2024-8-13 10:27:46 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 226|帖子 226|积分 678

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

   移动端h5中利用video标签展示第一帧内容为空缺,所以手动添加第一帧图片用来展示
  handleVideoPosterFun 生成视频的第一帧,并添加到video标签上
  1. function handleVideoPosterFun(videos) {
  2.   // 创建一个 Promise 数组来跟踪每个视频的处理状态
  3.   const promises = Array.from(videos).map((video, index) => {
  4.     return new Promise((resolve, reject) => {
  5.       // 创建一个新的video元素
  6.       const tempVideo = document.createElement('video');
  7.       tempVideo.src = video.querySelector('source').src;
  8.       tempVideo.crossOrigin = 'anonymous'; // 处理跨域问题
  9.       // 等待视频元数据加载完成
  10.       tempVideo.addEventListener('loadeddata', function () {
  11.         // 确保视频能够播放
  12.         tempVideo.currentTime = 0.1; // 确保当前时间稍微超出0秒
  13.         tempVideo.addEventListener('seeked', function () {
  14.           // 创建一个canvas元素
  15.           const canvas = document.createElement('canvas');
  16.           canvas.width = tempVideo.videoWidth;
  17.           canvas.height = tempVideo.videoHeight;
  18.           // 将视频的第一帧绘制到canvas上
  19.           const ctx = canvas.getContext('2d');
  20.           ctx.drawImage(tempVideo, 0, 0, canvas.width, canvas.height);
  21.           // 将canvas内容转换为数据URL,并设置为poster属性
  22.           const dataURL = canvas.toDataURL('image/png');
  23.           video.setAttribute('poster', dataURL);
  24.           resolve(); // 处理完成,解析Promise
  25.         });
  26.         // 触发seek事件
  27.         tempVideo.currentTime = 0.1;
  28.       });
  29.       tempVideo.addEventListener('error', reject);
  30.       tempVideo.load();
  31.     });
  32.   });
  33.   // 返回一个Promise,等待所有视频处理完成
  34.   return Promise.all(promises);
  35. }
复制代码
此处例子是把富文本中的video添加上poster,然后在移动端中展示
此处返回的内容是一个promise 对象
  1. async function setVideoPosterFromFirstFrame(htmlString) {
  2.   // 创建一个临时的DOM元素
  3.   const parser = new DOMParser();
  4.   const doc = parser.parseFromString(htmlString, 'text/html');
  5.   // 获取所有的video标签
  6.   const videos = doc.querySelectorAll('video');
  7.   // 检查是否有video标签
  8.   if (videos.length === 0) {
  9.     console.log('No video tags found');
  10.     return htmlString; // 如果没有video标签,返回原始字符串
  11.   }
  12.   try {
  13.     await handleVideoPosterFun(videos); // 等待所有视频处理完成
  14.   } catch (error) {
  15.     console.error('Error processing video posters:', error);
  16.   }
  17.   // 返回处理后的HTML字符串
  18.   return doc.body.innerHTML;
  19. }
复制代码
获取值
  1. let a = await setVideoPosterFromFirstFrame(res.content)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

诗林

高级会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表