前端H5实现视频上传,并截取第一帧作为封面。解决微信内ios系统无法上传视频的问题,解决ios截取视频作为封面的问题。

前端H5实现视频上传,并截取封面

前端实现视频上传,并截取第一帧作为封面。

写的过程中出现的问题:

  1. 在微信内ios系统无法上传视频,无法触发addEventListenerloadedmetadata
  2. 解决完1问题后,ios截取视频第一帧作为封面有问题,获取的宽度高度为0。

解决完上述两个问题后,最后完整版代码:
getCoverAndUploadVideo入参是视频资源videoFile,通过oss上传或者后台上传接口。
最终抛出的是视频的url封面的url

关于前端实现oss上传可以访问这个文章👉:vue3使用阿里oss上传资源文件

function getCoverAndUploadVideo (videoFile) {if (!videoFile) {return Promise.reject('Please upload a video file.');}return new Promise((rs, rj) => {const video = document.createElement('video');const url = URL.createObjectURL(videoFile);video.src = url;function addVideoLoadListener() {video.addEventListener('loadedmetadata', function() {setTimeout(() => {try {// 设置video的尺寸,确保能够获取整个视频帧video.width = video.videoWidth;video.height = video.videoHeight;// 在视频准备好后,将currentTime设置为0尝试获取第一帧video.currentTime = 0;video.addEventListener('seeked', function() {// 使用canvas绘制当前帧const canvas = document.createElement('canvas');canvas.width = video.videoWidth;canvas.height = video.videoHeight;const ctx = canvas.getContext('2d');ctx.drawImage(video, 0, 0, canvas.width, canvas.height);// 从canvas导出图片,例如导出为base64的图片const mimeType = 'image/png';const imageData = canvas.toDataURL(mimeType);const blob = base64ToBlob(imageData.split(',')[1], mimeType)const coverFileName = videoFile.name.split('.')[0] + '_cover.png';const coverFile = new File([blob], coverFileName, { type: mimeType });const resources = await Promise.all([// 通过oss上传// window.globalOSSClient.put(videoFile.name,videoFile),// window.globalOSSClient.put(coverFileName, coverFile),// or // 后端给的接口,上传后,返回的url// ...]).catch(rj);rs({videoUrl: resources[0].url,coverUrl: resources[1].url,});// 释放视频URL对象URL.revokeObjectURL(url);}, { once: true });} catch (err) {rj(err);}}, 100) });}// 解决微信浏览器下,ios上传视频,出现的问题 if ((window as any).WeixinJSBridge && /(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {window.WeixinJSBridge.invoke('getNetworkType', {}, () => {video.muted = true;video.playsInline = true;video['webkit-playsinline'] = true;addVideoLoadListener()video.play().then(() => video.pause());});} else {addVideoLoadListener();}});
}function base64ToBlob(base64, mimeType) {const byteString = atob(base64);const ab = new ArrayBuffer(byteString.length);const ia = new Uint8Array(ab);for (let i = 0; i < byteString.length; i++ ) {ia[i] = byteString.charCodeAt(i);}const blob = new Blob([ab], { type: mimeType });return blob;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/819801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git设置ssh秘钥远程连接

文章目录 1、生成rsa秘钥2、将rsa秘钥添加到远程仓库平台 我们在往github上push项目的时候&#xff0c;使用SSH&#xff08;安全外壳协议&#xff09;代替HTTPS来推送和拉取Git仓库的内容是一个更为方便和安全的方式&#xff0c;特别是在频繁与远程仓库交互的情况下。通过配置S…

第九届少儿模特明星盛典 全球赛首席体验官『韩嘉滢』精彩回顾

2024年1月30日-2月1日&#xff0c;魔都上海迎来了龙年第一场“少儿形体行业美育春晚”&#xff01;由IPA模特委员会主办的第九届少儿模特明星盛典全球总决赛圆满收官&#xff01;近2000名少儿模特选手从五湖四海而来&#xff0c;决战寒假这场高水准&#xff0c;高人气&#xff…

【算法】删除链表中重复元素

本题来源---《删除链表中重复元素》。 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入…

46.HarmonyOS鸿蒙系统 App(ArkUI)网格布局

Grid(){GridItem(){Button(按钮1).fontSize(28)}.backgroundColor(Color.Blue)GridItem(){Text(数学).fontSize(28)}.backgroundColor(Color.Yellow)GridItem(){Text(语文).fontSize(28)}.backgroundColor(Color.Green)GridItem(){Text(英语).fontSize(28)}.backgroundColor(Co…

如何监控tomcat的性能

关键指标 tomcat的关键指标有吞吐量、响应时间、错误数、线程池、cpu以及JVM内存。其中前三3个指标是最值得我们关注的业务指标。 部署和管理Web应用程序时&#xff0c;监控Tomcat的性能是至关重要的。Tomcat是一个流行的开源Servlet容器&#xff0c;用于托管Java Web应用程序。…

极速充电!一键解决苹果手机充电慢的问题

现如今&#xff0c;手机是我们日常生活中不可或缺的一部分&#xff0c;我们经常会使用它来刷短剧、看小说、读新闻等。然而&#xff0c;有时我们可能会遇到苹果手机充电慢的问题&#xff0c;这不仅影响了手机的用户体验&#xff0c;还可能给我们的生活带来一些不便。 遇到这种…

单细胞核转录组——植物:叶叶我呀裂开啦~

单细胞转录组测序技术能够在单细胞分辨率下研究样本的转录组信息&#xff0c;可以完美解决细胞异质问题&#xff0c;能全面真实揭示细胞多样性和复杂性&#xff0c;能够更加深入地研究细胞类型、细胞功能、细胞亚群及其异质性、细胞谱系等&#xff0c;还常用于识别新的细胞类型…

cesium 指定点旋转rectangle entity方式 坐标篇

cesium中rectangle是水平垂直于正北方向的&#xff0c;rectangle的属性中有rotation&#xff0c;但是rotation是以矩形的中心点进行旋转的&#xff0c;旋转过程中矩形的形状可能会变形&#xff0c;如果需要以矩形的顶点为原点进行旋转&#xff0c;可以采用entity的方式添加poly…

2024年外贸行业营销神器推荐

2024年外贸行业营销神器推荐&#xff1a;外贸人每天面对的不是国内客户&#xff0c;而是全球客户&#xff0c;相对于国内来说&#xff0c;会更加麻烦和繁琐&#xff0c;今天就码一篇2024年外贸行业营销神器的推荐文章&#xff0c;希望可以减轻各位外贸人的负担&#xff01; 1、…

OpenHarmony实战开发-页面深色模式适配。

介绍 本示例介绍在开发应用以适应深色模式时&#xff0c;对于深色和浅色模式的适配方案&#xff0c;采取了多种策略如下&#xff1a; 1. 固定属性适配&#xff1a;对于部分组件的颜色属性&#xff0c;如背景色或字体颜色&#xff0c;若保持不变&#xff0c;可直接设定固定色值…

Matroska解封装原理与实践

本期作者 背景 Matroska是一种开放标准、功能强大的多媒体封装格式&#xff0c;可容纳多种不同类型的视频、音频及字幕流&#xff0c;其常见的文件扩展名为.mkv、.mka等。与应用广泛的MP4相比&#xff0c;Matroska更加灵活开放&#xff0c;可以同时容纳多个字幕&#xff0c;甚至…

29、Lua中的元表与元方法

Lua中的元表与元方法 前言算术类的元方法__tostring元方法如何保护我们的 "奶酪"——元表__index元方法__newindex元方法 前言 Lua中每个值都可具有元表。 元表是普通的Lua表&#xff0c;定义了原始值在某些特定操作下的行为。你可通过在值的原表中设置特定的字段来…

网络协议之 STP生成树协议学习心得

title: STP生成树协议 tags: internet top: true cover: true stp协议的背景 为了解决单点故障的问题&#xff0c;提出冗余的概念&#xff0c;但是又产生了新的问题————环路 表现形式为&#xff1a; &#xff08;1&#xff09;MAC地址表抖动 &#xff08;2&#xff09;多帧…

C#引用外部组件的常用方法

我们在开发程序过程中&#xff0c;时常会使用到第三方组件&#xff0c;比如一些通信、UI组件等。常用的引用方法有下面几种。 01 NuGet引用 NuGet是.NET的一个包管理平台&#xff0c;很多开源组件会通过NuGet进行管理和发布。比如我们常用的S7NetPlus等。 从NuGet中引用组件…

零基础学Python专栏文章导航站

零基础学Python专栏文章导航站 专栏导读零基础入门篇 专栏导读 本文是零基础学Python的文章导航站。专栏分为零基础入门篇、模块篇、网络爬虫篇、Web开发篇、办公自动化篇、数据分析篇… 为了方便专栏订阅者更方便的阅读专栏文章&#xff0c;点击链接即可跳转到具体文章&#…

Vue的项目文件夹中的<router>指的是什么

在Vue框架搭建的项目中&#xff0c;前端路由主要指的是基于HTML5的history模式或hash模式来实现在不刷新页面的情况下进行页面之间的跳转。这是单页应用&#xff08;SPA, Single Page Application&#xff09;中的一个核心概念。 具体来说&#xff0c;前端路由允许我们在不重新…

FL Studio v21.2.3.4004 中文永久版网盘下载(含Key.reg注册表补丁)

软件介绍 FL Studio21水果编曲软件汉化版是一款专业的音乐制作软件&#xff0c;被广泛地应用于电子音乐、hip-hop、流行乐等多种音乐类型的制作。该软件提供了丰富的音频编曲工具和音乐效果器&#xff0c;让用户可以轻松地创作出高品质的音乐作品。同时&#xff0c;这也是一款…

2. Vue Router4 安装和配置

1. 如何安装 Vue Router4 Vue Router4 可以通过 npm 或者 yarn 这样的包管理器进行安装。以下是安装 Vue Router4 的命令&#xff1a; # 使用 npm 安装 npm install vue-router4# 使用 yarn 安装 yarn add vue-router4这些命令会将 Vue Router4 安装到你的项目中&#xff0c;…

(一)Java八股——Redis

1 Redis缓存 1.1 什么是缓存穿透 ? 怎么解决 ?&#xff08;穿透&#xff09; ​ 缓存穿透是指查询一个一定不存在的数据&#xff0c;如果从存储层查不到数据则不写入缓存&#xff0c;这将导致这个不存在的数据每次请求都要到 DB 去查询&#xff0c;可能导致 DB 挂掉。这种情…

“我,月薪4500,副业收入2w”:用Python做副业,到底有多赚钱?

现在在年轻人打工的第一目标是什么&#xff1f; 就是&#xff1a;搞钱&#xff01;搞钱&#xff01;搞钱&#xff01; 但赚钱谈何容易&#xff0c;很多人工作只有一点“死”工资&#xff0c;每月再扣除房租水电、花呗信用卡的钱&#xff0c;能用的钱真的不多了&#xff0c;更…