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

embedded/2024/9/25 11:49:24/

从HTML中提取Video信息

javascript">/***  从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'));
}

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

javascript">/*** 获取视频的第一帧* 入参:视频文件的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 URLconst imageData = canvas.toDataURL('image/jpeg'); // 或'image/png'// 清理DOMdocument.body.removeChild(videoElement);resolve(imageData)});}, { once: true });// 快速跳转至视频开始处videoElement.currentTime = 0;});videoElement.onerror = (error) => {reject(error); // 如果加载视频出错,返回Promise的reject值};videoElement.src = videoUrl;});
}

获取视频的播放时长

javascript">/***  获取视频的时长*  入参:视频文件,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.ppmy.cn/embedded/111522.html

相关文章

微信小程序 本地文件获取原始名称问题

微信版本:8.0.50 结论:图片,视频类文件,获取不到真实名称,文本类文件,压缩包,安装包,可以从chooseMessageFile中获取 具体细节理解:微信文件处理与命名机制分析&#xff…

【Unity】Unity Shader样例:顶点根据时间放大缩小

文章目录 案例说明效果展示适用模型范围代码示例 案例说明 本案例提供一个单独的Shader,使得模型顶点(仅渲染)根据时间放大缩小,往复循环。 效果展示 适用模型范围 全部 代码示例 Shader "Unlit/Sha_TestScale" {P…

基于UDP的简易网络通信程序

目录 0.前言 1.前置知识 网络通信的大致流程 IP地址 端口号(port) 客户端如何得知服务器端的IP地址和端口号? 服务器端如何得知客户端的IP地址和端口号? 2.实现代码 代码模块的设计 服务器端代码 成员说明 成员实现 U…

使用Spring Boot集成Nacos进行配置管理

引言 随着微服务架构的普及,服务之间的解耦以及服务治理成为了软件开发中的重要组成部分。一个强大的服务治理平台不仅能够帮助我们更好地管理各个服务实例,还能有效地处理服务间的依赖关系,提升系统的可维护性和扩展性。Nacos(原…

【机器学习】迁移学习概论

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 迁移学习概论什么是迁移学习?为什么需要迁移学习?迁移学习的应用场景和优势迁…

软件项目上线发布流程是怎么样的?

(1)项目流程发布,一般是在我们完成测试之后,我们这边会出一个测试报告,然后报告确定我们是否通过; (2)如果通过的话,运维那边就可以开始去打包然后发布项目了&#xff0c…

STL02——手写简单版本的list

手写一个简单版本的list 设计一个名为 List 的 List 类,该类具有以下功能和特性: 1、基础成员函数 构造函数:初始化 List 实例析构函数:清理资源,确保无内存泄露 2、核心功能 在 List 末尾添加元素在 List 开头添…

如何在C++中使用mupdf操作pdf文件(一)

部署 mupdf是一个pdf库,不仅可以显示pdf文件,还可以创建、分割、合并、更改pdf文件。而且,除了pdf以外,它还支持mobi、epub、fb2等其它文件。 所以,如果我们有操作pdf等电子书的开发需求,使用mupdf是一个…