视频托管服务接口
版本: 1.1.0 时间: 2021.11.30
获取上传地址
- 接口:/api/video/upload
- 请求方式:POST
- 说明:获取上传地址
- 入参列表
参数名称 | 类型 | 默认值 | 是否必传 | 解释 |
---|
access_key | string | 无 | 是 | 访问秘钥 |
timestamp | int | 无 | 是 | 请求时间戳 |
sign | string | 无 | 是 | 签名 |
curl -X POST https://api.xxx.com/api/video/upload?access_key=xxx×tamp=xxx&sign=xxx
1
{
"code": 200,
"msg": "success",
"logid": "7a1e2b09-ee41-44a1-a21c-80dfbd500e9b",
"data": {
"url": "http://xxx.xxxx.com/8a0b88d0-e3fe-589e-b611-e03ce99c9e3f%2FMTI%3D.mp4%0A?Expires=1611823653&OSSAccessKeyId=V5PSR7b2JqZW&Signature=eosEagTbpTYNejYolpGbyotdsPE%3D&callback=eyJjYWxsYmFja0JvZHkiOiJvYmplY3Rfa2V5PSR7b2JqZWN0fVx1MDAyNnNpemU9JHtzaXplfVx1MDAyNmNvbnRlbnRfdHlwZT0ke21pbWVUeXBlfVx1MDAyNmhlaWdodD0ke2ltYWdlSW5mby5oZWlnaHR9XHUwMDI2d2lkdGg9JHtpbWFnZUluZm8ud2lkdGh9XHUwMDI2ZXRhZz0ke2V0YWd9XHUwMDI2dXBsb2FkZXJfaWQ9MTIzM1x1MDAyNmFwcF9pZD0wXHUwMDI2dHlwZT0wXHUwMDI2ZXh0ZW5kPVx1MDAyNmJ1Y2tldD15aWxhbi1qYXJ2aXMiLCJjYWxsYmFja0JvZHlUeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwiY2FsbGJhY2tVcmwiOiJodHRwOi8vNDcuOTQuMjMuMTg5Ojg1MTAvb3NzL2FsaS9jYWxsYmFjayJ9",
"timeout": 3600,
"status": "waiting",
"id": "nJ5vjR7vQ5VZ"
}
}
1
2
3
4
5
6
7
8
9
10
11
参数 | 类型 | 说明及样例 |
---|
code | int | 接口状态,200 表示接口返回正常,其它值表示接口异常 |
msg | string | 接口返回消息 |
logid | string | 请求的 id |
url | string | 直接上传文件的地址 |
timeout | int | 地址有效期 |
status | string | 视频状态 |
id | string | 视频 ID |
获取播放地址
- 接口:/api/video/play
- 请求方式:POST
- 说明:获取视频播放地址
- 入参列表
参数名称 | 类型 | 默认值 | 是否必传 | 解释 |
---|
access_key | string | 无 | 是 | 访问秘钥 |
timestamp | int | 无 | 是 | 请求时间戳 |
sign | string | 无 | 是 | 签名 |
参数名称 | 类型 | 默认值 | 是否必传 | 解释 |
---|
id | string | 无 | 是 | 视频 ID |
curl -X POST https://api.xxx.com/api/video/play?access_key=xxx×tamp=xxx&sign=xxx -d '{"id":"xxx"}'
1
{
"code": 200,
"msg": "success",
"logid": "7a1e2b09-ee41-44a1-a21c-80dfbd500e9b",
"data": {
"play": [
{
"url": "http://xxx.xxx.com/20180210/4409b0d413bc6c413359bb94088d13be?auth_key=1544014458-90-0-391b8bdc284141b2d59679e34e7d13a0",
"type": "video",
"resolution": "HD",
"width": 1280,
"height": 720,
"duration": 20,
"src": "u"
}
],
"status": "ready",
"id": "nJ5vjR7vQ5VZ",
"created_at": 1609273149
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
参数 | 类型 | 说明及样例 |
---|
code | int | 接口状态,200 表示接口返回正常,其它值表示接口异常 |
msg | string | 接口返回消息 |
logid | string | 请求的 id |
url | string | 视频实际播放地址 |
type | string | 类型 |
resolution | string | 分辨率 |
width | int | 宽 |
height | int | 高 |
duration | float | 视频时长 |
src | string | u:用户 y:定制 |
status | string | 视频状态 |
id | string | 视频 ID |
created_at | int | 视频创建时间 |
获取视频列表
- 接口:/api/video/list
- 请求方式:POST
- 说明:获取用户视频列表
- 入参列表
参数名称 | 类型 | 默认值 | 是否必传 | 解释 |
---|
access_key | string | 无 | 是 | 访问秘钥 |
timestamp | int | 无 | 是 | 请求时间戳 |
sign | string | 无 | 是 | 签名 |
参数名称 | 类型 | 默认值 | 是否必传 | 解释 |
---|
page | int | 无 | 是 | 页码 |
size | int | 无 | 是 | 条数 |
curl -X POST https://api.xxx.com/api/video/list?access_key=xxx×tamp=xxx&sign=xxx -d '{"page":1,"size":10}'
1
{
"code": 200,
"msg": "success",
"logid": "7a1e2b09-ee41-44a1-a21c-80dfbd500e9b",
"data": [
{
"play": [
{
"url": "http://xxx.xxx.com/20180210/4409b0d413bc6c413359bb94088d13be?auth_key=1544014458-90-0-391b8bdc284141b2d59679e34e7d13a0",
"type": "video",
"resolution": "HD",
"width": 1280,
"height": 720,
"duration": 20,
"src": "u"
}
],
"status": "ready",
"id": "nJ5vjR7vQ5VZ",
"created_at": 1609273149
}
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
参数 | 类型 | 说明及样例 |
---|
code | int | 接口状态,200 表示接口返回正常,其它值表示接口异常 |
msg | string | 接口返回消息 |
logid | string | 请求的 id |
url | string | 视频实际播放地址 |
type | string | 类型 |
resolution | string | 分辨率 |
width | int | 宽 |
height | int | 高 |
duration | float | 视频时长 |
src | string | u:用户 y:定制 |
status | string | 视频状态 |
id | string | 视频 ID |
created_at | int | 视频创建时间 |
Fetch 上传
- 接口:/api/video/fetch
- 请求方式:POST
- 说明:提供文件地址进行上传
- 入参列表
参数名称 | 类型 | 默认值 | 是否必传 | 解释 |
---|
access_key | string | 无 | 是 | 访问秘钥 |
timestamp | int | 无 | 是 | 请求时间戳 |
sign | string | 无 | 是 | 签名 |
参数名称 | 类型 | 默认值 | 是否必传 | 解释 |
---|
input | string | 无 | 是 | 文件地址 |
curl -X POST https://api.xxx.com/api/video/fetch?access_key=xxx×tamp=xxx&sign=xxx
-d '{"input": "http://xxx.xxxx.com/sample.mp4"}'
1
2
{
"code": 200,
"msg": "success",
"logid": "7a1e2b09-ee41-44a1-a21c-80dfbd500e9b",
"data": {
"status": "waiting",
"id": "nJ5vjR7vQ5VZ"
}
}
1
2
3
4
5
6
7
8
9
参数 | 类型 | 说明及样例 |
---|
code | int | 接口状态,200 表示接口返回正常,其它值表示接口异常 |
msg | string | 接口返回消息 |
logid | string | 请求的 id |
status | string | 视频状态 |
id | string | 视频 ID |
附录
接口签名算法
每个接口都需要对请求参数做签名得到 sign,由我方提供私钥 access_token 参与签名。 例如待签名的请求接口(body 中的参数不参与签名)是:
https://api.xxx.com/api/video/upload?access_key=xxx×tamp=xxx
1
计算规则为:
- step 1: 请求参数按照参数名字母升序排列(该例子中有 2 个参数,分别是 access_key 和 timestamp)
- step 2: 请求参数根据&拼接字符串 string(该例子拼接后得到 access_key=xxx×tamp=xxx)
- step 3: 将 step2 的结果和 access_token 拼接(该例子拼接成 access_key=xxx×tamp=xxx&access_token=xxx)
- step 4: 对 step3 得到的字符串进行 MD5(32 位小写)得到 sign
添加 sign 后,最终请求的接口为:
https://api.xxx.com/api/video/upload?access_key=xxx×tamp=xxx&sign=xxx
1
下面是一个使用 python 代码做接口签名的例子
#参数para以字典形式传入,如{"access_key": "xxx", "timestamp": "xxx"}
#参数sk为用户的私钥
def sign_para(para, sk):
d = collections.OrderedDict(sorted(para.items()))
s = '&'.join(['{}={}'.format(k, v) for k, v in d.items()]) + '&access_token={}'.format(sk)
return hashlib.md5(s.encode('utf-8')).hexdigest()
1
2
3
4
5
6
文件上传方法
通过“获取上传地址”接口拿到上传地址后,客户需要在 timeout 时间内,将视频文件上传到该地址,下面是一个上传的例子:
#使用curl上传
curl -X PUT --data-binary @/tmp/12.mp4 -H 'content-type:video/mp4' "http://xxx.xxxx.com/8a0b88d0-e3fe-589e-b611-e03ce99c9e3f%2FMTI%3D.mp4%0A?Expires=1611823653&OSSAccessKeyId=V5PSR7b2JqZW&Signature=eosEagTbpTYNejYolpGbyotdsPE%3D&callback=eyJjYWxsYmFja0JvZHkiOiJvYmplY3Rfa2V5PSR7b2JqZWN0fVx1MDAyNnNpemU9JHtzaXplfVx1MDAyNmNvbnRlbnRfdHlwZT0ke21pbWVUeXBlfVx1MDAyNmhlaWdodD0ke2ltYWdlSW5mby5oZWlnaHR9XHUwMDI2d2lkdGg9JHtpbWFnZUluZm8ud2lkdGh9XHUwMDI2ZXRhZz0ke2V0YWd9XHUwMDI2dXBsb2FkZXJfaWQ9MTIzM1x1MDAyNmFwcF9pZD0wXHUwMDI2dHlwZT0wXHUwMDI2ZXh0ZW5kPVx1MDAyNmJ1Y2tldD15aWxhbi1qYXJ2aXMiLCJjYWxsYmFja0JvZHlUeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwiY2FsbGJhY2tVcmwiOiJodHRwOi8vNDcuOTQuMjMuMTg5Ojg1MTAvb3NzL2FsaS9jYWxsYmFjayJ9"
1
2
#使用Postman上传:
1. 请求方法选择PUT
2. Headers设置content-type为video/mp4
3. Body类型选择binary,然后选择文件
4. 点击Send上传
5. 上传正确应返回:
{
"msg": "success",
"data": {
"file_id": 1234,
"url": "xxx"
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
上传模式说明
- 直接上传:适用于存储在本地的视频文件,通过此方式将文件直接上传到视频托管服务
- Fetch 上传:适用于存储在云端的视频文件,客户提供文件的下载地地址,通过接口传入该下载地址,视频托管服务从该地址下载视频