# 播放器 JavaScript SDK

当前SDK支持播放视频音频Word/PDF文档静态PPT动画PPT 5种类型的资源播放。

# 安装

# <script>异步引入

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>气球云资源播放 Demo</title>
  <script type="text/javascript">
    (function (url) {
      window.QiQiuYun || (window.QiQiuYun = {});
      var firstScriptTag = document.getElementsByTagName('script')[0];
      var script = document.createElement('script');
      // url 中加入了 时间戳参数是为了确保能获取最新的SDK
      script.src = url + '?' + ~~(Date.now() / 1000 / 60);
      firstScriptTag.parentNode.insertBefore(script, firstScriptTag);
    })('//service-cdn.qiqiuyun.net/js-sdk-v2/sdk-v1.js');
  </script>
</head>
<body>
<!-- 用于初始化的DOM节点 -->
<div id="cloud-player"></div>
<script type="text/javascript">
  // 由于是异步载入script需要注册回调函数
  QiQiuYun.onPlayerSDKReady = function (SDK) {
    var player = new QiQiuYun.Player({
      id: 'cloud-player',  // 用于初始化的DOM节点ID
      resNo: '<resource no>', // 播放资源编号
      token: '<token>' // 播放令牌由后端SDK生成
    });
  }
</script>
</body>
</html>

# 使用load-script引入(适用于vue)

import load from 'load-script';

// url 中加入了 时间戳参数是为了确保能获取最新的SDK
load('//service-cdn.qiqiuyun.net/js-sdk-v2/sdk-v1.js?' + ~~(Date.now() / 1000 / 60), (err) => {
  if (err) {
    throw err;
  }
  new window.QiQiuYun.Player({
    id: 'cloud-player',  // 用于初始化的DOM节点ID
    resNo: '<resource no>', // 播放资源编号
    token: '<token>', // 播放令牌由后端SDK生成
  });
});

# 资源对应播放器

播放器类型 可播放资源 UseType(播放器中使用的type)
音频播放器 音频 audio
视频播放器 视频 video
图片播放器 图片 图片化文档/PPT ppt-img
文档播放器 PDF Word Excel doc

# API

# Attributes

# 通用参数

适用于所有资源类型

参数 说明 类型 是否必须 默认值
id 页面中用于初始化播放器的DOM元素的ID string -
resNo 云资源唯一编号 string -
token 云资源播放令牌 string -
disableControlBar 隐藏控制条 boolean false
user 观看资源的用户信息{id, name} object {}

# 视频播放器参数(video-player)

参数 说明 类型 是否必须 默认值
rememberLastPos 设置是否跳转至上次观看位置继续 boolean -
initPos 设置资源播放的初始位置,单位s number undefined
autoplay 播放器初始化完成后是否自动播放
(根据《浏览器相关限制》 (opens new window)用户须手动触发)
boolean false
poster 资源封面图片 string undefined
watermark 水印{file, pos, width, height} object {}
fingerprint 指纹{html, duration, frequency} object {}
textTrack 字幕 Array<TextTrackItem> undefined
playbackRates 倍速播放,每一项即为倍速参数 Array<Number | Float> undefined
controlBar 控制条参数 object {}
hideControlBarTime 无动作延迟隐藏控制条,单位ms
(设置为0表示永不隐藏)
number 2000
disableSeek 禁止跳转,可选值forward backward none enum none
disableHotkeys 禁用键盘热键控制 boolean false
defaultPlaybackRate 默认倍速(仅能设置 playbackRates 参数中有的倍速) number 1
translation 自定义语言(播放器默认根据浏览器语言自动调整) object {}
exam 弹题 object {}

# 图片播放器参数(img-player)

同时也是ppt图片模式播放器

参数 说明 类型 是否必须 默认值
rememberLastPos 设置是否跳转至上次观看位置继续 boolean -
initPos 设置资源播放的初始位置,单位 number undefined
pageLimit 播放页数限制(试看功能),单位
(设置0表示不限制)
number 0

