微信小程序 - webview组件打开H5页面视频录制上传

1,400 阅读1分钟

微信小程序 - webview组件打开H5页面视频录制上传

需求:微信小程序内嵌H5页面需要一个录制视频上传功能

使用input来调起手机摄像头进行视频录制

<button @click="openVideo">开始录制</button>
<input ref="inputVideo" type="file" name="video" id="video-input" accept="video/*"capture="camcorder" @change="videoChange($event)" hidden/>

点击button实现调起录制摄像头

//点击button实现调起录制摄像头
openVideo() {
  this.$refs.inputVideo.click();
},

获取视频文件进行上传

videoChange(e) {
  let file = e.target.files[0];
  let url = URL.createObjectURL(file);
  let audioEle = new Audio(url);
  let dataFile = new FormData();
  dataFile.append("file", file);
 //接口调用把dataFile传给后端即可
},

这里在录制完成上传时遇到了一个问题,Android可以正常上传而ios会发现进不到接口会直接抛出err,这是因为H5的页面是https的而接口是http前缀的,ios安全性比安卓高不允许在https页面去访问http的接口,只需要接口也配置成https的就可以完美解决了。

新增需求:判断视频时长,超出限制拦截禁止上传

loadedmetadata 兼容性问题

1,使用loadedmetadata函数,当指定的音频/视频数据已加载时,会发生 loadedmetadata 事件,这种获取视频的时长在其他浏览器都可以获取到视频的时长,但是在ios微信小程序内打开内嵌的h5页面是不会触发的

2.由于ios对audio和video的一系列限制,包括提前load和自动播放等,所以只有当audio触发play事件,才可以监听到duration,我们只需要默认触发play事件,播放音频,注意的需要及时进行暂停。

代码:

videoChange(e) {
  let file = e.target.files[0];
  let url = URL.createObjectURL(file);
  let audioEle = new Audio(url);
  let dataFile = new FormData();
  dataFile.append("file", file);
  audioEle.muted = true
  audioEle.play().then(()=>audioEle.pause())
  audioEle.addEventListener("loadedmetadata", () => {
    this.duration = audioEle.duration;
    //下面就可以进行判断来调用接口了
  });
},

至此问题就得到解决了~