tnblog
首页
视频
资源
登录

vue3 视频默认显示第一帧,解决视频加载的时候是黑色的问题

810人阅读 2024/11/27 14:45 总访问:430965 评论:0 收藏:0 手机
分类: 前端

方法一:使用 JavaScript 的 Canvas API 来截取视频的第一帧

  1. <template>
  2. <div class="video-container">
  3. <video
  4. ref="videoRef"
  5. @loadeddata="captureFirstFrame"
  6. controls
  7. ></video>
  8. </div>
  9. </template>
  10. <script setup lang="ts">
  11. import { onMounted, ref } from 'vue';
  12. const videoRef = ref<HTMLVideoElement | null>(null);
  13. let posterImageSrc: string | null = null;
  14. onMounted(() => {
  15. // 如果视频在mounted时还没有触发loadeddata,你可能需要额外的逻辑来处理这种情况
  16. // 例如,设置一个超时或监听更多的视频事件
  17. });
  18. const captureFirstFrame = () => {
  19. if (videoRef.value) {
  20. const canvas = document.createElement('canvas');
  21. canvas.width = videoRef.value.videoWidth;
  22. canvas.height = videoRef.value.videoHeight;
  23. const context = canvas.getContext('2d');
  24. if (context) {
  25. // 绘制视频的第一帧到canvas上
  26. context.drawImage(videoRef.value, 0, 0, canvas.width, canvas.height);
  27. // 将canvas转换为图片URL并设置为海报图
  28. posterImageSrc = canvas.toDataURL('image/jpeg');
  29. videoRef.value.setAttribute('poster', posterImageSrc);
  30. // 注意:这里设置poster属性后,如果视频开始播放,海报图会被视频内容替换。
  31. // 如果你希望在视频播放后仍然显示海报图(例如,在暂停时),你需要额外的逻辑来处理。
  32. }
  33. }
  34. };
  35. </script>
  36. <style scoped>
  37. .video-container {
  38. width: 100%;
  39. max-width: 600px;
  40. margin: 0 auto;
  41. }
  42. </style>

方法二:方法1不行的情况下直接使用currentTime来设置一点视频进度

方法1不行的情况下可以考虑直接使用currentTime来设置一点视频进度。这样就可以简单的实现展示视频内容了

  1. const captureFirstFrame = () => {
  2. if (videoRef.value) {
  3. const canvas = document.createElement('canvas')
  4. canvas.width = videoRef.value.videoWidth
  5. canvas.height = videoRef.value.videoHeight
  6. const context = canvas.getContext('2d')
  7. if (context) {
  8. let video = videoRef.value
  9. video.crossOrigin = 'Anonymous'
  10. // 设置播放进度
  11. video.currentTime = 0.5
  12. }
  13. }
  14. }

如何觉得预先设置一点进度不太好,可以在首次点击播放的时候从头开始播放

页面上绑定一个play事件

  1. <video ref="videoRef" @play="onPlay" @loadeddata="captureFirstFrame" controls width="100%" height="100%">
  2. <source :src="state.vedioUrl" type="video/mp4" />
  3. Your browser does not support the video tag.
  4. </video>

然后在play事件中去处理如果是第一次点击就头开始播放即可

  1. const state = reactive({
  2. isFirstPlay:true,
  3. })
  4. const videoRef = ref<HTMLVideoElement | null>(null)
  5. const onPlay = () => {
  6. // 如果是第一次进行视频播放就从0开始
  7. if(state.isFirstPlay){
  8. let video = videoRef.value
  9. video.currentTime = 0
  10. state.isFirstPlay=false
  11. }
  12. }
评价

vue3vue组件props给一个对象参数。vue组件间传参数vue父组件给子组件传参数。组件参数类型。父组件调用子组件的方法。vue组件事件监听给子组件传递方法子组件调用父组件方法

[TOC]组件可以使用props给组件传值,可以同时传递多个,可以是任意类型,比如字符串或者对象。 下面是个简单的例子: &lt...

vue3最基础的数据加载表格table

vue3表格加载一点静态数据 &lt;template&gt; &lt;el-table :data=&quot;tableData&quot; style=&quot;width: 100%&quot...

vue3 Element Plus 表单输入框放到一行

当垂直方向空间受限且表单较简单时,可以在一行内放置表单。 通过设置 inline 属性为 true 可以让表单域变为行内的表单域...

vue3 Element ui Plus 表格 分页vue3 el-pagination分页

其实就是el-pagination控件的使用而已 &lt;template&gt; &lt;div&gt; &lt;el-table :data=&quot;tableData&quot; ...

vue触发a标签的点击事件。vue3 dom操作 触发点击事件 。文件选择库只会触发一次change事件的问题

[TOC]vue触发a标签的点击事件直接操作dom节点的方式比较简单 &lt;button @click=&quot;handleBtnClick&quot;&gt;点击按钮&...

vue3 ref的使用多个ref的使用。通过ref触发点击事件

多个ref获取的方法可以使用一样的,通过变量名来区分就行了 const vabUploadRef = ref() const multipleTableRef = ref() ...

vue elementuivue3 element plus 文件上传的时候设置其他参数。后台.net接收传递的额外参数。图片上传

比如上传文件的时候额外传递两个select选择的值 前台前面上传文件的时候要提供默认参数很简单,el-upload绑定一个data即可...

vuevue3 打开新页面页面跳转。vue跳转到一个新页面。vue路由传参vue3路由传参vue3 获取路由参数

[TOC]VUE页面跳转本地页面跳转 goApplicationCenter() { //进行页面跳转 let path = &quot;/application-center&quo...

vuevue3组件封装vue组件模板。简单组件模板。基础组件模板。vue引入自定义的组件。vue使用自定义的组件。插槽slot使用。vue封装格子效果一块一块的grid布局效果

[TOC]vue封装组件的简单模板贴一个简单模板方便自定义组件的时候直接复制 &lt;template&gt; &lt;div class=&quot;app...

.net6 Signalr+vue3 的运用(上)

.net6 Signalr+Vue3 的运用(上)[TOC] 什么是 SignalR?ASP.NET Core SignalR 是一个开放源代码库,可用于简化向应用添加...

.net6 Signalr+vue3 的运用(下)

.net6 Signalr+Vue3 的运用(下)[TOC] 上篇链接:https://www.tnblog.net/hb/article/details/7961SignalR 中的用户 Sig...

.net6 Signalr+vue3 配合Ingress Nginx的运用

.net6 Signalr+Vue3 配合Ingress Nginx的运用[TOC] 结合上篇:https://www.tnblog.net/hb/article/details/7963 项目打...

vue3 Element Plus 表格使用vue3常用界面搭配。vue3基础模板使用

一个简单的表格加时间搜索界面效果如下: 代码如下: &lt;template&gt; &lt;div class=&quot;app-container&quot;&g...

vue3 如何加prototype。vue3使用globalProperties

在2.X版本中创建一个vue 实例是通过 new Vue()来实现的,到了3.X中则是通过使用createApp这个 API返回一个应用实例,并且可...
吃亏决不亏,惜福才有福
排名
12
文章
74
粉丝
4
评论
15
ASP.NET中webform中的几个生命周期函数
修心 : 什么周期除了这些还有什么呢
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
记得当时年纪小,你爱卖萌我爱笑。