# 文档播放器参数(doc-player)

参数 说明 类型 是否必须 默认值
rememberLastPos 设置是否跳转至上次观看位置继续 boolean -
initPos 设置资源播放的初始位置,单位 number undefined
pageLimit 播放页数限制(试看功能),单位
(设置0表示不限制)
number 0
# PPT播放器参数(slide-player)
参数 说明 类型 是否必须 默认值
rememberLastPos 设置是否跳转至上次观看位置继续 boolean -
initPos 设置资源播放的初始位置,单位 number undefined
pageLimit 播放页数限制(试看功能),单位
(设置0表示不限制)
number 0

# Events

可通过 player.on(String: eventName, Function: callback) 方法可监听事件。 例如:

player.on('eventName', function(event) {
  console.log(event);
  // 通用数据信息
  /*{
    canPlayType: ['img', 'slide'],  // 当前资源可播放类型,按播放优先级从高至低排列
    playerType: 'img',                // 当前播放器类型
    metas: {                       // 当前play接口获取的信息
      args: {
        image: [],
        animation: {}
      }
    },
    resNo: 'resourseNo',          // 云资源唯一编号
  }*/
})

# 通用事件

事件名 说明 回调参数
resourceError 当获取资源异常时 error: 错误相关信息
ready 播放器实例化完成 event: 通用信息
end 播放到末尾时 event: 通用信息

# 视频播放器(video-player)

事件名 说明 回调参数
timeupdate 每个xx毫秒触发 event: {timestamp: 当前时间, duration: 总时长}
play 开始播放时触发 event: 通用信息
pause 暂停播放时触发 event: 通用信息
ratechange 当倍速改变时触发 event: {rate: 当前倍速}

# 图片播放器(img-player)

事件名 说明 回调参数
pagechanged 页面发生变化时触发 event: {page: 当前页码, total: 总页数}

# 文档播放器(doc-player)

事件名 说明 回调参数
pagechanged 页面发生变化时触发 event: {page: 当前页码, total: 总页数}

# PPT播放器(slide-player)

事件名 说明 回调参数
pagechanged 页面发生变化时触发 event: {page: 当前页码, total: 总页数}

# Methods

# 通用方法

方法名 说明 返回值
destory() 销毁播放器实例 -
requestFullscreen() 已废弃 进入全屏 -

# 视频播放器(video-player)

方法名 说明 返回值
play() 开始播放,受到《非用户手动播放限制》 (opens new window) -
pause() 暂停播放 -
getCurrentTime() 获取当前播放时间 当前播放时间,单位ms
setCurrentTime(time: number(单位: ms)) 设置当前播放时间 当前播放时间,单位ms
setExam(exam: object) 设置弹题 -
openModal(options: object) 打开模态框 -
closeModal() 关闭模态框 -
setControlOptions(controlOptions: object) 调整控制条配置 -
setPlaybackRate(rate: number) 控制倍速 -
setNightMode() 夜间模式 -

# 图片播放器(img-player)

方法名 说明 返回值
prevPage() 上一页 -
nextPage() 下一页 -
setCurrentPage(page: number) 设置当前播放页码 -

# 文档播放器(doc-player)

方法名 说明 返回值
prevPage() 上一页 -
nextPage() 下一页 -
setCurrentPage(page: number) 设置当前播放页码 -

# PPT播放器(slide-player)

方法名 说明 返回值
prevPage() 上一页 -
nextPage() 下一页 -
setCurrentPage(page: number) 设置当前播放页码 -
prevStep() 播放上一个动画效果 -
nextStep() 播放下一个动画效果 -

#

# 代码演示

# 属性配置

# 禁止跳转(disableSeek)

const player = new QiQiuYun.Player({
  disableSeek: 'backwoard'
})

disableSeek枚举类型

类型 描述
forward 禁用前跳,即时间线增长方向跳跃
backward 禁用后跳,即时间线减小方向跳跃
none 取消禁用跳转

