开发 行业对接说明 内容类对接 高光片段上线接口
# 高光片段上传接口
更新时间:2023-02-08 11:00:04
# 1 接口概述
# 1.1 接口介绍
该接口用于第三方上传视频资源的高光片段,在各个展示渠道播放。
# 1.2 上传形式
支持整片上传和分片上传两种形式:
- 整片上传:直接上传完整的高光片段
- 分片上传:把高光片段分成多片上传,全部上传完成后提交
# 1.3 上传规则
- 整片上传:大小限制在10M以内
- 分片上传,每个分片大小限制在10M以内
# 1.4 流程说明
上传视频流程:
1.开发者访问申请上传接口,获得上传token和上传地址
2.根据视频大小选择整片上传和分片上传
(1)小于10M的视频整片上传,访问整片上传接口,上传完整的视频
(2)大于10M对视频分片上传,单个分片在10M以内,访问分片上传接口,按顺序依次上传所有分片,完成后提交分片
3.开发者访问完成上传接口,获得上传视频对应的videoId
# 2 接口说明
# 2.1 申请上传
项目 | 值 |
---|---|
Host | https://open.kuaishou.com |
Path | /openapi/mp/developer/video/upload/apply |
Method | POST |
Content-Type | application/json |
Request Param
参数 | 是否必须 | 类型 | 备注 | 代码示例 |
app_id | 是 | string | 应用ID,放到 query param,即url后面 | app_id=ks670191921327355224 |
access_token | 是 | string | 小程序token,获取方式见附录,放到 query param,即url后面 | access_token=ChFvYXV0aC5hY2Nlc3NUb2tlbhJgdeDIR4WqaJkHl C0rWsm1IUKa4IcgTZL4NczTi5S2daYM2JSarqjH0ux80LfPfzme1sD 42QX7C--LZN61r9rsJb13mDcF5u_rSZULrXfwScjGw2WQ0L2yw3D 5BgQI6ibjGhIgQfvkqD5FqqWtQ2y0WGxSDjAiIMD5tarktstCh7XBr4 DgFPBuCK6nGPDdPa7fALvfhV0fKAUwAQ |
Response
{
"result": 1,
"error_msg": "success",
"data": {
"upload_token": "dasdasddasdasdasdasdas",
"endpoint": "uploader1.test.gifshow.com"
}
}
错误码说明
ERROR CDEO | 描述 | 处理方式 |
---|---|---|
1 | 成功 | |
10000200 | 参数错误 | 根据error_msg提示,检查参数是否合法 |
100200102 | 无效的 access_token | 重新获取 accss_token |
100200100 | 无效的 access_token | 重新获取 accss_token |
10000412 | 小程序应用信息不存在 | 检查自己的appId 是否写错 |
10000500 | 内部错误 | 保存错误现场,反馈给小程序开发团队 |
# 2.2 上传文件
整片上传与分片上传二选一
- 10M以内的数据使用整片上传
- 10M以上的数据使用分片上传,单个分片在10M以内
支持常见的视频格式:mp4、ts、mov、mkv、flv、wmv、mpg、3gp、webm、avi
Host为第一步申请上传接口返回的endpoint
# (1) 整片上传
项目 | 值 |
---|---|
Host | http://{endpoint} |
Path | /api/upload |
Method | POST |
Content-Type | - |
Request Param
参数 | 是否必须 | 类型 | 备注 | 代码示例 |
---|---|---|---|---|
upload_token | 是 | string | 上传token,放到 query param,即url后面 | upload_token=LrXfwScjGw2WQ0L2yw3 |
Body 直接传递上传文件二进制内容
Reponse
判断response的HTTP状态码,200即为上传成功。
curl参考
curl -X POST "http://uploader.test.gifshow.com/api/upload?&upload_token=xxxxx" --data-binary "二进制文件"
# (2) 分片上传
第一步:上传分片
项目 | 值 |
---|---|
Host | http://{endpoint} |
Path | /api/upload/fragment |
Method | POST |
Content-Type | - |
Request Param
参数 | 是否必须 | 类型 | 备注 | 代码示例 |
---|---|---|---|---|
fragment_id | 是 | number | 分片ID,从0开始,放到 query param,即url后面 | fragment_id=0 |
upload_token | 是 | string | 上传token,放到 query param,即url后面 | upload_token=LrXfwScjGw2WQ0L2yw3 |
Body 直接传递上传文件二进制内容
Reponse
判断response的HTTP状态码,200即为上传成功。
curl参考
curl -X POST "http://uploader.test.gifshow.com/api/upload/fragment?fragment_id=0&upload_token=xxxxx" --data-binary "二进制文件分片0"
第二步:提交分片
项目 | 值 |
---|---|
Host | http://{endpoint} |
Path | /api/upload/complete |
Method | POST |
Content-Type | - |
Request Param
参数 | 是否必须 | 类型 | 备注 | 代码示例 |
---|---|---|---|---|
fragment_count | 是 | number | 分片总数,放到 query param,即url后面 | fragment_count=100 |
upload_token | 是 | string | 上传token,放到 query param,即url后面 | upload_token=LrXfwScjGw2WQ0L2yw3 |
Reponse
判断response的HTTP状态码,200即为上传成功。
curl参考
curl -X POST "http://uploader.test.gifshow.com/api/upload/complete?fragment_count=100&upload_token=xxxxx"
# 2.3 完成上传
文件上传完成后,会返回具体的videoId,videoId需要保存下来,后续添加/更新内容时使用:Feed卡片内容类 open api 接口文档
如果重复上传视频导致后续更新内容时videoId不一致,会触发重复转码和重复审核,会影响线上内容分发。
项目 | 值 |
---|---|
Host | https://open.kuaishou.com |
Path | /openapi/mp/developer/video/upload/publish |
Method | POST |
Content-Type | application/json |
Request Param
参数 | 是否必须 | 类型 | 备注 | 代码示例 |
app_id | 是 | string | 应用ID,放到 query param,即url后面 | app_id=ks670191921327355224 |
access_token | 是 | string | 小程序token,获取方式见附录,放到 query param,即url后面 | access_token=ChFvYXV0aC5hY2Nlc3NUb2tlbhJgdeDIR4WqaJkHl C0rWsm1IUKa4IcgTZL4NczTi5S2daYM2JSarqjH0ux80LfPfzme1sD 42QX7C--LZN61r9rsJb13mDcF5u_rSZULrXfwScjGw2WQ0L2yw3D 5BgQI6ibjGhIgQfvkqD5FqqWtQ2y0WGxSDjAiIMD5tarktstCh7XBr4 DgFPBuCK6nGPDdPa7fALvfhV0fKAUwAQ |
upload_token | 是 | string | 上传token,放到 query param,即url后面 | upload_token=LrXfwScjGw2WQ0L2yw3 |
Response
{
"result": 1,
"error_msg": "success",
"data": {
"videoId": "SDjAiIMD5"
}
}
错误码说明
ERROR CDEO | 描述 | 处理方式 |
---|---|---|
1 | 成功 | |
10000200 | 参数错误 | 根据error_msg提示,检查参数是否合法 |
100200102 | 无效的 access_token | 重新获取 accss_token |
100200100 | 无效的 access_token | 重新获取 accss_token |
10000412 | 小程序应用信息不存在 | 检查自己的appId 是否写错 |
10000500 | 内部错误 | 保存错误现场,反馈给小程序开发团队 |
10000504 | 视频上传token不存在 | 检查upload_token是否写错 |
# 3 分片上传代码示例
public void sendFeedMatchHttp() {
// 申请上传
RequestBody body = RequestBody.create(JSON, "");
Response response = sendPostRequest(body,
"https://open.kuaishou.com/openapi/mp/developer/video/upload/apply?"
+ "app_id={your_appId}"
+ "&access_token={your_accessToken}");
//分片上传
String res = response.body().string();
ObjectMapper mapper = new ObjectMapper();
Map<String, String> data = (Map<String, String>) mapper.readValue(res, Map.class).get("data");
String uploadToken = data.get("upload_token");
String endpoint = data.get("endpoint");
File file = new File("{your_fileName}");
long fileSize = file.length();
long offset = 0;
int index = 0;
int BLOCK_SIZE = 1024 * 1024 * 10; // 10M
while (offset <= fileSize) {
byte[] fileBlock = getBlock(offset, file, BLOCK_SIZE);
if (fileBlock == null) {
break;
}
body = RequestBody.create(BINARY, fileBlock);
response = sendPostRequest(body, "http://" + endpoint + "/api/upload/fragment?"
+ "fragment_id=" + index
+ "&upload_token=" + uploadToken);
offset += fileBlock.length;
index++;
}
file.close();
// 提交分片
body = RequestBody.create(JSON, "");
response = sendPostRequest(body, "http://" + endpoint + "/api/upload/complete?"
+ "fragment_count=" + index
+ "&upload_token=" + uploadToken);
// 完成上传
response = sendPostRequest(body,
"https://open.kuaishou.com/openapi/mp/developer/video/upload/publish?"
+ "app_id={your_appId}"
+ "&access_token={your_accessToken}"
+ "&upload_token=" + uploadToken);
}
public byte[] getBlock(long offset, File file, int blockSize) {
byte[] result = new byte[blockSize];
RandomAccessFile accessFile = null;
accessFile = new RandomAccessFile(file, "r");
accessFile.seek(offset);
int readSize = accessFile.read(result);
if (readSize == -1) {
return null;
} else if (readSize == blockSize) {
return result;
} else {
byte[] tmpByte = new byte[readSize];
System.arraycopy(result, 0, tmpByte, 0, readSize);
return tmpByte;
}
}
public Response sendPostRequest(RequestBody body, String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
OkHttpClient okHttpClient = new OkHttpClient().newBuilder().build();
return okHttpClient.newCall(request).execute();
}