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/
作者
Amlx.
发布于
2025-10-05
许可协议
CC BY-NC-SA 4.0