VUE2中使用阿里云播放器AliPlayer

news2024/11/26 21:43:37

简述

基于 Vue 的播放器单页应用, 利用 web 播放器 sdk 进行视频点播,包含播放列表、字幕、多语言、自适应码率,皮肤自定义等功能 Web播放器文档

已知问题

  • vue中使用截图,不太好使【已自行优化】
  • 无键盘快捷键,无法通过空格暂停播放【已自行优化】
  • 无法双击全屏【已自行优化】
  • 没有提供直接更改主题色的方式,但自己可以通过CSS更改(莫得必要)【已自行优化】

前情提示

系统:

一说

  • 部分截图、链接等因过期、更换域名、MD语法等可能不显示,可联系反馈(备注好博文地址),谢谢❤
  • 带有#号、删除线、不操作、不执行字样的为提示或者备份bash,实际不执行
  • 如果无法下载、无法复制,请评论后留言即可。收到消息后会第一时间回复~
  • 知识付费,1对1技术支持:开放技术支持 | 需求墙 · 语雀

有账号的朋友,可以点个赞或者评论两句哦,评论后会获得积分奖励~

官网文档:Web播放器快速接入_视频点播-阿里云帮助中心

其他

解决思路:直接iframe等方式内嵌HTML写法的播放器即可。

示例代码

<template>
  <page-header-wrapper>
    <a-card :bordered="false">
      <a-divider>MP4录播</a-divider>
      <div style="width:100%;">
      </div>
      <div class="prism-player" id="player-con"></div>
    </a-card>
  </page-header-wrapper>
</template>