# 视频水印(watermark)

const player = new QiQiuYun.Player({
  watermark: {
    file: 'http://www.example.com/watermark.png',
    pos: 'top.right',
  }
})
参数 类型 描述
file String 水印文件资源地址
pos Enum 水印放置位置,默认值: top.left,可选: top.left, top.right, bottom.right, bottom.left, center
width Number 水印容器宽度 单位: px,水印会按照原比例在限制的宽高内最大比例显示(默认水印宽150像素)
height Number 水印容器高度 单位: px,同上

# 视频指纹(fingerprint)

const player = new QiQiuYun.Player({
  fingerprint: {
    html: '<div style="color: red;font-size: 26px;">你好</div>',
    duration: 1000,
    frequency: 1000,
  }
})

fingerprint相关参数

参数 类型 描述
html String HTML 片段字符串(支持Dom元素插入)
duration Number 指纹显示持续时间,默认值: 2000(毫秒)
frequency Number 指纹显示间隔时间,默认值: 3000(毫秒)

# 视频字幕(textTrack)

const player = new QiQiuYun.Player({
  textTrack: [{
    label: '字幕一',
    src: 'http://www.example.com/text-track1.vtt',
    default: true
  }, {
    label: '字幕二',
    src: 'http://www.example.com/text-track2.vtt'
  }]
})

TextTrackItem 相关参数

参数 类型 描述
label string 字幕标签。(必传)
src string 字幕文件地址。(必传)
default boolean 是否设置为当前选中的字幕

# 倍速播放(playbackRates)

const player = new QiQiuYun.Player({
  playbackRates: [1, 1.25, 1.5]
})

# 控制条(controlBar)

const player = new QiQiuYun.Player({
  controlBar: {
    disableVolumeButton: true,
  },
})

controlBar相关参数

参数 类型 描述
disableVolumeButton boolean 隐藏音量
disablePlaybackButton boolean 隐藏回跳5秒按钮
disableResolutionSwitcher boolean 隐藏清晰度切换按钮
disableProgressBar boolean 禁用进度条拖动

# 自定义语言(translation)

const player = new QiQiuYun.Player({
    translation: {
	    // 浏览器语言环境 如: zh-CN (国内浏览器默认), en, zh-TW, uk等。
	    'zh-CN': {
	      'Play': '播放', // Play文案对应的自定义文案
	    },
	    'en': {
	      'Play': 'play', // Play文案对应的自定义文案
	    },
	  },
})

中文语言包下(zh-CN)的默认文案:

{
  "Play": "播放",
  "Pause": "暂停",
  "Current Time": "当前时间",
  "Duration Time": "时长",
  "Remaining Time": "剩余时间",
  "Stream Type": "媒体流类型",
  "LIVE": "直播",
  "Loaded": "加载完毕",
  "Progress": "进度",
  "Fullscreen": "全屏",
  "Non-Fullscreen": "退出全屏",
  "Mute": "静音",
  "Unmute": "取消静音",
  "Playback Rate": "播放码率",
  "Subtitles": "字幕",
  "subtitles off": "字幕关闭",
  "Captions": "内嵌字幕",
  "captions off": "关闭字幕",
  "Chapters": "节目段落",
  "You aborted the media playback": "视频播放被终止",
  "A network error caused the media download to fail part-way.": "网络错误导致视频下载中途失败。",
  "The media could not be loaded, either because the server or network failed or because the format is not supported.": "出了点小状况,您可以尝试联系客服...",
  "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由于视频文件损坏或是该视频使用了你的浏览器不支持的功能,播放终止。",
  "No compatible source was found for this media.": "无法找到此视频兼容的源。",
  "The media is encrypted and we do not have the keys to decrypt it.": "视频已加密,无法解密。",
  "SHD": "超清",
  "HD": "高清",
  "SD": "标清",
  "Auto": "自动"
}

# 视频弹题(exam)

