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 推荐阅读 性价比高的男士面膜 男士面膜哪个牌子好 女性气血不足的6个表现 气血不足的症状有哪些表现女人? 如何办早教中心? 洗衣机免拆和拆洗哪种好哪种更适合你,大概率是这几个问题 电子商务发展现状分析 苹果6屏幕上的悬浮按钮怎么设置 睡上下铺对孩子的影响 睡上下铺有风水讲究吗 yoosee安卓版,如何安装智能家居产品? 建立空间站有什么用处呢?为什么不多建立几个空间站? 儿童吃蚝油对身体有害吗 大学的国际班什么意思可靠吗 大学的国际班的意思 冰皮月饼放冷冻还是冷藏 苹果总部 pcb板是什么材料?PCB板是什么东西 etc怎么充值缴费 etc怎么充值 附演出内容 2023淮安元旦文旅惠民演出直播观看入口 一举两得的举是什么意思 一举两得的举什么意思是什么 女生与女生聊天技巧 Presto调优总结 肺癌|肺癌早期能活多久?医生:看治疗情况 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问题的解决方式