<script>
import { tableMixin } from '@/store/table-mixin'
import {videoList} from './js/testVideoList'
export default {
  name: 'Qrcode',
  components: {
  },
  mixins: [tableMixin],
  data () {
    return {
      videoList: videoList,
      player: null,
      playingVideo: {},
      loadingColor: ['#276cb3', '#f2ac1a', '#28130e', '#229849', '#db2344'],
      videoLoading: true,
      fullScreen: false,
    }
  },
  filters: {
  },
  created () {
    console.log('created')
  },
  mounted () {
    console.log('mounted')
    const url = 'https://cesium.com/public/SandcastleSampleData/big-buck-bunny_trailer.mp4'
    const poster = 'https://tcplayer-1306264703.cos.ap-nanjing.myqcloud.com/picture/poster.png'
    // this.createDemoPlayer(this.videoList[0].source, this.videoList[0].CoverURL)
    this.createDemoPlayer(url, poster)
    // this.playingVideo = videoList[0]
    this.videoLoading = false

  },
  computed: {

  },
  watch: {
  },
  methods: {
    playVideo(video) {
      if (this.player === null || this.playingVideo.VideoId === video.VideoId) {
        return
      }
      this.player.loadByUrl(video.source)
      this.playingVideo = video

    },
    createDemoPlayer(source, cover) {
      if (document.getElementById('player-con') === null) {
        const playerDomWrap = this.$refs.playerTemp
        const playerDom = document.createElement('div')
        playerDom.setAttribute('id', 'player-con')
        playerDomWrap.appendChild(playerDom)
      }

      const props = {
        id: 'player-con',
        width: '100%',
        height: '485px',
        language: 'zh-cn',
        source: source,
        isLive: false,
        cover: cover,
        'autoplay': false,
        'rePlay': false,
        'playsinline': true,
        'keyShortCuts': true,
        'preload': true,
        'controlBarVisibility': 'hover',
        'useH5Prism': true,
        'extraInfo': {
          'crossOrigin': 'anonymous'
        },
        components: [{
          name: 'StartADComponent',
          type: AliPlayerComponent.StartADComponent,
          args: ['https://img.alicdn.com/tfs/TB1byi8afDH8KJjy1XcXXcpdXXa-1920-514.jpg', 'https://promotion.aliyun.com/ntms/act/videoai.html', 3]
        }, {
          name: 'PauseADComponent',
          type: AliPlayerComponent.PauseADComponent,
          args: ['https://img.alicdn.com/tfs/TB1byi8afDH8KJjy1XcXXcpdXXa-1920-514.jpg', 'https://promotion.aliyun.com/ntms/act/videoai.html']
        }],
        snapshotWatermark:{
          left:'100',
          top:'100',
          text:'Powered By PUSDN',
          font:'italic bold 12px 宋体',
          strokeColor:'gray',
          fillColor:'gray'
        },
        'skinLayout': [
          {
            'name': 'bigPlayButton',
            'align': 'cc'
          },
          {
            'name': 'H5Loading',
            'align': 'cc'
          },
          {
            'name': 'errorDisplay',
            'align': 'tlabs',
            'x': 0,
            'y': 0
          },
          {
            'name': 'infoDisplay'
          },
          {
            'name': 'tooltip',
            'align': 'blabs',
            'x': 0,
            'y': 56
          },
          {
            'name': 'thumbnail'
          },
          {
            'name': 'controlBar',
            'align': 'blabs',
            'x': 0,
            'y': 0,
            'children': [
              {
                'name': 'progress',
                'align': 'blabs',
                'x': 0,
                'y': 44
              },
              {
                'name': 'playButton',
                'align': 'tl',
                'x': 15,
                'y': 12
              },
              {
                'name': 'timeDisplay',
                'align': 'tl',
                'x': 10,
                'y': 7
              },
              {
                'name': 'fullScreenButton',
                'align': 'tr',
                'x': 10,
                'y': 12
              },
              {
                'name': 'subtitle',
                'align': 'tr',
                'x': 15,
                'y': 12
              },
              {
                'name': 'setting',
                'align': 'tr',
                'x': 15,
                'y': 12
              },
              {
                'name': 'volume',
                'align': 'tr',
                'x': 5,
                'y': 10
              },
              {
                'name': 'snapshot',
                'align': 'tr',
                'x': 10,
                'y': 12
              }
            ]
          }
        ]

      }
      // this.player = new Aliplayer(props)
      // this.player.on('requestFullScreen', this.fullScreenHandle)
      // this.player.on('cancelFullScreen', this.cancelFullScreenHandel)
      this.player = new Aliplayer(props, (player) => {
        console.log('播放器初始化完成', player)

        // 添加截图事件监听器
        player.on('snapshoted', (data) => {
          console.log('截图完成', data)
          this.handleSnapshot(data)
        })
      })
      let clicked = false
      this.player.tag.addEventListener('click', ()=>{
        console.log(this.player.getStatus())
          if (!clicked) {
            setTimeout(() => {
              // 如果在一定时间内没有发生双击事件,执行单击事件逻辑
              if (!clicked) {
                console.log(this.player.getStatus())
                if (this.player.getStatus() === 'pause') {
                  this.player.play()
                } else {
                  this.player.pause()
                }
              }
              clicked = false // 重置状态
            }, 300) // 设置一个合适的时间间隔
          }
      })
      this.player.tag.addEventListener('dblclick', ()=>{
        clicked = true // 表示已经发生了双击事件
        const service = this.player.fullscreenService
        if(service.getIsFullScreen())
        {
          service.cancelFullScreen()
        } else {
          service.requestFullScreen()
        }
      })
      // this.player.on('snapshoted', (data) => {
      //   console.log('截图完成', data)
      //   var pictureData = data.paramData.base64
      //   var downloadElement = document.createElement('a')
      //   downloadElement.setAttribute('href', pictureData)
      //   var fileName = 'Aliplayer' + Date.now() + '.png'
      //   downloadElement.setAttribute('download', fileName)
      //   downloadElement.click()
      //   pictureData = null
      // })

    },
    playNextVideo() {
      const videoList = this.videoList
      const index = videoList.findIndex(item => item.VideoId === this.playingVideo.VideoId)
      if (index === -1 || index === videoList.length - 1) {
        // this.player.getComponent('playerTipComponent').fadeOutTip()
        return
      }
      this.playVideo(videoList[index + 1])
    },
    fullScreenHandle() {
      const title = this.playingVideo.Title
      this.player.getComponent('playerFullScreenTitle').fullScreenHandle(title)
      this.fullScreen = true
    },
    cancelFullScreenHandel() {
      // this.player.getComponent('playerFullScreenTitle').cancelFullScreenHandle()
      this.fullScreen = false
    },
    handleSnapshot2 (data) {
      var canvas = document.createElement('canvas'),
        video = this.player.tag
        canvas.width =video.videoWidth,//视频原有尺寸
        canvas.height = video.videoHeight//视频原有尺寸
      var ctx = canvas.getContext('2d')
      ctx.save()
//判断用户是否对视频做过镜像
      var image = this.player.getImage()
      if(image == 'vertical')//垂直镜像
      {
        ctx.translate(0,canvas.height)
        ctx.scale(1, -1)
      }
      else if(image == 'horizon')//水平镜像
      {
        ctx.translate(canvas.width, 0)
        ctx.scale(-1, 1)
      }
//视频的当前画面渲染到画布上
      ctx.drawImage(video, 0, 0, canvas.width, canvas.height)
      ctx.restore()
    },
    handleSnapshot(data) {
      console.log('截图完成', data)
      var pictureData = data.paramData.base64
      var downloadElement = document.createElement('a')
      downloadElement.setAttribute('href', pictureData)
      var fileName = 'Pusdn_' + Date.now() + '.png'
      downloadElement.setAttribute('download', fileName)
      downloadElement.click()
      pictureData = null
    },

  }
}
</script>
<style scoped>

