前端小知识(四):video视频获取第一帧作为展示
创始人
2024-11-10 20:35:24

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) 

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...