美文网首页
西瓜播放器xgplayer在乾坤子应用中使用截图时window报

西瓜播放器xgplayer在乾坤子应用中使用截图时window报

作者: yunshengz | 来源:发表于2023-08-21 14:53 被阅读0次

    出现报错的原因是xgplayer截图时要用到window对象,而在乾坤子应用中找不到window,因此会报错

    解决思路

    使用xgplayer提供的自定义插件,和原始截图功能代码(规避掉window)结合,开发一个截图功能。
    功能开发前置能力

    自定义截图插件代码参考

    import { Plugin } from 'xgplayer'
    const { POSITIONS } = Plugin
    
    export default class demoPlugin extends Plugin {
      // 插件的名称,将作为插件实例的唯一key值
      static get pluginName() {
        return 'shootImg'
      }
    
      static get defaultConfig () {
          return {
            // 挂载在controls的右侧,如果不指定则默认挂载在播放器根节点上
            position: POSITIONS.CONTROLS_RIGHT,
            index: 7
          }
      }
    
      constructor (args) {
        super(args)
      }
    
      beforePlayerInit () {
       // TODO 播放器调用start初始化播放源之前的逻辑
      }
    
      afterPlayerInit () {
        // TODO 播放器调用start初始化播放源之后的逻辑
      }
    
      afterCreate () {
        const { player } = this
        const screenShotOptions = { ...player.config.screenShot, fileName: '视频截图' }
        let callBack = null
        player.video.setAttribute('crossOrigin', 'anonymous')
        let encoderOptions = 0.92
        if (screenShotOptions.quality || screenShotOptions.quality === 0) {
          encoderOptions = screenShotOptions.quality
        }
        const type = screenShotOptions.type === undefined ? 'image/png' : screenShotOptions.type
        const format = screenShotOptions.format === undefined ? '.png' : screenShotOptions.format
        const canvas = document.createElement('canvas')
        const canvasCtx = canvas.getContext('2d')
        const img = new Image()
        canvas.width = this.config.width || 600
        canvas.height = this.config.height || 337.5
        const saveScreenShot = function (data, filename) {
          const saveLink = document.createElement('a')
          saveLink.href = data
          saveLink.download = filename
          const event = document.createEvent('MouseEvents')
          /************Document.defaultView替换window******************/
          event.initMouseEvent('click', true, false, Document.defaultView, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
          saveLink.dispatchEvent(event)
        }
        player.screenShot = function (save = true) {
          save = screenShotOptions.saveImg === undefined ? save : screenShotOptions.saveImg
          canvas.width = player.video.videoWidth || 600
          canvas.height = player.video.videoHeight || 337.5
          callBack = screenShotOptions.callBack
          img.onload = (function () {
            canvasCtx.drawImage(player.video, 0, 0, canvas.width, canvas.height)
            img.src = canvas.toDataURL(type, encoderOptions).replace(type, 'image/octet-stream')
            const screenShotImg = img.src.replace(/^data:image\/[^;]+/, 'data:application/octet-stream')
            const saveFileName = screenShotOptions.fileName || player.lang.SCREENSHOT
            player.emit('screenShot', screenShotImg)
            if (save && callBack) {
              callBack(screenShotImg, saveFileName, format)
            } else {
              save && saveScreenShot(screenShotImg, saveFileName + format)
            }
          })()
        }
    
        this.onClick = () => {
          console.log('当前插件根节点点击事件')
          console.log('this.player', this.player)
          player.screenShot()
        }
    
        // 对当前插件根节点绑定click事件
        this.bind('click', this.onClick)
        // TODO 插件实例化之后的一些逻辑
      }
    
      destroy () {
        this.unbind('click', this.onClick)
        // 播放器销毁的时候一些逻辑
      }
    
      render () {
        return `<div class="xg-options-icon show player-shoot-img-plugin">
                  <div class="xgplayer-icon btn-text">
                    <span class="icon-text">截图</span>
                  </div>
                </div>`
      }
    }
    
    

    相关文章

      网友评论

          本文标题:西瓜播放器xgplayer在乾坤子应用中使用截图时window报

          本文链接:https://www.haomeiwen.com/subject/ucxymdtx.html