基于Vue3实现视频播放与截图功能
更新时间:2025年04月04日 09:01:15 作者:zoahxmy0929
这篇文章主要为大家详细介绍了如何通过Vue3实现简单的视频播放与截图功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
视频播放
使用 HTML5 的 <video> 标签实现,src 改成你自己的视频路径。
<video ref="videoRef" class="video-element" src="@/assets/video/1.mp4" autoplay loop muted ></video>
video 标签基本属性
| 属性 | 说明 |
|---|---|
| src | 视频文件路径(支持相对/绝对路径) |
| autoplay | 自动播放(部分浏览器需配合muted属性) |
| controls | 显示默认播放控制条 |
| width/height | 设置视频显示尺寸 |
| muted | 静音播放 |
| loop | 循环播放 |
| preload | 预加载策略(auto/metadata/none) |
视频截图功能实现
思路
- 视频帧捕获:首先,通过
<video>元素获取当前播放的视频帧画面,浏览器会将视频解码为连续的图像帧,我们可以通过<video>标签的API访问当前显示的帧。 - Canvas 绘制转换:创建一个与视频尺寸相同的
Canvas画布,使用Canvas 2D上下文(Context2D)的drawImage()方法将视频帧绘制到画布上。 - Base64 编码输出:调用
Canvas的toDataURL()方法,将绘制好的图像数据转换为Base64编码的图片URL。该方法支持指定输出格式(如PNG/JPEG)和质量参数,转换后的数据可以直接用作图片源或下载保存。
代码实现
HTML
<template>
<div class="video-container">
<!-- 视频播放器 -->
<div class="video-wrapper">
<video
ref="videoRef"
class="video-element"
src="@/assets/video/1.mp4"
autoplay
controls
></video>
</div>
</div>
</template>
js
<script setup>
import { ref, onMounted, onBeforeUnmount } from "vue";
import { ElMessage } from "element-plus";
const videoRef = ref(null);
const screenshotUrl = ref(""); // 截图后的图片URL
// 截图功能
const scanImage = () => {
if (!videoRef.value) return;
try {
// 创建canvas元素
const canvas = document.createElement("canvas");
const video = videoRef.value;
// 设置canvas尺寸与视频相同
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
// 绘制当前视频帧到canvas
const ctx = canvas.getContext("2d");
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
// 转换为DataURL
screenshotUrl.value = canvas.toDataURL("image/png");
ElMessage.success("截图成功!");
} catch (error) {
console.error("截图失败:", error);
ElMessage.error("截图失败: " + error.message);
}
};
// 快捷键支持 (F9截图)
const handleKeyDown = (e) => {
if (e.key === "F9") {
e.preventDefault();
scanImage();
}
};
// 添加事件监听
onMounted(() => {
window.addEventListener("keydown", handleKeyDown);
});
// 移除事件监听
onBeforeUnmount(() => {
window.removeEventListener("keydown", handleKeyDown);
});
</script>
css
<style lang="scss" scoped>
.video-container {
padding: 20px;
max-width: 800px;
margin: 0 auto;
}
.video-wrapper {
position: relative;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
background: #000;
}
.video-element {
width: 100%;
display: block;
}
.screenshot-controls {
position: absolute;
bottom: 20px;
right: 20px;
z-index: 10;
}
.screenshot-result {
display: flex;
justify-content: center;
align-items: center;
min-height: 300px;
}
.screenshot-image {
max-width: 100%;
border: 1px solid #ebeef5;
border-radius: 4px;
}
.empty-tip {
color: #909399;
font-size: 14px;
text-align: center;
padding: 20px;
}
</style>
到此这篇关于基于Vue3实现视频播放与截图功能的文章就介绍到这了,更多相关Vue3视频播放与截图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
uni-app中App与webview双向实时通信详细代码示例
在移动应用开发中,uni-app是一个非常流行的框架,它允许开发者使用一套代码库构建多端应用,包括H5、小程序、App等,这篇文章主要给大家介绍了关于uni-app中App与webview双向实时通信的相关资料,需要的朋友可以参考下2024-07-07
vue3:vue2中protoType更改为config.globalProperties问题
这篇文章主要介绍了vue3:vue2中protoType更改为config.globalProperties问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-09-09
详解如何在vue+element-ui的项目中封装dialog组件
这篇文章主要介绍了详解如何在vue+element-ui的项目中封装dialog组件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-12-12
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
这篇文章主要介绍了Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-01-01


最新评论