const popupExam = {
  config: {
    mode: 'strict', // Enum('strict', 'middle', 'loose');弹题的模式:严格,中等,松散。
  },
  questions: [
    // 单选题
    {
      time: 5, // Int 此题目弹出的时间,单位秒
      type: 'choice', // Enum('choice', 'multiChoice', 'judge', 'completion', 'uncertainChoice'); 此题目的类型:单选,多选,判断,填空,不定项选择。
      question: '<p>中国的首都是那里?</p>', // 问题
      options: [  // 选项
        {key: 'A', val: '北京'},
        {key: 'B', val: '南京'},
        {key: 'C', val: '东京'},
        {key: 'D', val: '西京'}
      ],
      answer: ['A'], // 正确答案
      analysis: '解析', // 题目解析
      beforeAnswerTip: {
        type: 'warning',
        text: '温馨提示:每一道弹题答分都将计入该课程总分。'
      },
    },
    // 判断题
    {
      time: 20,
      type: 'judge',
      question: '中国的首都是北京',
      answer: ['T'],
      analysis: '!!!'
    },
    // 填空题
    // 一道填空题的配置。每个填空的答案可有多个,只要答对其中一个就算那个空回答正确。
    // 答案在题干中使用`[[]]`包裹,多个答案之间采用`|`分割。
    {
      time: 25,
      type: 'completion',
      question: '中国的首都是[[北京|Beijing]]',
      analysis: '中国的首都是北京'
    },
  ]
}
const player = new QiQiuYun.Player({
  exam: popupExam
})

# 方法相关演示

# 设置弹题(setExam)

const popupExam = {
  config: {
    mode: 'strict', // Enum('strict', 'middle', 'loose');弹题的模式:严格,中等,松散。
  },
  questions: [
    // 单选题
    {
      time: 5, // Int 此题目弹出的时间,单位秒
      type: 'choice', // Enum('choice', 'multiChoice', 'judge', 'completion', 'uncertainChoice'); 此题目的类型:单选,多选,判断,填空,不定项选择。
      question: '<p>中国的首都是那里?</p>', // 问题
      options: [  // 选项
        {key: 'A', val: '北京'},
        {key: 'B', val: '南京'},
        {key: 'C', val: '东京'},
        {key: 'D', val: '西京'}
      ],
      answer: ['A'], // 正确答案
      analysis: '解析', // 题目解析
      beforeAnswerTip: {
        type: 'warning',
        text: '温馨提示:每一道弹题答分都将计入该课程总分。'
      },
    },
    // 判断题
    {
      time: 20,
      type: 'judge',
      question: '中国的首都是北京',
      answer: ['T'],
      analysis: '!!!'
    },
    // 填空题
    // 一道填空题的配置。每个填空的答案可有多个,只要答对其中一个就算那个空回答正确。
    // 答案在题干中使用`[[]]`包裹,多个答案之间采用`|`分割。
    {
      time: 25,
      type: 'completion',
      question: '中国的首都是[[北京|Beijing]]',
      analysis: '中国的首都是北京'
    },
  ]
}
player.setExam(popupExam)

# 打开模态框 openModal(modalOptions)

player.openModal({
  content:'<div>text</div>',
  height: 236,
  width: 123,
  closable: true,
  timeout: 5000
})

modalOptions 相关参数

参数 类型 描述 默认值 默认值
content string | html 内容 ''
height number 高度,单位px 500px
width number 宽度,单位px 300px
closeable boolean 允许主动关闭(当false时timeout为5000) true
timeout number 自动关闭时间,单位ms(0表示不自动关闭) 0

# 播放控制配置项 setControlOptions(controlOptions)

// 设置水印倍率大小
player.setControlOptions({
  target: ['watermark'],
  map: {
    rate: 0.5
  }
});

// 设置禁用控制条
player.setControlOptions({
  target: ['controlBar', 'progressControl', 'seekBar'],
  map: {
    disableProgress: true
  }
});