ios中video标签兼容问题

案例

这是在实际开发中遇到的问题,产品给出的效果图如下:
在这里插入图片描述

其实就是一个h5页面中有很多视频, 但是我为什么都画着预览图呢? 因为在ios中video标签中尽管有src属性, 但是在没有预览图的情况下, 是一个灰蒙蒙的图层的, 很丑, 效果如下:

在这里插入图片描述

看到这里是不是很崩溃, 在PC端, 在安卓端都是正常显示的, 但是在ios系统不行, 也就是说在ipad和iphone中不行.

究竟是如何产生这个问题的呢?

在ios系统中有个保护机制, 如果video标签未开始播放, 是不会去加载视频的.

所以也就是说, video标签还未去加载视频, 就显示不出来视频首帧画面.

把video标签加上autoplay属性, 就正常看到视频的画面了.

但是又出现了新的问题, 这样的话, 页面上很多视频, 导致视频声音重叠了

把video标签加上muted属性, 表示静音播放.

要想在video标签中显示首帧画面, 需要添加poster属性, 属性值应该是图片的url

接下来就是怎么获取到视频首帧的图片的url

前端获取视频首帧画面

loadedmetadata事件监听+canvas渲染首帧
在网上找了少相关事例, 同时也问了一下chatGPT如何处理, 得到的结果都差不多, 监听video标签的两个事件
一个是加载元数据loadedmetadata
一个是浏览器估计它可以在不停止内容缓冲的情况下播放媒体直到结束, canplaythrough事件
还有一个canplay, 浏览器可以播放媒体文件了,但估计没有足够的数据来支撑播放到结束,不必停下来进一步缓冲内容。

具体属性和方法可以查看MDN

