需求
页面显示这个视频,封面要求是视频里面的内容,然后点击出现弹窗,视频在弹窗里面播放
const video_url = '.mp4'
一.最好用的办法是,直接用背景图
<view class="vide-img":style="{background:'url('+video_url+'?x-oss-process=video/snapshot,t_0,f_jpg'+') no-repeat center center/cover'}"@click="" //点击打开弹窗
>
</view>
二.就是用renderjs了(因为app没有dom),通过创建video标签,然后通过canvas绘制图片的方式
<template> <view> <view :vsrc="vsrc" :change:vsrc="renderScript.getVideoImg"> <video src="_doc/uniapp_save/16891612452645.mp4"></video> </view> <image :src="imgSrc" mode=""></image> <!-- <button @click="setUrl('_doc/uniapp_save/16891612452645.mp4')">设置链接</button> --> <button @click="setUrl('https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/2minute-demo.mp4')">设置链接</button> </view>
</template> <script> export default { data() { return { vsrc: {}, //用于renderjs通信 imgSrc: "" } }, methods: { // 接收图片的base64编码 receiveImg(data) { //data.test为返回的封面图 console.log("接收到的数据", data); this.imgSrc = data.test }, //视频封面图 setUrl(url) { console.log("setUrl触发了", url); let options = {}; options.width = 300; options.height = 300; options.src = url; this.vsrc = options; } } }
</script> <script module="renderScript" lang="renderjs"> export default { data() { return { test: "" } }, methods: { //通过视频获得缩略图 getVideoImg(newValue, oldValue, ownerInstance, vm) { console.log("getVideoImg触发了", newValue, oldValue); if (newValue == null) return; let that = this; // 在缓存中创建video标签 let video = document.createElement("VIDEO") // 添加一个静音的属性,否则自动播放会有声音 // video.setAttribute('muted', true) video.muted = true // 通过setAttribute给video dom元素添加自动播放的属性,因为视频播放才能获取封面图 video.autoplay = true; //允许跨域访问 video.crossOrigin = 'anonymous'; // 上面我们只是创建了video标签,视频播放需要内部的source的标签,scr为播放源 video.innerHTML = '<source src=' + newValue.src + ' type="audio/mp4">' // 再创建canvas画布标签 let canvas = document.createElement('canvas'); let ctx = canvas.getContext('2d'); // video注册canplay自动播放事件 video.addEventListener('canplay', function() { console.log("canplay事件触发了"); // 创建画布的宽高属性节点,就是图片的大小,单位PX let anw = document.createAttribute("width"); anw.nodeValue = newValue.width; let anh = document.createAttribute("height"); anh.nodeValue = newValue.height; canvas.setAttributeNode(anw); canvas.setAttributeNode(anh); // 画布渲染 ctx.drawImage(video, 0, 0, newValue.width, newValue.height); // 生成图片 that.test = canvas.toDataURL('image/png') // 这就是封面图片的base64编码 // 视频结束播放的事件 video.pause() // 返回图片的base64编码 ownerInstance.callMethod('receiveImg', { test: that.test }) }, false) }, } }
</script> <style lang="scss"> </style>
点击【设置连接】按钮会给vsrc赋值,触发renderScript.getVideoImg,成功返回图片的base64编码