以下方法需要打开相应开关才能使用。包括文档预览,音视频转码播放,打包下载。
请求参数中的 options: IPDSRequestConfig 基于 axios 的 request config 封装,详情请看:AxiosRequestConfig。
getOfficePreviewUrl 方法
文档预览,需要开通对应的服务才可以使用。
const result = await client.getOfficePreviewUrl(params, options)
参数说明
字段 | 类型 | 必选 | 说明 |
params | IOfficePreviewReq | 是 | 要预览的文件 |
options | IPDSRequestConfig | 其它配置项 |
IOfficePreviewReq
字段 | 类型 | 必选 | 说明 |
drive_id | string | 云盘id。(drive_id和share_id 二选一) | |
share_id | string | 分享id。(drive_id和share_id 二选一) | |
file_id | string | 文件id | |
allow_copy | boolean | 是 | 是否允许复制 |
referer | string | 地址,location.origin 或者 undefined |
返回值
字段 | 类型 | 必选 | 说明 |
result | object | 是 | 返回结果 |
result
字段 | 类型 | 必选 | 说明 |
access_token | string | 是 | token信息 |
preview_url | string | 是 | 预览URL |
附: 文档预览方法举例
PDS文档的预览对接的是阿里云IMM的文档预览功能:快速入门。
下面是具体步骤:
(1) html 修改
在 html 首先需要引入 sdk.js。
<script src="https://g.alicdn.com/IMM/office-js/1.1.15/aliyun-web-office-sdk.min.js"></script>
<!-- iframe mounted 元素 -->
<div id="preview-div"></div>
(2) 主要逻辑
调用 getOfficePreviewUrl 接口获取 access_token 和 preview_url。
//获取协作地址和AccessToken。
var tokenInfo = await client.getOfficePreviewUrl({
drive_id: '1',
file_id: 'xxxxxx'
})
let instance = aliyun.config({
mount: document.querySelector('#preview-div'), // 预览的 iframe 会渲染在这个元素里
url: tokenInfo.preview_url, // 设置文档协作URL地址。
refreshToken, // 配置刷新token方法
})
//设置AccessToken。
instance.setToken({
token: tokenInfo.access_token,
timeout: 10*60*1000
})
// 刷新token 方法
// 重新调用 getOfficePreviewUrl 接口可以再次获取 access_token 和 preview_url
async function refreshToken(){
var tokenInfo = await client.getOfficePreviewUrl({
drive_id: '1',
file_id: 'xxxxxx'
})
return {
token: tokenInfo.access_token,
timeout: 10*60*1000
}
}
(3) iframe 样式
根据实际情况自行调整。
#preview-div iframe{
width: 100%;
height: 100%;
}
getOfficeEditUrl 方法
文档编辑,需要开通对应的服务才可以使用。
const result = await client.getOfficeEditUrl(params, options)
参数说明
字段 | 类型 | 必选 | 说明 |
params | IOfficeEditReq | 是 | 要编辑的文件等参数 |
options | IPDSRequestConfig | 否 | 其它配置项 |
IOfficeEditReq
字段 | 类型 | 必选 | 说明 |
drive_id | string | 云盘id。(drive_id和share_id 二选一) | |
share_id | string | 分享id。(drive_id和share_id 二选一) | |
file_id | string | 是 | 文件id |
option | object | 包含如下字段 { readonly: boolean, copy: boolean } | |
referer | string | 地址,location.origin 或者 undefined |
返回值
字段 | 类型 | 必选 | 说明 |
result | IOfficeEditRes | 是 | 返回结果 |
IOfficeEditRes
字段 | 类型 | 必选 | 说明 |
office_access_token | string | 是 | token |
office_refresh_token | string | 是 | token |
edit_url | string | 是 | URL信息 |
refreshOfficeEditToken 方法
文档编辑的刷新,需要开通对应的服务才可以使用。
const result = await client.refreshOfficeEditToken(params, options)
参数说明
字段 | 类型 | 必选 | 说明 |
params | IOfficeRefreshReq | 是 | 要编辑的文件等参数 |
options | IPDSRequestConfig | 否 | 其它配置项 |
IOfficeRefreshReq
字段 | 类型 | 必选 | 说明 |
office_access_token | string | 是 | token |
office_refresh_token | string | 是 | token |
返回值
字段 | 类型 | 必选 | 说明 |
result | IOfficeRefreshReq | 是 | 返回结果 |
getVideoPreviewPlayMeta 方法
获取视频或者音频转码的清晰度列表,需要开通对应的服务才可以使用。
const result = await client.getVideoPreviewPlayMeta(params, options)
参数说明
字段 | 类型 | 必选 | 说明 |
params | IGetVideoPreviewPlayMetaReq | 否 | 要播放的视频信息,继承自 IFileKey |
options | IPDSRequestConfig | 否 | 其它配置项 |
IGetVideoPreviewPlayMetaReq
字段 | 类型 | 必选 | 说明 |
drive_id | string | 云盘id。(drive_id和share_id二选一) | |
share_id | string | 分享id。(drive_id和share_id二选一) | |
file_id | string | 是 | 文件id |
category | string | 否 | 类别。根据开通情况,可选值可能为: live_transcoding | quick_video | offline_audio | offline_video。 |
返回值
字段 | 类型 | 必选 | 说明 |
result | IGetVideoPreviewPlayMetaRes | 是 | 返回结果 |
IGetVideoPreviewPlayMetaRes
字段 | 类型 | 必选 | 说明 |
video_preview_play_meta | IVideoPreviewPlayMeta | 是 | 播放相关的信息 |
... 其它字段 |
IVideoPreviewPlayMeta
字段 | 类型 | 必选 | 说明 |
category | string | 是 | 类别。 |
meta | {duration:number, width:number, height:number} | 是 | 播放相关的信息。 |
live_transcoding_task_list | ILiveTranscodingTask[] | 转码任务列表。 |
ILiveTranscodingTask
字段 | 类型 | 必选 | 说明 |
template_id | string | 是 | 模板id。 |
template_name | string | 是 | 模板名称。 |
status | string | 是 | 转码任务状态。取值范围:'finished' | 'running' | 'failed' |
...其他字段 |
举例:
(1) 获取转码后支持的各种清晰度
const previewInfo = await client.getVideoPreviewPlayMeta({
drive_id: "xxx",
file_id: "xxx",
category: "live_transcoding",
});
const definitions = previewInfo?.video_preview_play_meta?.live_transcoding_task_list?.map(n=>{
return {
template_id: n.template_id,
template_name: n.template_name
}
})
definitions 格式如:
[
{
template_id: "264_480p",
template_name: "pdsSD"
},
{
template_id: "264_720p",
template_name: "pdsHD"
}
]
附录:转码后的视频各参数均不会超过转码模板的对应值
转码模板 | 264_480p | 264_720p | 264_1080p | 265_4K |
视频编码器 | h264 | h264 | h264 | h265 |
视频分辨率 | 720x480 | 1280x720 | 1920x1080 | 3840x2160 |
视频码率(kbps) | 600 | 1500 | 3000 | 6000 |
视频帧率(fps) | 25 | 25 | 25 | 25 |
音频编码器 | aac | aac | aac | aac |
音频采样率(Hz) | 44100 | 44100 | 44100 | 44100 |
音频声道数 | 2 | 2 | 2 | 2 |
音频码率(kbps) | 72 | 128 | 160 | 224 |
(2) 异常情况
如果没有转码完成(正在转码),返回 status code 为 202,会返回以下格式json:(这个时候需要轮询 getVideoPreviewPlayMeta 方法,直到 live_transcoding_task_list 中的状态为finished)
{
code: "VideoPreviewWaitAndRetry",
message: "video is transcoding, please wait and retry. offline transcode when play, wait transcoding",
};
转码增值服务开关没有打开, 返回 status code: 400:
{
code: "VideoPreviewDisabled.OnlineVideoTranscode",
message: "video preview online_video_transcode is disabled",
};
getVideoPreviewPlayInfo 方法
根据清晰度获取音视频转码后的播放URL,需要开通对应的服务才可以使用。
const result = await client.getVideoPreviewPlayInfo(params, options)
参数说明
字段 | 类型 | 必选 | 说明 |
params | IVideoPreviewPlayInfoReq | 否 | 要播放的视频信息,继承自 IFileKey |
options | IPDSRequestConfig | 否 | 其它配置项 |
IVideoPreviewPlayInfoReq
字段 | 类型 | 必选 | 说明 |
drive_id | string | 是 | 云盘id |
file_id | string | 是 | 文件id |
category | string | 否 | 类别,根据开通情况,可选值可能为: live_transcoding | quick_video | offline_audio | offline_video。 |
template_id | string | 否 | 模板id。如果不传则拉取所有template对应的转码信息 |
get_without_url | boolean | 否 | 是否拉取视频流。默认 false。设置此参数true后, 不会获取任何URL,以减少不必要的转码成本 |
url_expire_sec | number | 否 | URL 超时时间。单位秒(s),最大4小时 |
referer | string | 否 | 地址,location.origin 或者 undefined |
返回值
字段 | 类型 | 必选 | 说明 |
result | IVideoPreviewPlayInfoRes | 是 | 返回结果 |
IVideoPreviewUrlRes
字段 | 类型 | 必选 | 说明 |
video_preview_play_info | IVideoPreviewPlayMeta | 是 | 播放相关的信息 |
... 其它字段 |
举例:
(1) 获取转码后某个清晰度的URL
const previewInfo = await client.getVideoPreviewPlayInfo({
drive_id: "xxx",
file_id: "xxx",
category: "live_transcoding",
template_id: "264_480p",
});
正常返回:
{
"domain_id": "xxx",
"drive_id": "xxxx",
"file_id": "xxxx",
"video_preview_play_info": {
"category": "live_transcoding",
"meta": {
"duration": 2.484688,
"width": 1280,
"height": 720,
"live_transcoding_meta": {
"ts_segment": 10,
"ts_total_count": 1
}
},
"live_transcoding_task_list": [
{
"template_id": "264_480p",
"template_name": "pdsSD",
"status": "finished",
"stage": "stage_all",
"url": "https://xxxxxf1ec8c36" // 播放url
}
]
}
}
(2) 异常情况
如果没有转码完成(正在转码),返回 status code 为 202,会返回以下格式json:(这个时候需要轮询 getVideoUrlFromDefinition 方法,直到 live_transcoding_task_list 中的状态为finished)
{
code: "VideoPreviewWaitAndRetry",
message: "video is transcoding, please wait and retry. offline transcode when play, wait transcoding",
};
转码增值服务开关没有打开, 返回 status code: 400:
{
code: "VideoPreviewDisabled.OnlineVideoTranscode",
message: "video preview online_video_transcode is disabled",
};
没有对应的转码信息(一般是template_id传错了)
{
"domain_id": "x x x",
"drive_id": "xxxx",
"file_id": "61c5729c722d8f86d9c848508b8c5f6dc6604248",
"video_preview_play_info": {
"category": "live_transcoding",
"meta": {
"duration": 14.433333,
"width": 960,
"height": 544,
"live_transcoding_meta": {
"ts_segment": 10,
"ts_total_count": 2
}
}
}
}
(3) 转码后的视频如何播放
转码后的视频一般为.m3u8格式,可以用一些开源的视频播放器播放,推荐使用videojs。
下面是个基于Vue封装的例子:
<template>
<video class="video-js" ref="videoPlayer"></video>
</template>
<script>
import videojs from 'video.js';
import { getToken } from 'token.js';
import client from 'client.js'
export default {
data() {
return {
drive_id: '1',
file_id: '612cxxxxxxxxxxxxxxxxxxxxxxxxxxxec7d',
url: '',
status: 'loading', // 视频状态,可根据状态进行其他操作
// video.js配置项
playerOptions: {
controls: false, // 是否拥有控制条
autoplay: true, // 是否自动播放
muted: false, // 是否静音
html5: {
vhs: {
// 支持m3u8视频播放
withCredentials: false,
},
},
},
};
},
mounted() {
this.init();
this.getVideoUrlFromDefinition();
},
method: {
init() {
//headers中添加Authorization,处理401报错
videojs.Vhs.xhr.beforeRequest = function (options) {
const { access_token } = getToken()
options.headers = { Authorization: `Bearer ${access_token}` };
return options;
};
this.player = videojs(this.$refs.videoPlayer, this.playerOptions, function () {
this.on('seeking', () => {
// console.log('seeking---视频跳转中---')
this.status = 'loading';
// 跳转加载超时15s,进行处理
if (!this.waitingTimer) {
let second = 0;
this.waitingTimer = setInterval(() => {
second++;
if (second > 15) {
this.status = 'transcoding';
}
}, 1000);
}
});
this.on('seeked', () => {
// console.log('seeked---视频跳转结束---')
this.status = 'normal';
this.waitingTimer = null;
clearInterval(this.waitingTimer);
});
});
},
async getVideoUrlFromDefinition() {
try {
// 第一步拉取模板
const { video_preview_play_info } = await client.getVideoUrlFromDefinition({
drive_id: this.drive_id,
file_id: this.file_id,
template_id: '',
get_without_url: true,
});
// 取转码成功的模板
const live_transcoding_task_list =
video_preview_play_info.live_transcoding_task_list.filter((item) => {
return item.status === 'finished';
});
if (live_transcoding_task_list.length) {
// 第二步获取url
const videoInfo = await client.getVideoUrlFromDefinition({
drive_id: this.drive_id,
file_id: this.file_id,
template_id: live_transcoding_task_list[0].template_id,
url_expire_sec: 3600,
});
if (
videoInfo.video_preview_play_info.live_transcoding_task_list.length &&
videoInfo.video_preview_play_info.live_transcoding_task_list[0].url
) {
// 第三步获取url
this.url = videoInfo.video_preview_play_info.live_transcoding_task_list[0].url;
}
}
} catch (error) {
console.log(error);
}
},
},
watch: {
url(value) {
if (value) {
this.player.pause();
// 修改url
this.player.src({
src: value,
type: 'application/x-mpegURL',
});
this.player.load();
this.player.play();
}
},
},
beforeDestroy() {
this.waitingTimer && clearInterval(this.waitingTimer);
},
};
</script>
archiveFiles 方法
服务端打包文件,获取async_task_id。
const result = await client.archiveFiles(params, options)
参数说明
字段 | 类型 | 必选 | 说明 |
params | IArchiveFileReq | 是 | 打包文件信息 |
options | IPDSRequestConfig | 否 | 其它配置项 |
IArchiveFileReq
字段 | 类型 | 必选 | 说明 |
drive_id | string | 是 | 云盘id |
name | string | 是 | 要打包的任务名称 |
files | array | 是 | 要打包的文件列表,每一项格式 { file_id: string } |
返回值
字段 | 类型 | 必选 | 说明 |
result | object | 是 | 返回 async_task_id, { async_task_id: string } |
pollingArchiveFiles 方法
服务端打包文件,直接返回结果,此方法是在 archiveFiles 方法上的进一步封装处理,可根据需要选择调用。
const result = await client.pollingArchiveFiles(params, options)
参数说明
字段 | 类型 | 必选 | 说明 |
params | IArchiveFileReq | 是 | 打包文件信息 |
options | IPDSRequestConfig | 否 | 其它配置项 |
IArchiveFileReq
字段 | 类型 | 必选 | 说明 |
drive_id | string | 是 | 云盘id |
name | string | 是 | 要打包的任务名称 |
files | array | 是 | 要打包的文件列表,每一项格式 { file_id: string } |
返回
字段 | 类型 | 必选 | 说明 |
result | IAsyncTaskRes | 是 | 打包进度结果 |
const downloadArchiveFiles = async () => {
const archiveName = "download.zip";
try {
const params = {
drive_id: "xxxxx",
files: ["xxxxx", "xxxx"],
name: archiveName,
};
// pollingArchiveFiles 只会返回 Failed 或者 Succeed,对于Running状态会自动轮询
const { state, url, message } = await client.pollingArchiveFiles(params);
if (state === "Failed") {
throw Error("Failed to archive files, cause: ", message);
} else {
// 下载压缩文件
const link = document.createElement("a");
link.href = url;
link.download = archiveName;
link.click();
}
} catch (err) {
console.log(err);
}
};