手上有泥,心中有诗
469 字
2 分钟
uniapp中在app端获取视频第一帧作为封面
类似微信视频消息
需要在播放视频之前展示缩略图,因为app端没有dom,这里需要用到renderjs,通过创建video标签,然后通过canvas绘制图片的方式。 传入的url最好是base64格式,因为在浏览器中,由于安全限制,JavaScript无法直接访问本地文件系统路径(如file:///或_doc/…这样的路径),如果是网络格式的url则可以直接传入,下面是完整代码示例。
使用:
<VideoGetPoster :videoUrl="content" @change="changeGetPoster"></VideoGetPoster>
组件内部:
<template> <view v-if="base64" :src="base64" :change:src="video.setPoster"></view></template>
<script> export default { name:"video-get-poster", props: { videoUrl: { type: String, require: true } }, data() { return { base64: '' }; }, mounted() { this.$tools.pathToBase64App(this.videoUrl, (base64) => { this.base64 = base64 }) }, methods: { getPoster(poster) { this.$emit('change', poster) } }}</script>
<script lang="renderjs" module="video"> export default { methods: { setPoster(newV, oldV, ownerInstance) { let video = document.createElement("video"); video.muted = true // 通过setAttribute给video dom元素添加自动播放的属性,因为视频播放才能获取封面图 video.autoplay = true; //允许跨域访问 video.crossOrigin = 'anonymous'; // 上面我们只是创建了video标签,视频播放需要内部的source的标签,scr为播放源 video.innerHTML = '<source src=' + newV + ' type="video/mp4">' // loadeddata 事件在媒体当前播放位置的视频帧(通常是第一帧)加载完成后触发。 video.addEventListener('loadeddata', function() { let canvas = document.createElement("canvas"), width = video.videoWidth, //canvas的尺寸和图片一样 height = video.videoHeight; canvas.width = width; canvas.height = height; canvas.getContext("2d").drawImage(video, 0, 0, width, height); //绘制canvas let poster = canvas.toDataURL('image/jpeg'); //转换为base64 ownerInstance.callMethod('getPoster', poster)});}}}</script>
本地文件路径转base64:
/** * 文件转成base64字符串 * @param {String} path // 文件地址 * @param {Object} callback // 返回base64字符串 */export function pathToBase64App(path, callback) { // 通过URL参数获取目录对象或文件对象 plus.io.resolveLocalFileSystemURL(path, function(entry) { entry.file(function(file) { var fileReader = new plus.io.FileReader() fileReader.onload = function(evt) { callback(evt.target.result) } fileReader.onerror = function(error) { console.log('failed: ', error); } fileReader.readAsDataURL(file) }, function(error) { console.log('failed: ', error); }) }, function(error) { console.log('failed: ', error); })}
uniapp中在app端获取视频第一帧作为封面
https://blog.amlx.top/posts/uniapp-video/