文档首页/ 视频点播 VOD/ API参考/ 应用示例/ 示例2:媒资分段上传(20M以上)
更新时间:2024-12-12 GMT+08:00
分享

示例2:媒资分段上传(20M以上)

场景描述

示例1:媒资上传(20M以下)已介绍了如何将小于20M大小的音视频文件上传到点播服务。若您需要上传的音视频文件的大小大于20M,您可以调用VOD API进行分段上传。

本章节指导用户如何使用API调用的方式上传一个文件大小大于20M的视频文件。

前提条件

  • 已明确需要上传媒资的点播服务所在的区域信息,详见使用前必读
  • 已获取需要上传到对应点播服务所在区域的项目ID,具体获取方法请参见获取项目ID
  • 待上传的视频文件已完成二进制流分割,建议每个分段的大小不超过20M。
  • OBS接口列举已上传的段支持响应段的取值范围[1,10000],段大小[100KB,5GB]。默认最多响应1000段,如果用户分段数目超出1000,需参考OBS接口列举已上传的段进行处理。

操作步骤

  1. 获取用户Token,用于调用点播接口时进行认证鉴权。

    详细信息请参见构造请求。以“华北-北京四”为示例,若您需要调用其它区域的点播接口,请替换成对应区域的IAM终端节点

    POST https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens
    Content-Type: application/json
    
    {
      "auth": {
        "identity": {
          "methods": [
            "password"
          ],
          "password": {
            "user": {
              "name": "username", 
              "password": "password", 
              "domain": {
                "name": "domainname"   
              }
            }
          }
        },
        "scope": {
          "project": {
             "name": "projectname"
          }
        }
      }
    }
    图2所示,红框中的信息为获取用户Token。
    图2 获取用户Token

  2. 调用创建媒资:上传方式接口,创建媒资。

    1. 选择POST请求方法并输入URI。
      https://vod.cn-north-4.myhuaweicloud.com/v1.0/{project_id}/asset
    2. 请求消息头中增加“X-Auth-Token”,值设置为步骤1中获取的用户Token。
    3. Request Body中传入参数如下:
      {
      	"title": "testVideo",
      	"description": "test",
      	"category_id": 87748,
      	"video_name": "test.mp4",
      	"video_type": "MP4",
      	"auto_publish": 0    
      }

      示例仅设置了部分媒资参数,您可以根据实际需求参考创建媒资:上传方式接口的请求参数设置。

    4. 请求响应成功后,返回处理媒资ID、视频上传地址及存储视频文件的OBS桶信息。
      {
          "asset_id": "fea62a2845e43c37b4cbfb017c0d0821",
          "video_upload_url": "https://vod-bucket-65-cn-north-4.obs.cn-north-4.myhuaweicloud.com:443/05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4?AWSAccessKeyId=MZH0LUL329N1SSXNB3S4&Expires=1596700132&Signature=GiHTcO2avO9B84sH8A5wL2GieCI%3D",
          "cover_upload_url": null,
          "subtitle_upload_urls": [],
          "target": {
              "bucket": "vod-bucket-65-cn-north-4",
              "location": "cn-north-4",
              "object": "05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4"
          }
      }

  3. 调用获取分段上传授权接口,向OBS获取初始化上传任务的授权。

    1. 选择GET请求方法并输入URI。
      https://vod.cn-north-4.myhuaweicloud.com/v1.1/{project_id}/asset/authority?http_verb=POST&content_type=video/mp4&bucket=vod-bucket-65-cn-north-4&object_key=05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4
      • http_verb:分段上传时调用OBS接口的HTTP方法,具体操作需要的HTTP方法请参见OBS API参考
      • content_type:文件类型对应的HTTP Content-type,您需要根据上传的文件类型进行设置。
        • 视频文件:video/视频格式,如:“video/mp4”。更多视频文件格式对应的请求头填写规则,请参见表1
        • 音频文件:audio/音频格式,如:“audio/mp3”。更多音频文件格式对应的请求头填写规则,请参见表2
        • 图片文件:image/图片格式,如:“image/png”
        • 字幕文件:application/octet-stream。
      • bucket:存储视频文件的OBS桶,步骤2.d中返回的对应“bucket”字段。
      • object_key:OBS桶中的对象名,步骤2.d中返回的对应“object”字段。
      表1 视频文件请求头填写说明

      文件后缀

      Content-Type

      MP4

      video/mp4

      MOV

      video/quicktime

      MXF

      application/mxf

      TS

      video/mp2t

      MPG

      video/mpeg

      FLV

      video/flv

      WMV

      video/x-ms-wmv

      AVI

      video/x-msvideo

      M4V

      video/m4v

      F4V

      application/f4v

      MPEG

      video/mpeg

      M3U8

      application/octet-stream

      _3GP/3GP

      video/3gpp

      ASF

      video/x-ms-asf

      MKV

      video/x-matroska

      WEBM

      video/webm

      MPD

      video/dash

      表2 音频文件请求头填写说明

      文件后缀

      Content-Type

      MP3

      audio/mp3

      WMA

      audio/wma

      APE

      audio/ape

      FLAC

      audio/flac

      AAC

      audio/aac

      AC3

      audio/ac3

      MMF

      audio/mmf

      AMR

      audio/amr

      M4A

      audio/m4a

      M4R

      audio/m4r

      OGG

      audio/ogg

      WAV

      audio/wav

      WV

      audio/wv

      MP2

      audio/mp2

    2. 请求消息头中增加“X-Auth-Token”,值设置为步骤1中获取的用户Token。
    3. 请求响应成功后,返回授权信息。
      {
          "sign_str": "https://vod-bucket-65-cn-north-4.obs.cn-north-4.myhuaweicloud.com:443/05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4?uploads&AWSAccessKeyId=MZH0LUL329N1SSXNB3S4&Expires=1596706429&Signature=5D15iJUcTkoWLpE2vn54FQZskXA%3D"
      }

  4. 调用OBS的初始化上传段任务接口,初始化视频分段上传任务。

    OBS不支持直接在API Explorer上验证,需要使用postman等第三方工具,构造请求做验证。

    1. 选择POST请求方法并输入步骤3.c返回的已授权URI。
      https://vod-bucket-65-cn-north-4.obs.cn-north-4.myhuaweicloud.com:443/05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4?uploads&AWSAccessKeyId=MZH0LUL329N1SSXNB3S4&Expires=1596706429&Signature=5D15iJUcTkoWLpE2vn54FQZskXA%3D
    2. 请求消息头中增加“Content-Type”,值设置为文件类型,请根据实际上传。文件类型填写规则请参见步骤3
    3. 请求成功,返回初始化信息。
      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <InitiateMultipartUploadResult xmlns="http://obs.cn-north-4.myhuaweicloud.com/doc/2015-06-30/">
          <Bucket>vod-bucket-65-cn-north-4</Bucket>
          <Key>05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4</Key>
          <UploadId>00000173C2ED862344C835374DFE33C8</UploadId>
      </InitiateMultipartUploadResult>

  5. 调用获取分段上传授权接口,获取分段上传的授权。

    1. 选择GET请求方法并输入URI。
      https://vod.cn-north-4.myhuaweicloud.com/v1.1/{project_id}/asset/authority?http_verb=PUT&content_type=video/mp4&bucket=vod-bucket-65-cn-north-4&object_key=05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4&content_md5=hHZXtgjYL2fmLpu%2byQ%2bXgg%3d%3d&upload_id=00000173C2ED862344C835374DFE33C8&part_number=1
      • http_verb:分段上传的HTTP方法为PUT。
      • content_type:文件类型对应的HTTP Content-type,您需要根据上传的文件类型进行设置,文件类型填写规则请参见步骤3
      • bucket:存储视频文件的OBS桶,步骤2.d中返回的对应“bucket”字段。
      • object_key:OBS桶中的对象名,步骤2.d中返回的对应“object”字段。
      • content_md5:每个视频分段的MD5值,该值为必填项,具体生成方法可以参考生成MD5值注意:如有特殊字符请求,需进行转义。
      • upload_id:上传任务的id,步骤4.c返回的“UploadId”字段。
      • part_number:每一个上传段的段号。
    2. 请求消息头中增加“X-Auth-Token”,值设置为步骤1中获取的用户Token。
    3. 请求响应成功后,返回分段上传的授权信息。
      {
          "sign_str": "https://vod-bucket-65-cn-north-4.obs.cn-north-4.myhuaweicloud.com:443/05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4?AWSAccessKeyId=MZH0LUL329N1SSXNB3S4&Expires=1596708691&partNumber=1&uploadId=00000173C2ED862344C835374DFE33C8&Signature=cjw3CmUFeNBFAuLWBTsPRp9NfsQ%3D"
      }

  6. 调用OBS的上传段接口,上传视频文件的第一个分段。

    OBS不支持直接在API Explorer上验证,需要使用postman等第三方工具,构造请求做验证。

    1. 选择PUT请求方法并输入步骤5.c返回的已授权URI。
      https://vod-bucket-65-cn-north-4.obs.cn-north-4.myhuaweicloud.com:443/05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4?AWSAccessKeyId=MZH0LUL329N1SSXNB3S4&Expires=1596708691&partNumber=1&uploadId=00000173C2ED862344C835374DFE33C8&Signature=cjw3CmUFeNBFAuLWBTsPRp9NfsQ%3D
    2. 请求消息头中增加“Content-Type”,值设置为“application/octet-stream”。若步骤5.a设置了“content_md5”参数,则请求消息头中必须增加“Content-MD5”,值设置为对应分段的MD5值(不需要转义),否则将会导致上传失败。
    3. 请求Body中使用二进制方式上传视频文件的第一个分段。
    4. 请求成功,返回状态码“200 OK”

  7. 参考操作步骤5-步骤6,上传视频文件的所有分段。
  8. 调用获取分段上传授权接口,获取列举已上传段的授权。

    1. 选择GET请求方法并输入URI。
      https://vod.cn-north-4.myhuaweicloud.com/v1.1/{project_id}/asset/authority?http_verb=GET&bucket=vod-bucket-65-cn-north-4&object_key=05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4&upload_id=000001717E28524B44CEFF2C2CE1B06A
      • http_verb:列举已上传段的HTTP方法为GET。
      • bucket:存储视频文件的OBS桶,步骤2.d中返回的对应“bucket”字段。
      • object_key:OBS桶中的对象名,步骤2.d中返回的对应“object”字段。
      • upload_id:上传任务的id,步骤4.c返回的“UploadId”字段。
    2. 请求消息头中增加“X-Auth-Token”,值设置为步骤1中获取的用户Token。
    3. 请求响应成功后,返回列举已上传段的授权信息。
      {
          "sign_str": "https://vod-bucket-65-cn-north-4.obs.cn-north-4.myhuaweicloud.com:443/05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4?AWSAccessKeyId=MZH0LUL329N1SSXNB3S4&Expires=1596710054&uploadId=000001717E28524B44CEFF2C2CE1B06A&Signature=G5EOUr488cyPIretp8lgQZmpPw0%3D"
      }

  9. 调用OBS接口列举已上传的段,获取视频文件所有上传段的相关信息。

    • OBS接口列举已上传的段支持响应段的取值范围[1,10000],段大小[100KB,5GB]。默认最多响应1000段,如果用户分段数目超出1000,需参考OBS接口列举已上传的段进行处理。
    • OBS不支持直接在API Explorer上验证,需要使用postman等第三方工具,构造请求做验证。

    注意:请求消息头中的“Content-Type”属性设置成null或者不携带。

    1. 选择GET请求方法并输入步骤8.c返回的已授权URI。
      https://vod-bucket-65-cn-north-4.obs.cn-north-4.myhuaweicloud.com:443/05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4?AWSAccessKeyId=MZH0LUL329N1SSXNB3S4&Expires=1596710054&uploadId=000001717E28524B44CEFF2C2CE1B06A&Signature=G5EOUr488cyPIretp8lgQZmpPw0%3D
    2. 请求成功,返回已上传段的相关信息。
      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <ListPartsResult xmlns="http://obs.cn-north-4.myhuaweicloud.com/doc/2015-06-30/">
          <Bucket>vod-bucket-65-cn-north-4</Bucket>
          <Key>05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4</Key>
          <UploadId>00000173C2ED862344C835374DFE33C8</UploadId>
          <Initiator>
              <ID>d9235b9f3cf549499924f6de095241af:a96ecebcb3994e34b074e48f3dfc8237</ID>
              <DisplayName>xxx</DisplayName>
          </Initiator>
          <Owner>
              <ID>d9235b9f3cf549499924f6de095241af</ID>
              <DisplayName>xxx</DisplayName>
          </Owner>
          <StorageClass>STANDARD</StorageClass>
          <PartNumberMarker>0</PartNumberMarker>
          <NextPartNumberMarker>4</NextPartNumberMarker>
          <MaxParts>1000</MaxParts>
          <IsTruncated>false</IsTruncated>
          <Part>
              <PartNumber>1</PartNumber>
              <LastModified>2020-08-06T09:05:10.192Z</LastModified>
              <ETag>"847657b608d82f67e62e9bbec90f9782"</ETag>
              <Size>10000000</Size>
          </Part>
          <Part>
              <PartNumber>2</PartNumber>
              <LastModified>2020-08-06T08:02:02.821Z</LastModified>
              <ETag>"9a6a36ed9086a3a2fea130220e1e809c"</ETag>
              <Size>10000000</Size>
          </Part>
          <Part>
              <PartNumber>3</PartNumber>
              <LastModified>2020-08-06T08:04:19.711Z</LastModified>
              <ETag>"3a3afe552832bee0faf081c1e720067e"</ETag>
              <Size>10000000</Size>
          </Part>
          <Part>
              <PartNumber>4</PartNumber>
              <LastModified>2020-08-06T07:23:17.160Z</LastModified>
              <ETag>"6335af859c20ccef26b27ea691e7ecf7"</ETag>
              <Size>7472445</Size>
          </Part>
      </ListPartsResult>

  10. 调用获取分段上传授权接口,获取合并段授权。

    1. 选择GET请求方法并输入URI。
      https://vod.cn-north-4.myhuaweicloud.com/v1.1/{project_id}/asset/authority?http_verb=POST&bucket=vod-bucket-65-cn-north-4&object_key=05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4&upload_id=00000173C2ED862344C835374DFE33C8
      • http_verb:合并段的HTTP方法为POST。
      • bucket:存储视频文件的OBS桶,步骤2.d中返回的对应“bucket”字段。
      • object_key:OBS桶中的对象名,步骤2.d中返回的对应“object”字段。
      • upload_id:上传任务的id,步骤4.c返回的“UploadId”字段。
    2. 请求消息头中增加“X-Auth-Token”,值设置为步骤1中获取的用户Token。
    3. 请求响应成功后,返回合上传段的授权信息。
      {
          "sign_str": "https://vod-bucket-65-cn-north-4.obs.cn-north-4.myhuaweicloud.com:443/05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4?AWSAccessKeyId=MZH0LUL329N1SSXNB3S4&Expires=1596709340&uploadId=000001717E28524B44CEFF2C2CE1B06A&Signature=Pa6IaMbH1Ofa0Vi%2BCbkdgmWzm70%3D"
      }

  11. 调用OBS的合并段接口,将上传的分段合并成一个视频文件。

    OBS不支持直接在API Explorer上验证,需要使用postman等第三方工具,构造请求做验证。

    1. 选择POST请求方法并输入步骤10.c返回的已授权URI。
      https://vod-bucket-65-cn-north-4.obs.cn-north-4.myhuaweicloud.com:443/05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4?AWSAccessKeyId=MZH0LUL329N1SSXNB3S4&Expires=1596708691&partNumber=1&uploadId=00000173C2ED862344C835374DFE33C8&Signature=cjw3CmUFeNBFAuLWBTsPRp9NfsQ%3D
    2. 请求消息头中增加“Content-Type”,值设置为“application/xml”
    3. Request Body中传入参数如下:
      <CompleteMultipartUpload> 
           <Part>
              <PartNumber>1</PartNumber>
              <ETag>"847657b608d82f67e62e9bbec90f9782"</ETag>
          </Part>
          <Part>
              <PartNumber>2</PartNumber>
              <ETag>"9a6a36ed9086a3a2fea130220e1e809c"</ETag>
          </Part>
          <Part>
              <PartNumber>3</PartNumber>
              <ETag>"3a3afe552832bee0faf081c1e720067e"</ETag>
          </Part>
          <Part>
              <PartNumber>4</PartNumber>
              <ETag>"6335af859c20ccef26b27ea691e7ecf7"</ETag>
          </Part>
      </CompleteMultipartUpload>
      • PartNumber:上传的段号。
      • ETag:上传段成功后返回的ETag值,步骤9.b中的返回信息有每个段对应的ETag值。
    4. 请求成功,返回合并段的相关信息。
      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <CompleteMultipartUploadResult xmlns="http://obs.cn-north-4.myhuaweicloud.com/doc/2015-06-30/">
          <Location>05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4</Location>
          <Bucket>vod-bucket-65-cn-north-4</Bucket>
          <Key>05041fffa4002****f6dc009cc6f8f33/fea62a2845e43c37b4cbfb017c0d0821/d1f221f09f6bffefb882c8f9e167483a.mp4</Key>
          <ETag>"87f450dd18b666dfcdf902ac6b162b5a-4"</ETag>
      </CompleteMultipartUploadResult>

  12. 调用确认媒资上传接口,完成媒资上传确认。

    1. 选择POST请求方法并输入URI。
      https://vod.cn-north-4.myhuaweicloud.com/v1.0/{project_id}/asset/status/uploaded
    2. 请求消息头中增加“X-Auth-Token”,值设置为步骤1中获取的用户Token。
    3. Request Body中传入参数如下:
      {
         "asset_id": "fea62a2845e43c37b4cbfb017c0d0821",
         "status":"CREATED" 
      }
    4. 请求响应成功后,返回媒资ID。
      {
         "asset_id": "fea62a2845e43c37b4cbfb017c0d0821" 
      }

分段上传Java语言代码示例

获取分段上传Java语言的示例代码,如下所示:

分段上传JavaScript语言代码示例

获取分段上传JavaScript语言的示例代码,如JavaScript所示。

分段上传Python语言代码示例

获取分段上传Python语言的示例代码,如Python所示。

分段上传Go语言代码示例

获取分段上传Go语言的示例代码,如Go所示。

分段上传PHP语言代码示例

获取分段上传PHP语言的示例代码,如PHP所示。

相关文档