# 高光片段上传接口

更新时间:2023-02-08 11:00:04

# 1 接口概述

# 1.1 接口介绍

该接口用于第三方上传视频资源的高光片段,在各个展示渠道播放。

# 1.2 上传形式

支持整片上传和分片上传两种形式:

  • 整片上传:直接上传完整的高光片段
  • 分片上传:把高光片段分成多片上传,全部上传完成后提交

# 1.3 上传规则

  • 整片上传:大小限制在10M以内
  • 分片上传,每个分片大小限制在10M以内

# 1.4 流程说明

上传视频流程:

1.开发者访问申请上传接口,获得上传token和上传地址

2.根据视频大小选择整片上传和分片上传

(1)小于10M的视频整片上传,访问整片上传接口,上传完整的视频

img

(2)大于10M对视频分片上传,单个分片在10M以内,访问分片上传接口,按顺序依次上传所有分片,完成后提交分片

img

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_idstring应用ID,放到 query param,即url后面app_id=ks670191921327355224
access_tokenstring小程序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_idstring应用ID,放到 query param,即url后面app_id=ks670191921327355224
access_tokenstring小程序token,获取方式见附录,放到 query param,即url后面access_token=ChFvYXV0aC5hY2Nlc3NUb2tlbhJgdeDIR4WqaJkHl
C0rWsm1IUKa4IcgTZL4NczTi5S2daYM2JSarqjH0ux80LfPfzme1sD
42QX7C--LZN61r9rsJb13mDcF5u_rSZULrXfwScjGw2WQ0L2yw3D
5BgQI6ibjGhIgQfvkqD5FqqWtQ2y0WGxSDjAiIMD5tarktstCh7XBr4
DgFPBuCK6nGPDdPa7fALvfhV0fKAUwAQ
upload_tokenstring上传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();
}
Copyright ©2025, All Rights Reserved