从零到一:实现微信H5视频行内autoplay

实现微信H5视频行内autoplay.jpg

写在前面

不知不觉又到了2019年的深秋,想不到上一篇文章孩子还没出生,这一篇就已经半岁了。创业加上带孩子,时间会过得飞快。在这里劝你们仍是不要过早创业(gank),多多学习(发育)才实际。打工虽不自由,起码安稳,面对任务和书本,胜于面对盈利仍是亏本。javascript

废话很少说,如下正文。css

一般会出现的需求

  1. 微信进入H5后,自动播放视频
  2. 在流行终端上体验尽可能一致
  3. 可在视频上叠加UI

转化为技术需求

  1. 视频须要自动播放
  2. 如何兼容iOS和安卓
  3. 视频须要行内播放

PS:要叠加UI,就得是行内播放而非全屏,iOS倒好,安卓的微信用的X5内核,一言难尽,卡住很多人,网上求助相关问题的不在少数。html


来个简单的demo

IMB_ldhlD6.GIF

查看demo
仓库地址
PS:在微信中打开才能自动播放哦。java

关键代码块

<div class="container">
  <!-- For iOS -->
  <video src="https://static.shikehuyu.com/vincent/wx-video-demo/movie.mp4"
    playsinline webkit-playsinline loop>
  </video>
  <!-- For Android -->
  <canvas></canvas>
  <!-- 示例弹幕 -->
  <div class="danmu">示例弹幕,表示你能够听任意UI在视频上面</div>
</div>
<style>
video {
  width: 80vw;
  height: 80vw;
  object-fit: contain;
  object-position: center;
  display: none;
}
canvas {
  display: none;
}
</style>
function initVideo() {
  var isAndroid = window.navigator.userAgent.match(/android/ig)
  if (isAndroid) { // 安卓
    var src = "https://static.shikehuyu.com/vincent/wx-video-demo/movie.ts"
    player = new JSMpeg.Player(src, {
      canvas: canvas,
      autoplay: true,
      progressive: false,
      loop: true,
      onVideoDecode: function() {
        canvas.style.display = 'block'
        canvas.style.height = 80 / (canvas.width / canvas.height) + "vw"
      }
    })
  } else { // iOS
    player = video
    video.style.display = 'block'
  }
}

window.onload = function() {
  initVideo()
  // 自动播放
  document.addEventListener('WeixinJSBridgeReady', () => {
    player.play()
  })
}

实现要点

  1. 区分开iOS和安卓,iOS用原生video标签,安卓用JSMpeg,绘制画面到canvas上。
  2. iOS用mp4或者其余原生video标签支持的视频格式,安卓用ts格式。(其中ts格式须要用ffmpeg来转一下,下文会说起)
  3. 监听WeixinJSBridgeReady事件,调用视频播放方法,实现自动播放。

什么是ts文件

来自百度百科
ts即"Transport Stream"的缩写。MPEG2-TS格式的特色就是要求从视频流的任一片断开始都是能够独立解码的。

简单地说就是视频数据流,将mp4等格式视频转换成ts后,就能够一段段进行解析,可用于视频直播。JSMpeg就是经过解析视频数据,而后绘制在canvas上,来实现视频播放的。android

如何转换为ts格式

参考 JSMpeg的READMEgit

image.png

转换前须要安装ffmpeg,能够到ffmpeg官网下载,也能够用homebrew等工具安装:github

brew install ffmpeg

我目前只单纯的转换一下,没特别输入其余参数,按教程来走吧。终端进入到视频目录,输入以下命令:web

ffmpeg -i movie.mp4 -f mpegts -codec:v mpeg1video -codec:a mp2 -b 0 movie.ts

image.png

踩坑注意

1.用npm安装的JSMpeg不可用,亲测会出现雪花屏,官网https://jsmpeg.com/下载的才可用!
image.pngnpm

2.progressive需手动设置为false,默认为true,会发起屡次请求,产生额外流量!
image.pngcanvas

延伸问题

  1. 媒体的播放,包括音频和视频,在移动端上须要用户操做才能够播放。(老生常谈)
  2. 特别的是,视频用video标签,加muted属性,也就是静音,就能够autoplay了。(大概是浏览器的开发人员被 某带颜色网站突如其来的声音 吓到了?🐶)

结语

看起来只是一个很小的功能实现,预计5分钟,填坑2小时。不知道是否有其余更好的实现方法,就目前而言,iOS用video、Android用JSMpeg,而后依靠监听WeixinJSBridgeReady事件,实现微信H5视频行内自动播放,就是个人银弹了。

但愿对你们有帮助吧!


其余实现

x5-video-player-type="h5-page"
感谢 gchxp的回复: tx今年新加的新属性x5-video-player-type="h5-page" 针对Android,亲测可用,需测试兼容性
相关文章
相关标签/搜索