</style>

修改皮肤

Web播放器SDK的进阶功能_视频点播-阿里云帮助中心

    .prism-player .prism-liveshift-progress .prism-progress-played, .prism-player .prism-progress .prism-progress-played {
      position: absolute;
      top: 0;
      left: 0;
      width: 0;
      height: 100%;
      background-color: #f00;
    }

额外

https://github.com/aliyunvideo/AliyunPlayer_Web/blob/master/H5VodVueDemo/README.zh_CN.md

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1267264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣:184. 部门工资最高的员工(Python3)

题目&#xff1a; 表&#xff1a; Employee ----------------------- | 列名 | 类型 | ----------------------- | id | int | | name | varchar | | salary | int | | departmentId | int | ----------------------- 在 SQL …

人工智能原理复习--知识表示(二)

文章目录 上一篇产生式表示法推理方式 结构化表示语义网络语义网络表示知识的方法和步骤应用题目 框架表示法下一篇 上一篇 人工智能原理复习–知识表示&#xff08;一&#xff09; 产生式表示法 把推理和行为的过程用产生式规则表示&#xff0c;所以又称基于规则的系统。 产…

9.二维数组——打印出杨辉三角形(要求打印出10行)

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为二维数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 打印出杨辉三角形&#xff08;要求打印出10行&#xff09;。 二、题目分析 三、解题 程序运行代码 #include<s…

基于SpringCloud的动漫论坛

基于SpringCloud的动漫论坛《BOKI》 摘要&#xff1a;鉴于现如今的互联网网站的存在形式&#xff0c;网站内部有可能内嵌论坛&#xff0c;因此&#xff0c;该项目中实现一个整体的、可移植性强的插件式论坛&#xff0c;论坛就有可能突破ACG主题的限制&#xff0c;实现论坛与主…

亚马逊发布人工智能助手Amazon Q,一起来看看有什么功能

Amazon 在11.28日Re:Invent大会上推出人工智能助手Amazon Q&#xff0c;主要面向企业客户&#xff0c;提供个性化服务。号称是专为工作定制的生成式人工智能助手。Your generative Al-powered assistant tailored for work 核心能力企业知识库&#xff1a;为客户提供快速、相关…

YOLOv8独家原创改进:自研独家创新MSAM注意力,通道注意力升级,魔改CBAM

💡💡💡本文自研创新改进:MSAM(CBAM升级版):通道注意力具备多尺度性能,多分支深度卷积更好的提取多尺度特征,最后高效结合空间注意力 1)作为注意力MSAM使用; 推荐指数:五星 MSCA | 亲测在多个数据集能够实现涨点,对标CBAM。 在道路缺陷检测任务中,原始ma…

oracle官方的反解析工具:javap详解

