文件增值服务

以下方法需要打开相应开关才能使用。包括文档预览,音视频转码播放,打包下载。

说明

请求参数中的 options: IPDSRequestConfig 基于 axios 的 request config 封装,详情请看:AxiosRequestConfig

getOfficePreviewUrl 方法

文档预览,需要开通对应的服务才可以使用。

const result = await client.getOfficePreviewUrl(params, options)

参数说明

字段

类型

必选

说明

params

IOfficePreviewReq

要预览的文件

options

IPDSRequestConfig

其它配置项

IOfficePreviewReq

字段

类型

必选

说明

drive_id

string

云盘id。(drive_idshare_id 二选一)

share_id

string

分享id。(drive_idshare_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_idshare_id 二选一)

share_id

string

分享id。(drive_idshare_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_idshare_id二选一)

share_id

string

分享id。(drive_idshare_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);
  } 
};