ios中关于video标签poster属性兼容问题(ios视频截帧)

这篇具有很好参考价值的文章主要介绍了ios中关于video标签poster属性兼容问题(ios视频截帧)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求如下

移动端h5页面(微信浏览器下)需要上传视频并回显封面,用户点击中间的播放三角可以进行视频的预览;问题就出现在ios手机上使用video的poster属性并不能显示出视频封面,而安卓手机可以正常显示视频的第一帧;

效果图

ios中关于video标签poster属性兼容问题(ios视频截帧),ios,音视频,cocoa
问题分析:

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

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

把video标签加上autoplay(自动播放)属性和muted(静音)属性, 就正常看到视频的画面了;

要想在video标签中显示首帧画面, 需要添加poster属性, 属性值应该是图片的url;或者直接使用img标签替代video的位置,当点击播放的时候再弹层展示需要播放的视频;

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

视频截帧

在ios上面为了能够获取到视频的首帧,需要在生成video标签的时候添加上autoplay属性和muted属性;否则你截出来的是白屏;

代码如下:

第一种方式

  /**
   * 获取视频的第一帧 来当做封面  在ios上面会可能会出现截出黑色的情况
   * @param url 视频的url 可以是一个由window.URL.createObjectURL返回的视频内存临时地址(推荐使用)
   */
  export function getFirstImg(url) {
    return new Promise(function (resolve, reject) {
      try {
        let dataURL = '';
        let width = '90'; // 单位是px
        let height = '90';
        let listen = 'canplay';//需要监听的事件
  
        let video = document.createElement('video');
        let canvas = document.createElement('canvas');
        //使用严格模式
        ('use strict');
        video.setAttribute('crossOrigin', 'anonymous'); //处理跨域
        video.setAttribute('src', url);
        video.setAttribute('width', width);
        video.setAttribute('height', height);
        video.currentTime = 1; // 第一帧
        video.preload = 'auto'; //metadata:抓取原数据
         //判断IOS 监听 durationchange或progress  但是在ios会出现黑屏
        if (/iPad|iPhone|iPod/.test(navigator.userAgent)) {
          video.load();
          video.autoplay = true;
          video.muted = true; //静音
          listen = 'loadeddata';
        }
        // 第二版 dataLoad
        video.addEventListener(listen, () => {
          console.log("我走了");
          canvas.width = width;
          canvas.height = height;
          canvas.getContext('2d').drawImage(video, 0, 0, width, height); //绘制canvas
          dataURL = canvas.toDataURL('image/jpeg'); //转换为base64
          resolve(dataURL);
        });
      } catch (error) {
        console.log('视频截帧的失败报错:', error);
      }
    });
  }

第二种方式

export function getFirstImg(url) {
  const video = document.createElement("video");
  video.crossOrigin = "anonymous"; // 允许url跨域
  video.autoplay = true; // 自动播放
  video.muted = true; // 静音
  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("");
    }
  });
}

前端来获取视频首帧终究不是上上策,因为前端处理视频,就需要视频加载这个过程,如果页面上有很多视频,那访问这样页面,岂不是要偷偷浪费用户流量来加载;


利用视频的自动播放和暂停来获取视频的首帧

上面的这种是视频截帧的方式在ios上创造video节点且需要设置视频自动播放;并使用cavans绘制第一帧的图像并返回base64;

既然这么麻烦,为啥不本来就让他自动播放,并在播放到100-200毫秒的时候主动暂停视频呢;这样也可以达到视频截帧的效果,而且代码也比较简单监听视频的canplay事件并在里面暂停视频;如下:

vue中template里面的处理

<video autoplay muted playsinline preload="auto" :src="filePreviewObj.fileUrl" @canplay="canplay($event)" /> 

canplay方法的处理

/* 视频播放 获取第一帧 */
canplay(event){
  setTimeout(() => {
    event.target.pause(); // 暂停播放视频 以此来获取封面
  }, 200);
};

这种方式大家可以去试一下,亲测有效;

视频截帧的其他方式

其实上传文件,现在最流行的不是bos就是oss

1,BOS:百度云对象存储

官方链接:https://cloud.baidu.com/doc/BOS/s/Yl06cyatz

ios中关于video标签poster属性兼容问题(ios视频截帧),ios,音视频,cocoa

使用如下:直接在视频的原链接后面拼接字符串即可

处理的视频URL为:<原视频URL>?x-bce-process=video/snapshot,t_7000,f_png,w_800,h_600,m_fast

2,OSS:阿里云对象存储:

官方链接: https://help.aliyun.com/document_detail/64555.html

参数 描述 取值范围

t 指定截图时间。如果设置的截图时间t超过了视频时长,则返回视频的最后一帧关键帧。 [0,视频时长]
单位:ms

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

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

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

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

