uni-app项目中,如何利用canvas获取视频的封面 2022-04-25 记录一下在uni-app项目中遇到的一些问题。 一、选择视频并上传,播放 展示: 文章图片 全屏播放: 文章图片 1、在非H5端图层太高的问题 安卓APP中,由于是原生组件,层级高于普通前端组件,覆盖其需要使用、,但要在开始结束标签之间。自定义播放按钮,删除按钮都可以使用这些标签实现。但展示选择的视频时,弹出选择框(如picker),就无法用这些标签实现层级高于。实现方式:展示时用view,播放时用全屏播放。 html部分 js部分 mounted() { // #ifdef APP-PLUS || H5 this.videoContext = uni.createVideoContext('fullScreenVideo') // #endif // #ifdef MP-WEIXIN this.videoContext = uni.createVideoContext('fullScreenVideo', this) // #endif }, beforeDestroy() { clearTimeout(this.timer) this.timer = null }, methods: { toPlayVideo(url) { this.videoUrl = url //.split('?')[0] this.timer = setTimeout(() =>{ // #ifdef APP-PLUS || H5 this.videoContext = uni.createVideoContext('fullScreenVideo') // #endif // #ifdef MP-WEIXIN this.videoContext = uni.createVideoContext('fullScreenVideo', this) // #endif // 微信开发工具不生效,要真机测试 this.videoContext.requestFullScreen({ direction: 0 }) this.videoContext.play() }, 100) }, fullscreenchange(e) { if(!e.detail.fullScreen) { this.videoContext.stop() this.videoUrl = false } }, onVideoError(err) { console.log('播放视频失败:', err) }, deleteFile(file, index) { uni.showModal({ title: '提示', content: '您确定要删除此项吗?', success: res => { if (res.confirm) { this.$emit('delete-item', { file, index }) } } }) }, } 2、获取视频的封面 展示视频的view里面,要用一个图片作为视频的封面,可以用视频的首帧。获取视频的封面,用到renderjs,通过canvas实现。 html部分 js部分 【uni-app项目中,如何利用canvas获取视频的封面】video-poster.js const mixinVideo = { methods: { getVideoPoster(url) { return new Promise(function (resolve, reject) { let video = document.createElement('video') video.setAttribute('crossOrigin', 'anonymous') // 处理跨域,H5需后台支持,请求的视频资源响应投标需有Access-Control-Allow-Origin video.setAttribute('src', url) video.setAttribute('width', 400) video.setAttribute('height', 400) video.setAttribute('preload', 'auto') // uni.chooseVideo选择视频,当选用手机拍摄的视频时,地址是相对地址,如 _doc/uniapp_temp_1650594368317/camera/1650594390147.mp4 // 可播放,但是loadeddata一直不执行,会触发error事件,视频加载失败 // 因先转换成本地地址 video.addEventListener('loadeddata', function () { console.log('视频第一帧加载完') let canvas = document.createElement('canvas') let width = video.width // canvas的尺寸和图片一样 let height = video.height canvas.width = width canvas.height = height canvas.getContext('2d').drawImage(video, 0, 0, width, height) // 绘制canvas const dataURL = canvas.toDataURL('image/jpeg') // 转换为base64 console.log('getVideoPoster-dataURL', dataURL.slice(0, 16)) resolve(dataURL) })video.addEventListener('error', err => { console.log('视频加载失败', err) reject(err) }) }) }, async getAllPoster(newVal, oldVal, owner, instance) { console.log('执行getAllPoster') // renderjs中,监听的属性videos是一个数组,存放的是选取的视频信息 // 删除,或updateVideos更新后(长度一样) if(newVal.length <= oldVal.length) return // 有默认值或添加时 const newList = [] for(const item of newVal) { // 已获取视频封面的不再重复获取 if(item.posterUrl !== undefined) { newList.push({ ...item }) continue }try { let url = item.url // 拍摄视频:_doc/uniapp_temp_1650594368317/camera/1650594390147.mp4 // 网络视频:https:// // 本地视频:file:// if(!item.url.includes('file://') && !item.url.includes('https://')) { // 将本地URL路径转换成平台绝对路径 // 如输入url为“_doc/a.png”: // Android平台转换后的路径为“/storage/sdcard0/Android/data/io.dcloud.HBuilder/.HBuilder/apps/HBuilder/doc/a.png”; // #ifdef APP-VUE url ='file://' + plus.io.convertLocalFileSystemURL(item.url) // #endif } const dataUrl = await this.getVideoPoster(url) newList.push({ ...item, posterUrl: dataUrl }) } catch (err) { newList.push({ ...item }) } } this.$ownerInstance.callMethod('updateVideos', newList) } } }export default mixinVideo 推荐阅读 erp系统几大板块,erp系统主要包括哪几个大的模块 孙侨潞|太突然!知名女演员去世,年仅25岁!为何这病会缠上年轻人? 瑶柱咸的好还是淡的好 黄鳝怎么多养几天 黄鳝养多久 2020北京车展:打破旧规则 确立新秩序 2020北京车展 魔兽世界120满级后做什么 这四件事一定要做 七月流火九月授衣的火是什么意思 火在七月流火九月授衣中的意思 redis二级缓存 ehcache一级缓存 redis一级缓存是什么 小米粥的禁忌 在人生低谷的时候,做什么能对你有帮助? 山海经有什么神话故事 癫痫是怎样发生的? 红砖怎么烧制视频 红砖怎么烧制 狗长五个爪子是怎么回事 春天养生之青年篇 肉丝香干的用料 香干肉丝 线程安全性 c50|性能提升50%以上 龙芯发布新一代处理器 小白也能轻松操作 爱普生l3153刷机教程详解 传统建筑平面形制中的路是什么意思 传统建筑平面形制中的路指什么 WinXP文件夹没有安全选项如何处理? mac上使用jmeter录制web项目和手机app 关于idea中新建web项目webapp文件夹没有小蓝点 ,启动服务,访问不到解决方案 Android 完整开源应用大全,完整开源项目 android:PopupWindow的使用场景和注意事项 项目完成|项目完成 - 基于Django3.x版本 - 开发部署小结 开源项目Universal Image Loader for Android 说明文档简单介绍 8张图看懂office2016的10项新技巧_其它办公 王立平--eclipse中改动android项目的版本 Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can&#39;t find referenced class问题的解决方式