vue 视频截屏

video播放视频,一键截屏功能实现(2种方式)

1.canvas

<template>
 <div class="hik-box">
    <canvas style="display:none;width:200px;height:200px" id="myCanvas"></canvas>
    <video width="200" height="200" controls id="videos">
       <source src="./movie.mp4" type="video/mp4">
    </video>
    <el-button class="btns" @click="screenShot">一键截屏</el-button>
  </div>
</template>
<script>
 
export default{
 
    data(){
        return{
        }
    },
    methods:{
        screenShot () {
          let video = document.getElementById('videos')
          let canvas = document.getElementById('myCanvas')
          // canvas.width = video.width
          // canvas.height = video.height
          let ctx = canvas.getContext('2d')
          // 处理toDataURL遇跨域资源导致的报错
          // ctx.drawImage(video, 0, 0, video.width, video.height) 或
          ctx.drawImage(video, 0, 0, 350, 300)
          var imgbase64 = canvas.toDataURL('image/png')
          if (imgbase64) this.baseToFile(imgbase64)
        }
    },
}
</script>
<style scoped>
    
</style>

2.html2canvas

1.下载html2canvas

npm i html2canvas --save

2.页面引入

<template>
 <div class="hik-box">
    <video width="200" height="200" controls id="videos">
       <source src="./movie.mp4" type="video/mp4">
    </video>
    <el-button class="btns" @click="screenShot">一键截屏</el-button>
  </div>
</template>

<script>
import html2canvas from 'html2canvas'
export default{
 
    data(){
        return{
        }
    },
    methods:{
        // 截屏
        screenShot () {
          let video = document.getElementById('videos')
          let canvas = document.getElementById('myCanvas')
          html2canvas(video, { 
            allowTaint: true,
            useCORS: true
          }).then((canvas) => {
            // base64
            const capture = canvas.toDataURL('image/png')
            // 下载方法1,浏览器弹出下载文件提示
            const saveInfo = {
              // 导出文件格式自己定义
              'download': '文件名' + '.png',
              'href': capture
            }
            const element = document.createElement('a')
            element.style.display = 'none'
            for (const key in saveInfo) {
              element.setAttribute(key, saveInfo[key])
            }
            document.body.appendChild(element)
            element.click()
            setTimeout(() => {
              document.body.removeChild(element)
            }, 300)

            // this.downFile(capture) 下载方法2
        },
        // 下载方法2
        downFile(base){
          const base64List = base.split(',')[1]
          const raw = window.atob(base64List)
          const rawLength = raw.length
          const uInt8Array = new Uint8Array(rawLength)
          for (let i = 0; i < rawLength; ++i) {
            uInt8Array[i] = raw.charCodeAt(i)
          }
          // 下载到本地
          const fileName = this.fileName || '截屏' + '.png'
          const aLink = document.createElement('a')
          const evt = document.createEvent('HTMLEvents')
          evt.initEvent('click', true, true)
          aLink.download = fileName
          aLink.href = URL.createObjectURL(blob)
          aLink.click()

        },
        // 接口上传
        uploadFile(){
          // 若需上传,将base64转为file文件
          const blob = new Blob([uInt8Array], { type: 'image/png' })
          let fileOfBlob = new File([blob], '文件名' + '.png')}
          var formData = new FormData()
          formData.append('file', fileOfBlob)
          // 接口上传
          download(file).then(res => {
            // res,dosomething
          })
        }
    }
</script>
<style scoped>
</style>

3.tips

<1> video引入的视频地址要保证不跨域,这样才可以成功有图片,不然会出现报错toDataURL的相关报错

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值