VePlayer 通过 HTML5 的 <video/>
标签实现视频播放,能满足视频播放的常用功能需求。本文为您介绍如何实现 VePlayer 提供的基础功能。
VePlayer 的基础功能由播放器内核的属性或接口实现。
获取播放器内核的示例代码如下所示。
const playerSdk = new VePlayer({ id: 'video', width: 800, height: 500, url: 'xx.mp4' }); playerSdk.on('complete', () => { // 获取播放器内核 const player = playerSdk.player; console.log('player core', player); })
说明
complete
事件)触发后从SDK实例的player属性获取播放器内核。获取播放器内核的属性,以获取当前播放时间为例,代码示例如下所示。
const playerSdk = new VePlayer({ id: 'video', width: 800, height: 500, url: 'xx.mp4' }); // ... // 获取当前的播放时间 const currentTime = playerSdk.player.currentTime;
调用播放器内核的方法,以调用播放方法为例,代码示例如下所示。
const playerSdk = new VePlayer({ id: 'video', width: 800, height: 500, url: 'xx.mp4' }); // ... // 手动调用播放 const btn = document.getElementById('play_btn'); btn.addEventListener('click', (e) => { playerSdk.player.play(); })
如果您购买并接入了火山引擎视频点播服务,可使用 Vid 模式播放视频。本节为您介绍实现视频 Vid+PlayAuthToken
播放的操作步骤。
您需要在应用服务端通过 Vid
生成播放使用的临时播放 Token。临时播放 Token 除了包含视频 ID 等信息,还可以通过参数指定视频分辨率、转码类型、封装格式等信息。具体介绍请见通过临时播放 Token 播放。
说明
获取的视频,默认是 mp4
格式非加密视频。如果 playAuthToken
没有指定格式、分辨率等信息,可以在 reqParams
中通过 Format
和 Definition
来透传参数,可传参数详见获取播放地址。
在实例化 VePlayer 时,设置 getVideoByToken
参数传入 Vid 播放配置。详细的参数说明请见 IPlayAuthTokenConfig。示例代码如下:
const playerSdk = new VePlayer({ id: 'mse', width: 800, height: 500, getVideoByToken: { playAuthToken: '临时playAuthToken', // 需要从服务端临时获取 definitionMap: { 'original': { definition: 'ori', definitionTextKey: 'ORI' }, '360p': { definition: 'ld', definitionTextKey: 'LD' }, '480p': { definition: 'sd', definitionTextKey: 'SD' }, '720p': { definition: 'hd', definitionTextKey: 'HD' } } }, languages: { 'zh': { ORI: '原画', LD: '流畅', SD: '标清', HD: '高清' } } });
VePlayer 会从视频点播服务自行获取视频播放地址,默认以符合条件的第一个地址作为播放地址,并会自动设置清晰度列表。
如果您需要自行处理视频信息,可以在播放器实例化之前,调用 VePlayer 提供的 Service
方法,获取视频播放地址。实现的代码示例如下所示。
const Service = window.VePlayer.Service; const playAuthToken = '临时playAuthToken'; // 需要从服务端临时获取 Service.url(playAuthToken, '//vod.volcengineapi.com').then((res) => { // 业务侧处理视频信息 const player = new VePlayer({ id: 'mse', width: 800, height: 500, url: res.PlayInfoList[0].MainPlayUrl, }); }).catch((e) => { console.log(e); });
如果需要切换视频源,可以传入新的 playAuthToken
进行切换,示例代码如下所示。
playerSdk.switchAuthToken({ playAuthToken: 'new playAuthToken' });
PlayAuthToken
具有一定的有效时间,建议在需要播放时获取使用。如果 PlayAuthToken
过期,视频将无法起播。VePlayer 提供 onTokenExpired
事件,可以在 token
过期时自动更新 token
,代码示例如下所示。
const playerSdk = new VePlayer({ id: 'video', width: 800, height: 500, getVideoByToken: { playAuthToken: 'video_playAuthToken' }, onTokenExpired: () => { return new Promise(resolve => { // 调用您的接口获取新的 playAuthToken getNewToken().then(res => { resolve({ playAuthToken: 'new playAuthToken', // 新的 playAuthToken keyToken: 'new keyToken' // 'hls 加密播放时传入新的 keyToken' }) }) }); } });
说明
onTokenExpired
要求返回为 IPlayAuthTokenConfig 类型的 Promise 异步函数。
您可通过 playerSdk.player.state
获取播放器当前所处的播放状态。示例代码如下所示。
const playerSdk = new VePlayer({ id: 'video', width: 800, height: 500, url: 'xx.mp4' }); // 获取播放状态 const playerState = playerSdk.player.state;
播放状态枚举值的详细说明如下表所示。
名称 | 数值 | 描述 |
---|---|---|
ERROR | 0 | 播放出现错误。 |
INITIAL | 1 | 初始化。 |
READY | 2 | 配置、事件、插件等均已经完成初始化、绑定和实例化。 |
ATTACHING | 3 | 进入媒体对象挂载阶段。 |
ATTACHED | 4 | 媒体对象已经挂载到了 DOM 中。 |
NOTALLOW | 5 | 播放被阻止。 |
RUNNING | 6 | 已经成功起播进入播放流程。 |
ENDED | 7 | 播放结束。 |
DESTROYED | 8 | 播放器内核实例已被销毁。 |
设置音量包括音量大小调节和静音设置。VePlayer 默认 UI 中自带音量设置控件,您可自行调节音量或者设置静音。
如果自定义 UI,可以通过以下方法实现。
设置音量的代码示例如下所示。
// 配置音量,实例化时传入 volume 参数 const playerSdk = new VePlayer({ id: 'video', width: 800, height: 500, volume: 0.2, url: 'xx.mp4' }); // 设置音量,实例的 player 进行设置 playerSdk.player.volume = 0.2;
设置静音的代码示例如下所示。
playerSdk.player.muted = false;
在点播场景下,VePlayer 默认 UI 中自带倍速播放设置控件。您可以根据需要调节播放速度,默认提供 0.5x、0.75x、1x、1.25x、1.75x、2x 的倍速选项。
如果有其他速度设置需求。可调用以下方法,实现的代码示例如下所示。
const playerSdk = new VePlayer({ id: 'video', width: 800, height: 500, url: 'xx.mp4' }); // 播放倍速设置 playerSdk.player.playbackRate = 3;
获取当前播放速度,实现的代码示例如下所示。
const playbackRate = playerSdk.player.playbackRate
VePlayer 提供清晰度切换控件,支持用户自行切换不同清晰度的视频。具体效果如下图所示:
为实现清晰度切换功能,您需要准备同一视频的不同清晰度版本。您可以通过视频点播控制台的媒体处理功能获取同一视频的不同清晰度版本,具体操作请见视频转码模板。
不同的播放模式下,显示清晰度切换控件的实现方式有所不同。
如果您使用 Vid+PlayAuthToken 方式播放,则只需设置 playAuthToken,不限定清晰度 、Definition
对应签发参数,并确保控制台中有对应各个清晰度的转码产物,VePlayer 会自动展示清晰度切换控件。如果您需要自定义各清晰度对应的文案,可传入 definitionMap
。示例代码如下:
const playerSdk = new VePlayer({ id: 'video', width: 800, height: 500, getVideoByToken: { playAuthToken: 'yourplayAuthToken', definitionMap: { 'original': '原画', '360p': '流畅', '480p': '标清', '720p': '高清', '1080p': '蓝光·', }, }, });
在以下仅有单个清晰度视频的场景中,VePlayer 默认不会显示清晰度切换控件:
url
地址。playList
中只设置了一路流。如果您仍然期望显示清晰度切换控件,可将实例化参数 alwaysShowDefinition
设为 true
。此外,如果您还需自定义该清晰度对应的文案,不同的播放模式下,实现方式有所不同。示例代码如下:
使用 Vid+PlayAuthToken 方式播放的示例代码如下:
const playerSdk = new VePlayer({ id: 'video', width: 640, height: 360, // 设置单个清晰度时也显示清晰度切换控件 alwaysShowDefinition: true, getVideoByToken: { playAuthToken: 'yourplayAuthToken', definitionMap: { '480p': { definitionTextKey: 'HD' }, }, languages: { 'zh': { // 自定义 HD 对应的文案 HD: '超清', }, });
在点播场景下,播放器参数 loop
设置为 true
,即可开启循环播放。实现的代码示例如下所示。
const playerSdk = new VePlayer({ id: 'video', width: 800, height: 500, loop: true, url: 'xx.mp4' });
自动播放是指在用户没有主动交互(如鼠标点击、手指触摸)的情况下,通过 autoplay
配置、JavaScript 代码调用 play()
方法,或者定时器、Promise 回调、事件监听等方式,在页面加载完成后自动启动视频播放的功能。这种功能允许视频在页面加载后立即开始播放,而无需用户手动点击播放按钮。
由于浏览器策略的限制,自动播放并非总能成功。浏览器从用户角度考虑,认为网页或应用程序没有警告自动发出噪音可能会令人讨厌、不便或令人反感,因此通常仅允许在特定情况下进行自动播放。
VePlayer 提供 autoplay
、autoplayMuted
、enableDegradeMuteAutoplay
和 enableUserActionAutoplay
四个自动播放相关的配置,详见 IPlayerConfig。但是自动播放能否成功,在不同浏览器环境中还需要满足以下条件。
根据最新的 PC 端浏览器策略,允许自动播放至少需要满足以下任意条件:
具体请见 Google Chrome 和 WebKit 的自动播放策略。
交互行为的回调中执行
play()
的上下文中必须能跟踪到真实的用户交互行为。伪造的用户交互行为不被接受。
说明
您可以在 chrome://media-engagement/
查看网站的 MEI 评分。因为各个用户的浏览器评分不一致,所以会出现同一个网站有的用户能自动播放,有的不能,但随着用户与网站交互增多,评分会随之升高,也就允许自动播放了。一些访问量较大的视频网站,例如腾讯视频、bilibili、YouTube,因为网站访问者与其交互较多且大多数允许自动播放,会被 Chrome 的算法自动加入自动播放白名单,详见 Autoplay Pre-Seeding in Chrome。
H5 和移动端 WebView 上默认禁止有声音的自动播放。您可以选择自动静音播放,示例代码如下:
const playerSdk = new VePlayer({ // ... autoplay: true, autoplayMuted: true, // enableDegradeMuteAutoplay: true, // 开启自动降级静音播放,即有声音播放不支持时自动降级到静音自动播放 });
说明
需要注意在以下情况中,自动静音播放也不能生效:
如果是在业务方可控的 WebView 上运行网站应用,还需开启 WebView 自动播放相关配置以实现自动播放。
Android 设置 setMediaPlaybackRequiresUserGesture。示例代码如下:
myWebView.getSettings().setMediaPlaybackRequiresUserGesture(false);
iOS WKWebView 设置 mediaTypesRequiringUserActionForPlayback。示例代码如下:
[self.webvie mediaTypesRequiringUserActionForPlayback:NO];
您可以通过以下方式判断自动播放是否成功。
通过 JavaScript 代码调用 play()
方法实现自动播放不一定能成功。通常来说可以根据 play()
返回的 Promise 操作结果来判断是否成功:
resolve
的 Promise 结果。NotAllowedError
错误且状态为 rejected
的 Promise 结果。示例代码如下:
let startPlayPromise = playerSdk.player.play(); if (startPlayPromise !== undefined) { startPlayPromise.catch(error => { if (error.name === "NotAllowedError") { // TODO Do something when not autoplay success } else { // Handle a load or playback error } }).then(() => { // Start whatever you need to do only after playback // has begun. }); }
您可以监听 Web 点播 SDK 的以下事件来判断自动播放是否被阻止:
autoplay_was_prevented
: 自动播放被阻止。autoplay_failed
: 自动播放失败。示例代码如下:
const playerSdk = new VePlayer({ // ... autoplay: true, }); playerSdk.on('autoplay_was_prevented', () => { // TODO something console.log('自动播放被阻止'); });
如果是默认静音自动播放,非用户行为下设置播放器
muted
属性为true
时(playerSdk.player.muted = false
),在不支持有声音自动播放的浏览器环境下,浏览器会强制视频暂停。
您从视频点播服务获取的视频播放地址默认开启了时间戳防盗链功能。在视频播放过程中,可能因为视频地址未及时使用、用户进行 Seek 播放或循环播放等操作,视频地址过期,导致视频无法继续观看。VePlayer 提供相应的事件监听视频播放地址是否过期,并支持配置自动刷新视频播放地址。通过这样的配置,即使视频播放地址过期,VePlayer 也能自动重新获取有效的播放地址,使用户能够继续观看视频。
您需自行指定该播放源的过期时间戳。播放器会轮询地将播放器所在的客户端时间与过期时间戳进行比较。过期前 60 秒时,SDK 会触发 Events.MEDIA_EXPIRED
事件,提示地址即将过期。
Vid 模式播放时,播放器会自动获取每个地址的过期时间戳。因此,您仅需在实例化播放器时,将 enableUrlExpireCheck
参数设为true
,开启地址过期检测。示例代码如下:
const playerSdk = new VePlayer({ id: 'video-container', getVideoByToken: { playAuthToken: 'playAuthTokenxxxx' }, // 开启地址过期检测 enableUrlExpireCheck: true, vodLogOpts: { vtype: 'MP4', tag: '普通视频', line_app_id: xxxx, line_user_id: 'veplayer_web_demo' } }); playerSdk.on(VePlayer.Events.MEDIA_EXPIRED, (err) => { console.log('地址过期', err); })
在视频播放地址过期时间未知的情况下,如果地址过期,播放器会触发网络类错误。为了确认该错误是否由地址过期引起,播放器会主动对地址的有效性进行校验。一旦确认地址过期,播放器会触发地址过期事件,告知视频资源已过期。
为了确保该功能正常运行,视频播放地址所使用的域名需要配置了 HTTP 返回 CORS 跨域头。您可以通过视频点播控制台进行配置 HTTP 响应头。推荐设置以下配置:
响应头名称 | 响应头值 |
---|---|
Access-Control-Allow-Origin |
|
Access-Control-Allow-Methods |
|
Access-Control-Expose-Headers |
|
您可以通过以下两种方式实现播放源过期后刷新播放源。
您可以监听过期事件 Events.MEDIA_EXPIRED
。在监听回调中,进行以下操作:
url
、播放列表 playList
或者 vid
和 playAuthToken
,还需包含新地址的过期时间戳 urlExpireTimestamp
。updateMediaSource
方法将新的播放源数据传入 SDK。示例代码如下:
const playerSdk = new VePlayer({ id: 'video-container', url: 'https://veplayer.demo.com/453b1f794dfa49f4819b5d923658411a?auth_key=1717547753-UCQrGayCc9-xiong-c1b5966b82630cd45eefaa0f73b9137a', enableUrlExpireCheck: true, urlExpireTimestamp: 1717547753, vodLogOpts: { vtype: 'MP4', tag: '普通视频', line_app_id: xxx, line_user_id: 'veplayer_web_demo', }, }); // 监听过期事件 playerSdk.on(VePlayer.Events.MEDIA_EXPIRED, err => { console.log('地址过期了 ', err); // 从业务服务端重新获取新的视频播放地址及地址过期时间戳 appServer.getPlayUrl().then((res) => { playerSdk.updateMediaSource({ url: res.url, urlExpireTimestamp: res.urlExpireTimestamp, }); }) });
您可以在实例化播放器时设置 onMediaExpired
回调函数。该回调函数应返回一个包含播放源信息的数据对象,可以是视频播放地址 url
、播放列表 playList
或者 vid
和 playAuthToken
。此外,数据对象还需要包含新地址的过期时间戳 urlExpireTimestamp
。当 Events.MEDIA_EXPIRED
事件触发后,播放器会自动调用 onMediaExpired
回调函数,并将其返回的结果作为 updateMediaSource
方法的输入,从而自动更新播放源。示例代码如下:
const playerSdk = new VePlayer({ id: 'video-container', url: 'https://veplayer.demo.com/d174bc4b9b32482582d3a07816a2104a/main.m3u8?auth_key=1718253922-987655e64a9f4c0dbf568f6397bd6232-0-5c0fa62ad9bcbee2c024b55824350d43', enableUrlExpireCheck: true, urlExpireTimestamp: 1618246275, onMediaExpired: async () => { // 从业务服务端重新获取新的视频地址及地址过期时间戳 const res = await appServer.getPlayUrl(); return { url: res.url, urlExpireTimestamp: res.urlExpireTimestamp, }; }, vodLogOpts: { vtype: 'MP4', tag: '普通视频', line_app_id: xxx, line_user_id: 'veplayer_web_demo' } }); playerSdk.on(VePlayer.Events.MEDIA_EXPIRED, (err) => { console.log('地址过期了 ', err); })
<source />
元素设置播放源VePlayer 支持在 HTML <video />
元素中使用 <source />
元素设置多种格式的视频源,以兼容不同的浏览器环境。
注意
以 <source/>
元素设置的地址不支持 MSE(媒体源扩展)播放场景,例如 PC 上播放 HLS 视频或安卓上播放 HLS 加密视频。
为了设置多种格式的视频源,您只需以数组的形式描述 URL。每个数组项应包含视频播放地址 src
和视频容器格式类型 type
。其中,type
描述的通常是视频格式的 MIME 类型,只支持浏览器直接支持播放的视频格式。以下是常见容器格式及对应的 MIME 类型和文件扩展名:
容器格式名称 | 音频 | 视频 | ||
---|---|---|---|---|
MIME 类型 | 扩展名 | MIME 类型 | 扩展名 | |
3GP | audio/3gpp | .3gp | video/3gpp | .3gp |
ADTS(音频数据传输流) | audio/aac | .aac | — | — |
FLAC | audio/flac | .flac | — | — |
MPEG-1 / MPEG-2(MPG 或 MPEG) | audio/mpeg | .mpg | video/mpeg | .mpg |
audio/mp3 | .mp3 | |||
MPEG-4 (MP4) | audio/mp4 | .mp4 | video/mp4 | .mp4 |
Ogg | audio/ogg | .oga | video/ogg | .ogv |
QuickTime Movie (MOV) | — | — | video/quicktime | .mov |
WAV(波形音频文件) | audio/wav | .wav | — | — |
WebM | audio/webm | .webm | video/webm | .webm |
示例代码如下:
const playerSdk = new VePlayer({ id: 'video-container', url: [ { // MOV 格式,苹果设备支持 src: 'https://voddemo-play.volcvod.com/source_video.MOV', type: 'video/quicktime' }, { src: 'https://voddemo-play.volcvod.com/source_video.mp4', type: 'video/mp4', }, ], vodLogOpts: { vtype: 'MP4', tag: '普通视频', line_app_id: xxxx, line_user_id: 'veplayer_web_demo' } });
说明
您可通过 SDK 实例的 src
属性获取到当前播放所实际使用的 source
对应的视频地址。
设置 rotate
配置使用的旋转插件。用户点击旋转按钮后,视频会旋转 90 度。
const playerSdk = new VePlayer({ id: 'video', width: 800, height: 500, url: 'xx.mp4', // 视频旋转按钮配置项,默认值:{ innerRotate: false, clockwise: false } rotate: { innerRotate: true, //只旋转内部 video clockwise: false // 旋转方向是否为顺时针 } });
注意
当 innerRotate
为 false 时,播放器的宽高需要与视频的分辨率一致。
VePlayer 支持在拖拽进度条时,通过查看视频缩略图快速预览指定位置的视频内容。VePlayer 是以服务端提供的雪碧图作为预览图资源,并在前端根据鼠标指针的位置计算并显示对应时间点的预览图。
雪碧图是由多帧截图拼接而成的一张大图,具有以下好处:
以下为一张雪碧图示例。该雪碧图中共包含 13 张缩略图。
基于上述雪碧图的进度条缩略图预览效果如下:
说明
点击在线体验试用进度条预览缩略图功能,并查看示例代码。
如需在播放端展示雪碧图,请先通过视频点播媒体处理服务生成雪碧图,详细操作请见雪碧图。Vid 播放模式和 DirectUrl 播放模式均支持展示雪碧图,实现方式有所不同,具体说明如下。
实例化播放器时,在 Vid 播放配置中传入 needThumbs
参数,取值为 true
,即可展示雪碧图。示例代码如下:
const playerSdk = new VePlayer({ id: 'mse', width: 800, height: 500, // Vid 播放配置 getVideoByToken: { playAuthToken: '临时playAuthToken', // 需要从服务端获取 .... needThumbs: true });
播放器入参中传入 enableContextmenu
和 closeVideoStopPropagation
,取值同时设置为 true
,可在播放器上右键查看视频信息。实现的示例代码如下所示。
const playerSdk = new VePlayer({ id: 'mse', width: 600, height: 400, enableContextmenu: true, closeVideoStopPropagation: true, getVideoByToken: { playAuthToken: 'playAuthToken', }, });
MP4 视频播放时,在不优化视频 MOOV box 结构且不进行视频转码的情况下,通常起播较慢。VePlayer 支持以 MSE 形式播放 MP4 视频,该模式起播更快,支持缓存播放,从而节省流量,示例代码如下所示。
const playerSdk = new VePlayer({ id: 'video', width: 800, height: 500, url: 'xx265.mp4', enableMp4MSE: true });
说明
MSE 播放模式需要确认 mp4 地址,支持当前页面域名跨域请求,并且支持 range 请求,可以通过提交工单的方式配置跨域。
VePlayer 支持音乐播放器模式,具有音乐封面、音乐列表、循环播放、码率切换等功能。效果如下图所示。
如需开启音乐播放器模式,您需在实例化 VePlayer 时,将 isMusic
参数设为 true
。此外,您还可以配置音乐播放器。不同的播放模式下,配置方式有所不同。
Vid 播放模式下,可通过 music
参数配置音乐播放器。具体参数说明请见 IMusicConfig。示例代码如下:
const playerSdk = new VePlayer({ id: "music", width: 640, height: 90, isMusic: true, title: "Final Touch/Hidden Agenda", poster: "https://s1.ax1x.com/2023/01/05/pSAQx78.jpg", getVideoByToken: { playAuthToken: 'eyJHZXRQbGF5SW******aWVzIiwiVG9rZW5WZXJzaW9uIjoiVjIifQ==', definitionMap: { 'highest': { definition: 'Highest quality', definitionTextKey: 'highest' }, higher: { definition: 'Higher quality', definitionTextKey: 'higher' }, medium: { definition: 'Medium quality', definitionTextKey: 'medium' }, }, }, languages: { zh: { medium: '普通音质', higher: '高音质', highest: '无损音质', }, en: { medium: 'Normal', higher: 'Higher', highest: 'Lossless', } } });
音乐播放器模式的相关属性如下表所示。
属性 | 是否可读 | 是否可写 | 描述 | 示例 |
---|---|---|---|---|
musicMode | 是 | 是 | 当前播放模式
|
|
musicTimeScale | 是 | 是 | 快进快退时间跨度 |
|
musicList | 是 | 是 | 音乐播放列表 |
|
音乐播放器模式的相关方法如下表所示。
方法 | 描述 | 参数 | 返回 | 示例 |
---|---|---|---|---|
musicAdd | 向播放列表中加入歌曲 | 对象,具体可参考 IMusicListItem
| 无 |
|
musicRemove | 从播放列表中移除歌曲 | 歌曲列表中要删除歌曲对应的 Vid | 无 |
|
musicRandom | 随机获取播放列表中某一首歌曲 | 无 | 歌曲信息,具体可参考 IMusicListItem |
|
musicNext | 播放下一首歌曲 | 无 | 无 |
|
musicPrev | 播放上一首歌曲 | 无 | 无 |
|
musicSetIndex | 选择第 n 首歌曲 | Number 类型 | 无 |
|
musicForward | 歌曲快进timeScale秒 | 无 | 无 |
|
musicBackward | 歌曲后退 timeScale 秒 | 无 | 无 |
|
musicSetAbCycle | 设置 AB 循环 | 对象,具体可参考 IABCycle
| 无 |
|
musicRemoveAbCycle | 移除 AB 循环 | 无 | 无 |
|
详见使用插件 - 外挂字幕。
详见使用插件 - 记忆播放。
详见使用插件 - 视频镜像。
详见使用插件 - 播放列表。
详见使用插件 - 动态水印。