video.addEventListener('loadedmetadata',() => {console.log('loadedmetadata')const canvas = document.createElement('canvas');video.addEventListener('canplaythrough', () => {console.log('canplaythrough')canvas.width = video.videoWidth;canvas.height = video.videoHeight;canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);const firstFrame = canvas.toDataURL();// console.log(firstFrame); // 输出第一帧画面的Base64编码字符串});},{ once: true });

问题:
但是只是这样处理, 在谷歌浏览器端, 图片的不能正常展示出来
排查: 把canvas渲染出来, 新增img标签, 看一下base64的图片是什么情况

结果竟然连canvas画出来都是一张透明图层
img标签展示

在这里插入图片描述

1.第一帧显示不出来, 获取第二帧

指定video.currentTime = 2, 来获取第二帧

const canvas = document.getElementById('canvas');const video = document.createElement('video');
video.src = "视频链接";let firstFrame = true; 
video.addEventListener('seeked', function() {firstFrame = true;   
});video.addEventListener('loadedmetadata',() => {video.currentTime = 2;video.addEventListener('canplay', () => {canvas.width = video.videoWidth;canvas.height = video.videoHeight;canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);// const firstFrame = canvas.toDataURL('image/png');document.querySelector("#testImg").src = canvas.toDataURL();// console.log(firstFrame); // 输出第一帧画面的Base64编码字符串});},{ once: true }
);

这个时候canvas显示是正常的了, 但是img还是不正常, 而且控制台报错了
原因:

videoFirstFrame.html:37 Uncaught DOMException: Failed to execute ‘toDataURL’ on ‘HTMLCanvasElement’: Tainted canvases may not be exported.
at HTMLVideoElement.

在这里插入图片描述

This error occurs when you try to use the toDataURL() method on an HTML canvas element that has been tainted. A tainted canvas is one that has been affected by a security feature that prevents scripts from accessing pixel data from certain sources, such as images loaded from a different domain.

当您尝试在已被污染的 HTML 画布元素上使用 toDataURL() 方法时,会发生此错误。受污染的画布受到安全功能的影响,该功能阻止脚本访问来自特定来源的像素数据,例如从不同域加载的图像。

To resolve this error, you need to make sure that all the images used in your canvas are hosted on the same domain as your webpage, or that they have the appropriate cross-origin resource sharing (CORS) headers set. If you cannot control the source of the images, you may need to proxy them through your own server to avoid the tainting issue.
要解决此错误,您需要确保画布中使用的所有图像都托管在与您的网页相同的域中,或者它们具有适当的跨域资源共享 (CORS) 标头集。如果您无法控制图像的来源,您可能需要通过自己的服务器代理它们以避免污染问题。

2.视频链接跨域

导致渲染出来的base64图片, 浏览器认为不安全
给video新增属性crossOrigin为anonymous

const video = document.createElement('video');
video.crossOrigin = 'anonymous';
video.src = url;
return new Promise((resolve, reject) => {try {video.addEventListener('loadedmetadata',() => {video.currentTime = 2;const canvas = document.querySelector('#canvas');video.addEventListener('canplay', () => {canvas.width = video.videoWidth;canvas.height = video.videoHeight;canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);const firstFrame = canvas.toDataURL();// document.querySelector("#testImg").src = firstFrame;this.testImg = firstFrame;// console.log(firstFrame); // 输出第一帧画面的Base64编码字符串resolve(firstFrame);});},{ once: true });} catch (err) {console.error(err);reject('');}
});

可以设置video允许视频url跨域,这样调用canvas.toDataURL()就能够看到图片正常展示在谷歌浏览器上

3.ios显示还是白屏

本以为将firstFrame赋值给video的poster属性上,就能解决ios白屏的问题了,但是效果却仍然不行,原因是video.canplay事件未执行

换成video.canplaythrough事件也还是未执行

原因还是ios中,视频只有在播放的情况下会加载

所以就只能给video标签加上autoplay属性和muted属性,这样就能在ios中获取到视频首帧了。

在这里插入图片描述

所以最后在ios上,前端负责渲染第一帧的处理,最后逻辑是


getFirstImg(url) {const video = document.createElement('video');video.crossOrigin = 'anonymous'; // 允许url跨域video.autoplay = true; // 自动播放video.muted = false; // 静音video.src = url;return new Promise((resolve, reject) => {try {video.addEventListener('loadedmetadata',() => {console.log('loadedmetadata')video.currentTime = 2;const canvas = document.createElement('canvas');video.addEventListener('canplaythrough', () => {console.log('canplaythrough')canvas.width = video.videoWidth;canvas.height = video.videoHeight;canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);const firstFrame = canvas.toDataURL();// console.log(firstFrame); // 输出第一帧画面的Base64编码字符串resolve(firstFrame);});},{ once: true });} catch (err) {console.error(err);reject('');}});
},async handleImg() {for (let i = 0; i < this.videoList.length; i++) {this.videoList[i].img = await this.getFirstImg(this.videoList[i].url);console.log(i, 11111);}
},mounted() {this.handleImg();
},

4.当视频数量很多时,加载时间过长

前端来获取视频首帧终究不是上上策,因为前端处理视频,就需要视频加载这个过程,如果页面上有很多视频,那访问这样页面,岂不是要偷偷浪费用户流量来加载,最理想的情况是:用户点击播放,需要看哪个视频,就加载哪个视频,这样既能保证页面的响应速度,也能够保证不浪费用户流量,最重要的是用户体验感会增强很多。

所以还是后端直接返回视频首帧的图片,最理想

后端返回视频首帧图片

但是技术评审时,后端就需要排查,如果上传视频的时候,没有保存视频首帧图片,那他怎么去拿这个数据返回呢?

其实上传文件,现在最流行的不是oss就是cos
OSS:阿里云存储
COS:腾讯云存储

oss获取视频首帧

https://help.aliyun.com/document_detail/64555.html

阿里云获取视频首帧很简单,直接在url后面拼接参数就行了

这样都不需要后端怎么处理,前端这样就能够拼接
参数 描述 取值范围
t 指定截图时间。如果设置的截图时间t超过了视频时长,则返回视频的最后一帧关键帧。 [0,视频时长]
单位:ms

w 指定截图宽度,如果指定为0,则自动计算。 [0,视频宽度]
单位:像素(px)

h 指定截图高度,如果指定为0,则自动计算;如果w和h都为0,则输出为原视频宽高。 [0,视频高度]
单位:像素(px)

m 指定截图模式,不指定则为默认模式,根据时间精确截图。如果指定为fast,则截取该时间点之前的最近的一个关键帧。 枚举值:fast

f 指定输出图片的格式。 枚举值:jpg和png

// oss获取视频的第一帧
getVideoCover(url, time, format, width, height) {const image = `${url}?x-oss-process=video/snapshot,t_${time},f_${format},w_${width},h_${height}`;return image;
},

cos获取视频首帧

https://cloud.tencent.com/document/product/460/47505
发现需要收费,还有用量限制

cos是提供了接口,还没有oss这么方便
在这里插入图片描述

这里又有两种情况,一种是后端去请求cos接口,这样能够一起返回给前端页面
一种是前端去请求接口,但是如果在视频很多的情况下,会导致这个页面要请求很多接口

个人建议:还是后端去请求接口更可靠

好了,今天的分享到这里就结束了,如果大家有什么好的方法能够解决这个问题,也欢迎大家在评论区参与讨论~

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

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

相关文章

CAN302电商技术 个人笔记

本文只涉及Lec知识点 考试考不到这么多&#xff0c;看卷子复习 1. Lec01 E-Commerce 1.1. Commerce vs. business Commerce: The exchange or buying and selling of commodities on a large scale involving transportation from place to place. Business: The activity …

前端面试题总结

列举常用的字符串方法 str.concat()&#xff1a;用于将一个或多个字符串拼接起来&#xff0c;返回拼接后的新字符串 str.slice()&#xff1a;此方法用来提取一个字符串&#xff0c;并返回一个新的字符串 str.substring()&#xff1a;此方法和slice方法功能相同都是提取一个字符…

安卓调试|入门扫盲必备adb调试工具介绍、安装使用说明

欢迎关注「全栈工程师修炼指南」公众号 点击 &#x1f447; 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; “ 花开堪折直须折&#xff0c;莫待无花空折枝。 ” 作者主页&#xff1a;[ https://www.weiyigeek.top ] 博客&…

两万文字多图详解常用软件工具使用(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

ChatGPT Plus 首批70个插件最全解读

来源&#xff1a;https://mp.weixin.qq.com/s/x2akU7m2MDs-fW_6pnTAcg OpenAI放出大招&#xff0c;向所有ChatGPT Plus用户开放联网功能和众多插件&#xff0c;允许ChatGPT访问互联网并使用70个第三方插件。 本批第三方插件能够全方位覆盖衣食住行、社交、工作以及学习等日常所…

强推集成GPT-4的编辑器Cursor;面向ChatGPT编程18种方法;如何将AI绘画融合于工作流;ChatGPT SEO公式大揭秘 | ShowMeAI日报

&#x1f440;日报合辑 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『AI 作品不受版权法保护&#xff1f;假的&#xff01;』保护「人工」不保护「智能」&#xff0c;技术工具可以成为创造过程的一部分 3月16日&a…

php显示数学公式,php代码中如何输出数学公式

使用google的接口显示数学公式 单行公式 (推荐学习&#xff1a;PHP视频教程) 多行公式 $str$$ \left\{ \begin{aligned} x^2 3y^23 \\ yk(x-1)\\ \end{aligned} \right. $$; //将$$转化为$$ $strstr_replace("$$", "$", $str); // dd($str); $pattern/\$(.…

【DL】《【Chatgpt】+【simplelatex】再也不用愁数学公式!!!》

《【Chatgpt】【simplelatex】再也不用愁数学公式&#xff01;&#xff01;&#xff01;》 1. 使用OCR工具解析公式&#xff1a;SimpleTex 示例&#xff1a; q(\mathbf x_t|\mathbf x_{t-1})\mathcal N(\mathbf x_t;\sqrt{1-\beta_t}\mathbf x_{t-1},\beta_t\mathbf I)\qua…

chatgpt赋能python:Python中平均数的计算方法和应用

Python中平均数的计算方法和应用 在数学中&#xff0c;平均数是一组数字的中心趋势度量&#xff0c;通常用来代表一组数据的总体特征。在Python编程语言中&#xff0c;计算平均数也是非常常见且重要的操作。本文将介绍Python中计算平均数的方法和应用。 平均数的定义和计算方…

chatgpt赋能python:Python求立方和的完整指南:介绍、实现和结论

Python求立方和的完整指南&#xff1a;介绍、实现和结论 在编程语言中&#xff0c;Python已经成为了一个巨大的平台&#xff0c;它已经在多个领域得到了成功的应用。它不仅可以做数据分析、机器学习和Web开发等应用&#xff0c;还可以进行科学计算和解算。在本文中&#xff0c…

ChatGPT 最火的五个使用场景

最近大火的ChatGPT&#xff0c;获得微软巨额投资&#xff0c;连比尔盖茨都盛赞&#xff1a;“AI将成为2023年最热门的话题&#xff0c;那是合适的。 不少商界大佬也纷纷夸赞ChatGPT。 马斯克表示&#xff0c;“ChatGPT很惊人&#xff0c;我们离强大到危险的人工智能不远了” …

ChatGPT5是否会影响人类的发展和工作?

目录 前言ChatGPT5是什么ChatGPT5 的潜在影响挑战与风险总结 前言 ChatGPT的普及也带来了大量的讨论&#xff0c;关于它是否会影响人类的发展和工作。本文将讨论 ChatGPT5 如何可能改变人类的工作和发展&#xff0c;以及潜在的利弊和挑战。在话题开始之前&#xff0c;让我们先…

ChatGPT 完全颠覆了我今年的计划

仔细阅读本文需要超过 6 分钟的时间&#xff0c;建议您先通篇阅读粗体文字和图片。 上线近三个月&#xff0c;这把名为 “ChatGPT” 的火&#xff0c;点燃了科技圈。众多科技大厂纷纷入局&#xff0c;都在紧急开发类似的应用产品。昨天复旦 Moss 的发布&#xff0c;以及百度“文…

ChatGDP:人类未来世界的“主宰”

重要&#xff1a;国内免费ChatGPT体验 ChatGPT 先简单介绍一下今天的主角——ChatGPT。 ChatGPT是一款由OpenAI开发的聊天机器人&#xff0c;它具有出色的自然语言处理能力&#xff0c;能够与人类进行真实的对话。它的核心技术是GPT-3语言模型&#xff0c;能够自动学习语言特征…

Auto-GPT:揭示 ChatGPT、GPT-4 和开源 AI 之间的联系

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、什么是Auto-GPT&#xff1f;二、Auto-GPT 是如何工作的&#xff1f;三、Auto-GPT 能做什么&#xff1f;四、谁制造了 Auto-GPT&#xff1f;五、ChatGPT 或 …

GPT-4和ChatGPT大比拼,究竟谁胜?

点击链接查看原文&#xff1a;GPT-4和ChatGPT大比拼&#xff0c;究竟谁胜&#xff1f; 来源&#xff1a;【零点有数科技】&#xff0c;作者许正军、袁岳 作为人工智能史上里程碑事件之一的ChatGPT&#xff0c;自2022年11月30日发布至今&#xff0c;一直备受热议。在ChatGPT热潮…

State of GPT (ChatGPT 原理及现状介绍)

State of GPT 演讲信息&#xff1a; 演讲人&#xff1a;Andrej Karpathy (现在OpenAI任职)&#xff0c;之前是特斯拉视觉研发负责人&#xff0c;斯坦福深度学习入门课程 CS231N 讲师演讲主题&#xff1a;受到微软 BUILD2023 邀请&#xff0c;介绍 GPT 的原理及研发现状&#x…

Fox GPT与ChatGPT有什么区别?

对话Fox GPT&#xff1a;Fox GPT与ChatGPT有什么区别&#xff1f; Fox GPT和ChatGPT都是基于OpenAI GPT系列的语言生成模型&#xff0c;但它们具有一些不同和特点。 训练数据不同&#xff1a;Fox GPT是基于获得多个计算机游戏的数据训练的&#xff0c;ChatGPT则是基于社交媒体和…

GPT3.5, InstructGPT和ChatGPT的关系

GPT-3.5 GPT-3.5 系列是一系列模型&#xff0c;从 2021 年第四季度开始就使用文本和代一起进行训练。以下模型属于 GPT-3.5 系列&#xff1a; code-davinci-002 是一个基础模型&#xff0c;非常适合纯代码完成任务text-davinci-002 是一个基于 code-davinci-002 的 InstructG…

从GPT到chatGPT(三):GPT3(一)

#GPT3 文章目录 前言正文摘要介绍方法模型结构训练数据集训练过程评估 小结 前言 OpenAI在放出GPT2后&#xff0c;并没有引起业界太大的影响和关注&#xff0c;究其原因&#xff0c;并不是zero-shot这种想法不够吸引人&#xff0c;而是GPT2表现出来的效果依然差强人意&#x…