【webview Android】视频获取首帧为封面

news/2025/2/19 15:39:27/

文章目录

    • 需求分析
    • 获得首帧
    • 其他方法

需求分析

客户端中h5上传视频,视频封面默认首帧。

遇到问题:原生的video现象如下

  • IOS会在加载好后显示首帧(没加载好显示黑屏,符合预期)
  • Android加载好后默认封面为一个奇怪的占位图(不符合预期)

在这里插入图片描述
需求:显示首帧。

获得首帧

前端截取视频指定帧为封面的3种方法 - 知乎

已知视频url,获得首帧图:

  /*** 获取视频的封面图信息* @param url 视频地址* @param second 秒数*/async function getVideoBase64(url: string, second: number = 0) {const video = document.createElement('video');video.setAttribute('crossOrigin', 'anonymous'); // 处理跨域video.setAttribute('src', url);video.preload = 'metadata'; // 确保浏览器会预加载视频元数据video.muted = true;// 等待视频元数据加载完成await new Promise((resolve, reject) => {video.onloadedmetadata = resolve;video.onerror = reject;});if (second > 0) {video.currentTime = second;// 确保seeked事件触发后再进行截图await new Promise((resolve) => {video.onseeked = resolve;});}const canvas = document.createElement('canvas');const context = canvas.getContext('2d');if (!context) throw new Error('Failed to get canvas context');canvas.width = video.videoWidth;canvas.height = video.videoHeight;context.drawImage(video, 0, 0, canvas.width, canvas.height);const base64 = canvas.toDataURL('image/jpeg');return base64;}

经过尝试,currentTime 为0时获得的图为黑屏,这里设置为0.2

拿到首帧图:

在这里插入图片描述
然后就是常规逻辑:

把图存起来,盖在video上,记录video是否被点击。
点击过的视频不会显示首帧封面了,因此点击过就隐藏图片等。

在拿到首帧图前,可以让上传控件状态与上传时一致(即一直loading)。
让用户以为还在上传视频,实际上在解析封面。

其他方法

如果是阿里云OSS云服务器,可以视频地址后加:

?x-oss-process=video/snapshot,t_1000,m_fast

上传到阿里云oss的视频如何获取第一帧作为视频封面_阿里云oss获取第一帧-CSDN博客

还有一些其他复杂方法,经实践,没有上述方法获取首帧封面快:

【前端】上传视频,截取第一帧图片_前端获取视频第一帧图片-CSDN博客


http://www.ppmy.cn/news/1572424.html

相关文章

IPv4 协议和TCP 协议的区别

📡 IPv4 协议 vs TCP 协议:核心区别 维度IPv4 协议TCP 协议OSI 层级网络层(Layer 3)传输层(Layer 4)主要作用负责数据包的寻址和路由(确定数据去哪里)负责可靠的数据传输和连接管理…

SpringAI集成DeepSeek实战

SpringAI集成DeepSeek实战教程 引言 Spring AI作为Spring生态系统中的新成员,为开发者提供了便捷的AI集成方案。本文将详细介绍如何在Spring项目中集成DeepSeek模型,实现智能对话等功能。 环境准备 在开始之前,请确保您的开发环境满足以下要…

5. Docker 本地镜像发布到阿里云

5. Docker 本地镜像发布到阿里云 文章目录 5. Docker 本地镜像发布到阿里云1. 本地镜像发布到阿里云流程最后: 1. 本地镜像发布到阿里云流程 镜像的生成方法: 基于当前容器创建一个新的镜像,新功能增强 docker commit [OPTIONS] 容器ID [REP…

使用docker compose启动postgres并设置时区

设置PostGres时区 方法 1: 使用 POSTGRES_INITDB_ARGS 设置时区方法 2: 使用初始化脚本设置时区创建 init-user-db.sql更新 docker-compose.yml 启动服务 要在启动 PostgreSQL 数据库时设置时区,可以通过在 docker-compose.yml 文件中添加环境变量或通过配置文件来实…

独立站赋能反向海淘:跨境代购系统的用户体验与支付解决方案

随着全球化的推进以及消费者对海外商品多样化需求的增长,独立站赋能的反向海淘模式愈发火热,其中跨境代购系统的用户体验与支付解决方案起着关键作用。 一、跨境代购系统的用户体验 界面友好性 独立站的页面设计需要简洁、直观,方便用户快速…

【Maven】多module项目优雅的实现pom依赖管理

【Maven】多module项目优雅的实现pom依赖管理 【一】方案设计原则【二】项目结构示例【三】实现思路【1】可能的问题点:【2】解决方案的思路:【3】需要注意的地方:【4】可能的错误: 【四】实现案例【1】父POM设计(pare…

格式工厂 FormatFactory v5.18.便携版 ——多功能媒体文件转换工具

格式工厂 FormatFactory v5.18.便携版 ——多功能媒体文件转换工具 功能:视频 音频 图片 文档PDF格式 各种转换,同格式调整压缩比例,调整大小 特色:果风图标 好看; 支持多任务队列,完成自动关机 下载地址&#xff1…

渗透测试--文件包含漏洞

文件包含漏洞 前言 《Web安全实战》系列集合了WEB类常见的各种漏洞,笔者根据自己在Web安全领域中学习和工作的经验,对漏洞原理和漏洞利用面进行了总结分析,致力于漏洞准确性、丰富性,希望对WEB安全工作者、WEB安全学习者能有所帮助…