1、解析字节码的作用 通过反编译生成的字节码文件&#xff0c;我们可以深入的了解java代码的工作机制。但是&#xff0c;自己分析类文件结构太麻烦了&#xff01;除了使用第三方的jclasslib工具之外&#xff0c;oracle官方也提供了工具&#xff1a;javap javap是jdk自带的反解…

laraval6.0 GatewayWorker 交互通信

laravel 6.0 GatewayWorker 通讯 开发前准备下载 GatewayWorker 及操作方式前端demo测试效果项目中安装GatewayClient开发前准备 GatewayClient 官网:https://www.workerman.net/ 当前使用的是宝塔操作 下载 GatewayWorker 及操作方式 前端demo 测试效果 项目中安装GatewayC…

Windows快速找到软件的exe文件路径

Windows快速找到软件的exe文件路径 你是否有如下困惑&#xff1a; 经常忘记软件的默认安装路径忘记了软件自定义的安装路径 以至于无法找到软件启动的可执行程序exe文件&#xff1f; 实际中&#xff0c;在Windows系统中使用pywinauto时经常需要去寻找软件启动的可执行文件ex…

从零开始的c语言日记day38——数组参数,指针参数

一维数组传参 要把数组或者指针传给函数&#xff0c;那函数参数如何设计&#xff1f; 上面各写法有问题嘛&#xff1f; 第一个没问题 第二个没问题 第三个没问题 第四个没问题 第五个解析&#xff1a;定义int*arr2[20]为20个int*类型的数组&#xff0c;test2之后用的是ar…

python项目报错

解决办法&#xff1a;不要用配置的镜像脚本&#xff0c;直接用此命令 pip install pandas -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com

Vue拖拽div移动位置

<div id"TestDiv" mousedown"OnMouseDown"></div> css #TestDiv { position: absolute;left: 50%;top: 50%;width: 100px;height: 100px;z-index: 999;background-color: red; } 处理函数 const OnMouseDown(e:any)> {let videoBox:any…

【工具使用-Audition】如何使用Auditon生成直流信号

一&#xff0c;简介 在工作的过程中需要生成直流信号&#xff0c;测试验证使用。本文主要介绍如何使用Audition生成指定长度的直流信号。 二&#xff0c;操作步骤 这里以Audition 2020&#xff0c;生成一个10s的-6db幅值的立体声文件为例进行介绍。 2.1 新建音频文件&#…

JavaScript值和引用

前端面试大全JavaScript值和引用 &#x1f31f;经典真题 &#x1f31f;值和引用相关内容 1. 简单值&#xff08;原始值&#xff09; 2. 复杂值&#xff08;引用值&#xff09; 3. 访问方式 4. 比较方式 5. 动态属性 6. 变量赋值 &#x1f31f;真题解答 &#x1f31f;…

shell脚本完成内容筛选并下载

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

JS 倒计时方法(可改造)

起因&#xff1a; 写好备用。 代码&#xff1a; // 直接把方法写在了原型上&#xff0c;通过原型调用 /*** 倒计时* time_str String 到期时间(2023-11-28 16:50:00)* dom_obj Object 需要显示的倒计时的dom对象*/ Date.prototype.countdown function (time_str, dom_obj…

2021年2月24日 Go生态洞察:Contexts和Structs的深度解析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

数字图像处理(实践篇)十三 数据增强之给图像添加噪声!

目录 一 涉及的函数 二 实践 一 涉及的函数 skimage.util.random_noise( ) skimage.util.random_noise(image, modegaussian, seedNone, clipTrue, **kwargs) 函数的功能&#xff1a;为浮点型图片添加各种随机噪声。 输入&#xff1a; ①image&#xff1a;输入图像&…

数据结构第五课 -----二叉树的代码实现

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

代码混淆的原理和方法详解

代码混淆的原理和方法详解摘要移动App的广泛使用带来了安全隐患&#xff0c;为了保护个人信息和数据安全&#xff0c;开发人员通常会采用代码混淆技术。本文将详细介绍代码混淆的原理和方法&#xff0c;并探讨其在移动应用开发中的重要性。 引言随着移动应用的普及&#xff0c;…