使用示例:

原视频链接:https://oss-console-img-demo-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/video.mp4

使用fast模式截取视频7s处的内容,输出为JPG格式的图片,宽度为800,高度为600。文章来源地址https://www.toymoban.com/news/detail-751665.html

处理后的URL为:https://oss-console-img-demo-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/video.mp4?x-oss-process=video/snapshot,t_7000,f_jpg,w_800,h_600,m_fast

到了这里,关于ios中关于video标签poster属性兼容问题(ios视频截帧)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ios和安卓手机端使用video标签播放失败的问题

    手机端请求后端接口,返回视频流给前端,然后在手机端进行播放,手机端需要适配ios和安卓,后端在开发好接口后在浏览器、postman调用接口时都能正常播放,安卓客户端也可以正常播放,但是ios播放失败。 刚开始觉得是网速太慢的原因,换了一个更小的视频,仍然不行,

    2024年01月18日
    浏览(36)
  • 【标签bug】video标签部分mp4文件在ios中无法自动播放的问题

    在安卓端和h5页面调试端,video标签下的mp4格式文件均可以播放,但是video标签部分mp4文件在ios中无法自动播放的问题,搜了很多资料有如下解决方案 前四个属性: muted:静音播放,一般浏览器chrome为例,用户需要在页面上操作一次,才能播放视频,不允许用户进入后直接显示

    2024年02月06日
    浏览(46)
  • 关于使用video标签插入视频时,视频无法播放的问题

    写代码遇到一个问题:使用video标签插入视频时,在chrome中无法播放,只显示了一个封面图片,在ie却可以播放。 video的使用是看别人的: 由于照搬别人的代码,我写的代码如下: 然后出现问题:只有个封面,不能播放视频 解决过程: ❌我以为是浏览器兼容问题,查资料发

    2024年02月11日
    浏览(40)
  • 苹果手机video标签播放视频问题(播放mp4视频遇到的坑)

    1.场景描述 服务端上传MP4视频文件,iOS客户端通过URL播放该视频文件。提供视频接口,可以进行视频下载或者直接播放,但是iOS手机无法播放,且PC端safari浏览器也无法播放。 2.问题描述 安卓手机可以正常播放视频,iOS手机无法播放,且PC段safari浏览器也无法播放。 3.问题分

    2024年02月22日
    浏览(33)
  • 谷歌chrome浏览器无法自动播放video标签视频的问题

    问题根源详见: Chrome中的自动播放政策  https://developer.chrome.com/blog/autoplay/  The Autoplay Policy launched in Chrome 66 for audio and video elements and is effectively blocking roughly half of unwanted media autoplays in Chrome. For the Web Audio API, the autoplay policy launched in Chrome 71. This affects web games, some WebRTC appli

    2024年02月11日
    浏览(67)
  • uniapp使用video标签无法播放视频出现黑屏问题处理

    问题出现情况 并且点击播放后出现报错 解决办法 问题出现的原因可能是video的视频流不兼容或者在f12下无法看见视频文件导致的,所有我们使用computed计算属性来解决这个问题 js html 按照上面的做法 这样问题就解决了 希望能解决大家的问题 一键三连

    2024年02月11日
    浏览(46)
  • HBuilderX使用uniapp中的video标签开发视频应用APP,出现视频覆盖<view>图层无法遮住等问题如何解决?

    请使用cover-image或cover-view cover-image | uni-app官网 https://uniapp.dcloud.net.cn/component/cover-image.html#cover-image   cover-view | uni-app官网 https://uniapp.dcloud.net.cn/component/cover-view.html#cover-view 情况1:如上图,注意要使用以下位置才能达到遮住的效果   情况2:如上图,就直接用cover-view自定义一

    2024年02月16日
    浏览(28)
  • HTML VIDEO视频标签高度自适

    视频是可以按比例缩放显示的,现在大部分视频的宽度与高度比例是16:9,我们可以通过CSS将视频按照这个比例进行缩放显示。 通过百分比设置宽度,根据宽高比16:9,计算出高度的百分比数值,设置内边距为高度的数值,最后用绝对定位把视频百分百填充到设置的区域里面

    2024年02月13日
    浏览(41)
  • java实现video标签视频流播放

    问题: 在遇到video标签播放后端视频源时问题。直接返回文件流的话 video需要将文件整个下载一次才会播放。这样如果小文件没有问题。如果文件大的话就比较恶心了。 解决方案:通过模拟video标签默认的range bytes规范方法分段获取视频信息。 video标签是通过请求头带上 Ran

    2024年02月14日
    浏览(34)
  • 解决video标签无法播放avi格式的视频

    错误代码 正确代码 在video标签中不要加src属性,必须在video标签内加source标签,兼容不同浏览器解码支持。

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包