video 利用canvas截取帧数作为视频封面 视频小可以截取 视频过大产生跨域问题

video 利用canvas截取帧数作为视频封面 视频小可以截取 视频过大产生跨域问题

控制台报错如下:

在这里插入图片描述

代码如下

<div>
   <a-upload name="icon" :customRequest="customRequest" class="avatar-uploader" :show-upload-list="false" :before-upload="beforeUpload">
     <video controls style="height:80px" v-if="file && fileType === 'video'" :src="file" :poster="coverImg" />
     <img v-else-if="file && fileType === 'image'" :src="file" alt />
     <div v-else>
       <a-icon type="plus" />
     </div>
   </a-upload>
   <span v-show="percent == 0 || percent == 100" >{{uploadTip}}</span>
   <a-progress :percent="percent" v-show="percent !== 100 &&  percent !== 0" />
 </div>
 
 
  // 主要方法  视频上传成功后的回调
   getVideoBase64(url) {
     return new Promise(function (resolve, reject) {
       let video = document.createElement('video')
       video.setAttribute('crossOrigin', 'anonymous') //处理跨域
       video.setAttribute('src', url)
       video.setAttribute('style', 'object-fill:contains')
       video.setAttribute('preload', 'auto')
       video.addEventListener('loadeddata', function () {
         video.play()
         // 我这里是截取的视频的第5秒的帧数 所以给了一个延迟器
         let timer = setTimeout(() => {
           let canvas = document.createElement('canvas')
           const ctx = canvas.getContext('2d')
           let width = (canvas.width = 240)
           let height = (canvas.height = 400)
           const vWidth = video.videoWidth
           const vHeight = video.videoHeight

           let proportion = 240 / 400,
             x1,y1,x2,y2;

           if (vWidth > vHeight) {
             let scaleWidth = vHeight * proportion
             x1 = (video.videoWidth - scaleWidth) / 2
             y1 = 0
             x2 = scaleWidth
             y2 = vHeight
             ctx.drawImage(video, x1, 0, (width / height) * vHeight, vHeight, 0, 0, 240, 400) //绘制视频
           } else {
             ctx.drawImage(video, 0, 0, vWidth, vHeight, 0, 0, 240, 400) //绘制视频
           }
           // 绘制图片 打印base64
           console.log(canvas.toDataURL('image/jpeg'), 'this.coverUrl')
           canvas.toBlob((blob) => {
             resolve(new File([blob], 'thumb__img.png'))
           }, 'image/png')

           clearTimeout(timer)
         }, 5000)
       })
     })
   },

产生原因

获取到video标签后 属性没有被挂载上去 video.setAttribute(‘crossOrigin’, ‘anonymous’)
小一点的视频是可以截到的,视频超过50m就会报跨域的问题

参考:
在这里插入图片描述

思考

当时特别奇怪,视频大小为什么会造成跨域问题,后来发现利用canvas会出现很多安全问题,从而污染画布

在 Chrome 13 的 WebGL 中使用跨源图片/视频

解决方案

可以把crossorigin="anonymous"属性直接加在video标签里面 这样大视频也可以上传了
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 悬停时长设置_audio、videocanvas 对于audio和video,可以使用HTML5中的`title`属性来设置悬停时长,例如: ```html <audio controls title="悬停时长为10秒"> <source src="audio.mp3" type="audio/mpeg"> </audio> <video controls title="悬停时长为20秒"> <source src="video.mp4" type="video/mp4"> </video> ``` 对于canvas,你可以使用`title`属性或者使用JavaScript中的`setTimeout`函来设置悬停时长,例如: ```html <canvas id="myCanvas" width="200" height="200" title="悬停时长为5秒"></canvas> <script> setTimeout(function() { document.getElementById("myCanvas").title = "悬停时长为10秒"; }, 5000); </script> ``` 2. 截取视频设置封面截取某个时间画面 要截取视频的某个时间画面作为封面,可以使用HTML5中的`poster`属性,例如: ```html <video controls poster="cover.jpg"> <source src="video.mp4" type="video/mp4"> </video> ``` 如果要截取视频的某个时间画面,可以使用JavaScript中的`canvas`元素和`drawImage`方法,例如: ```html <video controls id="myVideo"> <source src="video.mp4" type="video/mp4"> </video> <canvas id="myCanvas" width="200" height="200"></canvas> <script> var video = document.getElementById("myVideo"); var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); video.addEventListener("timeupdate", function() { ctx.drawImage(video, 0, 0, canvas.width, canvas.height); }); </script> ``` 这个例子会在canvas上实时绘制视频当前时间的画面。 3. 根据鼠标实时更新视频封面 要根据鼠标实时更新视频封面,可以使用JavaScript中的`mousemove`事件和`canvas`元素和`drawImage`方法,例如: ```html <video controls id="myVideo"> <source src="video.mp4" type="video/mp4"> </video> <canvas id="myCanvas" width="200" height="200"></canvas> <script> var video = document.getElementById("myVideo"); var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); canvas.addEventListener("mousemove", function(e) { var rect = canvas.getBoundingClientRect(); var x = e.clientX - rect.left; var y = e.clientY - rect.top; var w = canvas.width; var h = canvas.height; ctx.drawImage(video, 0, 0, w, h); ctx.fillStyle = "rgba(0, 0, 0, 0.5)"; ctx.fillRect(0, 0, w, h); ctx.drawImage(video, x - 50, y - 50, 100, 100, 0, 0, w, h); }); </script> ``` 这个例子会在canvas上绘制视频当前时间的画面,并在鼠标位置处显示一个100x100的区域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值