Spark API

Spark API 是CC视频云平台对外开放的数据接口。利用这些API,可以对接CC视频的数据和功能。当前API的版本号为2.0,目前API仅对合作方开启,如果您想了解Spark API或有使用API的需求,请通过CC视频后台申请API Key,审核通过后方可使用。

获取账户信息


GET api/user

通过此接口,可以获取账户信息。请求示例如下所示:

eg.  http://spark.bokecc.com/api/user

参数列表

参数 含义 备注
userid 用户ID 可选
format 返回结果格式(json或xml) 可选   注:默认返回xml格式内容

返回数据user包含如下字段:

字段名 含义
account 用户账户
version 版本信息
expired 到期时间
space 用户空间信息
traffic 用户流量信息

space包含如下字段:

字段名 含义
total 用户空间总量,单位G
remain 用户空间剩余总量,单位G
used 用户空间使用总量,单位G

traffic包含如下字段:

字段名 含义
total 用户流量总量,单位G
remain 用户剩余流量大小,单位G
used 用户已使用流量大小,单位G

响应结果

{
    "user":{
        "account":"test@test.com",
        "version":"试用版",
        "expired":"2011-06-06",
        "space":{
            "total":2,
            "remain":1.9,
            "used":0.1
        },
       "traffic":{
            "total":5,
            "remain":4.8,
            "used":0.2
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<user>
    <account>test@test.com</account>
    <version><![CDATA[试用版]]></version>
    <expired>2011-06-06</expired>
    <space>
        <total>2</total>
        <remain>1.9</remain>
        <used>0.1</used>
    </space>
    <traffic>
        <total>5</total>
        <remain>4.8</remain>
        <used>0.2</used>
    </traffic>
</user>

获取指定ID视频信息


第一版(原接口):

GET api/video

通过此接口,可以获取指定ID的视频信息(不包括已删除、正在处理中的视频)。请求示例如下所示:

eg.  http://spark.bokecc.com/api/video

参数列表

参数 描述 备注
userid 用户ID 必选
videoid 视频ID 必选
format 返回结果格式(json或xml) 可选   注:默认返回xml格式内容

返回数据video包含如下字段:

字段名 含义
id 视频ID
title 视频标题
desp 视频描述
tags 视频标签
duration 视频时长,单位秒
category 视频分类ID
image 视频截图地址
imageindex 视频截图序号
image-alternate 视频截图排列信息

image-alternate包含如下字段:

字段名 含义
index 视频截图排列序号
url 视频截图地址

响应结果

{
  "video":{
      "id":"123456",
      "title":"测试",
      "desp":"test",
      "tags":" spark test ",
      "duration":2,
      "category":"123456",
      "image":"http://image.example.com/1.jpg",
      "imageindex":1,
      "image-alternate":[
      {
        "index":0,
        "url":"http://1.bokeccimg.com/0.jpg"
      },
      ...
    ]
  }
}
<?xml version="1.0" encoding="UTF-8"?>
<video>
    <id>01234567</id>
    <title><![CDATA[视频标题]]></title>
    <desp><![CDATA[视频描述]]></desp>
    <tags><![CDATA[标签1 标签2 标签3]]></tags>
    <duration>12345</duration>
    <category>12345</category>
    <image>http://image.bokecc.com/abc.jpg</image>
    <imageindex>1</imageindex>
    <image-alternate>
        <index>0</index>
        <url>http://image.bokecc.com/abc0.jpg</url>
    </image-alternate>
    <image-alternate>
        <index>1</index>
        <url>http://image.bokecc.com/abc1.jpg</url>
    </image-alternate>
    ...
</video>

第二版:

GET api/video/v2

通过此接口,除了获取原接口所有信息,还可以获取视频转码文件大小。请求示例如下所示:

eg.  http://spark.bokecc.com/api/video/v2

参数列表

参数 描述 备注
userid 用户ID 必选
videoid 视频ID 必选
format 返回结果格式(json或xml) 可选   注:默认返回xml格式内容

返回数据video包含如下字段:

字段名 含义
id 视频ID
title 视频标题
desp 视频描述
tags 视频标签
duration 视频时长,单位秒
category 视频分类ID
image 视频截图地址
imageindex 视频截图序号
image-alternate 视频截图排列信息
definition 视频文件大小信息

image-alternate包含如下字段:

字段名 含义
index 视频截图排列序号
url 视频截图地址

definition包含如下字段:

字段名 含义
definitionlevel 视频清晰度值
definitiondesc 视频清晰度描述
terminaltype 终端类型(0:PC端,10:移动端)
filesize 文件大小

响应结果

{
  "video":{
      "id":"123456",
      "title":"测试",
      "desp":"test",
      "tags":" spark test ",
      "duration":2,
      "category":"123456",
      "image":"http://image.example.com/1.jpg",
      "imageindex":1,
      "image-alternate":[
      {
        "index":0,
        "url":"http://1.bokeccimg.com/0.jpg"
      },
      ...
    ],
      "definition": [
      {
        "definitionlevel": 2,
        "definitiondesc": "高清",
        "terminaltype": 0,
        "filesize": 6587147
      },
      ...
    ]
  }
}
<?xml version="1.0" encoding="UTF-8"?>
<video>
    <id>01234567</id>
    <title><![CDATA[视频标题]]></title>
    <desp><![CDATA[视频描述]]></desp>
    <tags><![CDATA[标签1 标签2 标签3]]></tags>
    <duration>12345</duration>
    <category>12345</category>
    <image>http://image.bokecc.com/abc.jpg</image>
    <imageindex>1</imageindex>
    <image-alternate>
        <index>0</index>
        <url>http://image.bokecc.com/abc0.jpg</url>
    </image-alternate>
    <image-alternate>
        <index>1</index>
        <url>http://image.bokecc.com/abc1.jpg</url>
    </image-alternate>
    ...
    <definition>
        <definitionlevel>0</definitionlevel>
        <definitiondesc>普通</definitiondesc>
        <terminaltype>0</terminaltype>
        <filesize>2839461</filesize>
    </definition>
    ...
</video>

编辑视频信息


GET api/video/update

通过此接口,可以编辑指定ID的视频信息(不包括已删除、正在处理中的视频)。请求示例如下所示:

eg.  http://spark.bokecc.com/api/video/update

参数列表

参数 含义 备注
videoid 视频ID 必选
userid 用户ID 可选
title 视频标题,长度限制为0~40个字符。 可选
tag 视频标签,标签之间用空格区分。
单个标签字符长度0~10,标签字符总长度0~20,超出部分自动截取。
可选
description 视频描述,长度限制为0~200个字符。 可选
categoryid 视频分类ID 可选
playurl 视频播放地址 可选   注:若不需编辑播放地址,请勿加入此参数。
imageindex 参数为视频封面截图序号 可选   注:若不需编辑视频封面截图序号,请勿加入此参数。
format 返回结果格式(json或xml) 可选   注:默认返回xml格式内容

返回数据video包含如下字段:

字段名 含义
id 视频ID
title 视频标题
desp 视频描述
tags 视频标签
category 视频分类ID
playurl 视频播放页面地址
imageindex 视频截图序号

响应结果

{
  "video":{
      "id":"48A0B1B3BD9B8A88",
      "title":"测试spark",
      "desp":"spark testspark test",
      "tags":" spark test ",
      "category":"7F4C9C99650FFACA",
      "playurl":"",
      "imageindex":"1"
  }
}
<?xml version="1.0" encoding="UTF-8"?>
<video>
    <id>01234567</id>
    <title><![CDATA[Video Title]]></title>
    <desp><![CDATA[Video Description]]></desp>
    <tags><![CDATA[tag1 tag2 tag3]]></tags>
    <category>12345</category>
    <playurl>http://xxxx/1.html</playurl>
    <imageindex>1</imageindex>
</video>

删除视频信息


GET api/video/delete

通过此接口,可以删除指定ID的视频信息(不包括处理中视频)。请求示例如下所示:

eg.  http://spark.bokecc.com/api/video/delete

参数列表

参数 描述 备注
userid 用户ID 可选
videoid 视频ID 必选
format 返回结果格式(json或xml) 可选

响应结果

{
 "result":"OK"
}
<?xml version="1.0" encoding="UTF-8"?>
<result>OK</result>

获取视频分类信息


GET api/video/category

通过此接口,可以获取视频分类信息。请求示例如下所示:

eg.  http://spark.bokecc.com/api/video/category

参数列表

参数 含义 备注
userid 用户ID 可选
format 返回结果格式(xml或json) 可选   注:默认返回xml格式内容

注:返回结果中的 level 包括 BASIC 和 PREMIUM,BASIC 中只包含一个默认父分类,无法创建自定义父分类, PREMIUM 版本中包含用户创建的父分类

返回数据video包含如下字段:

字段名 含义
level 视频分类等级
category 视频分类信息

category包含如下字段:

字段名 含义
id 分类ID
name 分类名称
sub-category 子分类信息

sub-category包含如下字段:

字段名 含义
id 子分类ID
name 子分类名称

响应结果

{
    "video":{
        "level":"PREMIUM",
        "category":[{
            "id":123,
            "name":"category1",
            "sub-category":[{
                "id":456,
                "name":"sub category1"
            },
            ...
            ]
        },
        ...
        ]
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<video>
    <level>BASIC</level>
    <category>
        <id>123</id>
        <name><![CDATA[category1]]></name>
        <sub-category>
            <id>456</id>
            <name><![CDATA[sub category1]]></name>
        <sub-category>
        ...
    </category>
    ...
</video>

创建视频分类信息


GET api/category/create

通过此接口,可以创建视频分类信息。请求示例如下所示:

eg.  http://spark.bokecc.com/api/category/create

参数列表

参数 含义 备注
userid 用户ID 必选
name 分类名称 必选
super_categoryid 一级分类ID 可选   注:若为空,创建一级分类
format 返回结果格式(xml或json) 可选   注:默认返回xml格式内容

返回数据category包含如下字段:

字段名 含义
id 分类ID
name 分类名称
super-category-id 父分类ID

响应结果

{
    "category":{
        "id":"01234567",
        "name":"分类1",
        "super-category-id":"123"        
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<category>
    <id>01234567</id>
    <name><![CDATA[分类1]]></name>
    <super-category-id>123</super-category-id>      
</category>

编辑视频分类信息


GET api/category/update

通过此接口,可以编辑已有的视频分类信息。请求示例如下所示:

eg.  http://spark.bokecc.com/api/category/update

参数列表

参数 含义 备注
categoryid 视频分类ID 必选
userid 用户ID 必选
name 分类名称 必选
format 返回结果格式(xml或json) 可选   注:默认返回xml格式内容

返回数据category包含如下字段:

字段名 含义
id 分类ID
name 分类名称
super-category-id 父分类ID

响应结果

{
    "category":{
        "id":"01234567",
        "name":"分类1",
        "super-category-id":"123"        
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<category>
    <id>01234567</id>
    <name><![CDATA[分类1]]></name>
    <super-category-id>123</super-category-id>      
</category>

删除视频分类信息


GET api/category/delete

通过此接口,可以删除已有的视频分类信息。请求示例如下所示:

eg.  http://spark.bokecc.com/api/category/delete

参数列表

参数 含义 备注
categoryid 视频分类ID 必选
userid 用户ID 必选
format 返回结果格式(xml或json) 可选   注:默认返回xml格式内容

响应结果

{
 "result":"OK"
}
<?xml version="1.0" encoding="UTF-8"?>
<result>OK</result>

获取视频列表


GET api/playlists

通过此接口,可以获取指定用户的视频列表信息。请求示例如下所示:

eg.  http://spark.bokecc.com/api/playlists

参数列表

参数 含义 备注
userid 用户ID 必选
num_per_page 返回信息页面中,每页包含的视频个数。 可选   注:阈值为1~100
page 当前页码 可选
format 返回结果格式(xml或json) 可选   注:默认返回xml格式内容

返回数据playlists包含如下字段:

字段名 含义
total 返回视频列表总数量
playlist 视频列表信息

playlist包含如下字段:

字段名 含义
id 视频列表ID
name 视频列表名称
videocount 视频数量
categoryid 分类ID

响应结果

{
    "playlists":{
        "total":100,
        "playlist":[
            {
                "id":"01234567",
                "name":"列表名称1",
                "videocount":2,
                "categoryid":123
            },
            ...
        ]
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<playlists>
    <total>100</total>
    <playlist>
        <id>01234567</id>
        <name><![CDATA[列表名称1]]></name>
        <videocount>2</videocount>
        <categoryid>123</categoryid>
    </playlist>
    ...
</playlists>

创建视频列表


GET api/playlist/create

通过此接口,可以创建视频列表。请求示例如下所示:

eg.  http://spark.bokecc.com/api/playlist/create

参数列表

参数 含义 备注
userid 用户ID 必选
name 视频列表名称 必选
videoid 视频列表要添加的视频ID,用","分割 必选   注:","为英文半角
categoryid 视频分类ID 可选   注:若为空,为默认二级分类
format 返回结果格式(xml或json) 可选   注:默认返回xml格式内容

返回数据playlist包含如下字段:

字段名 含义
id 视频列表ID
name 视频列表名称
categoryid 视频分类ID
video 视频信息

video包含如下字段:

字段名 含义
id 视频ID
index 视频在列表中的序号

响应结果

{
    "playlist":{
        "id":"01234567",
        "name":"列表名称1",
        "categoryid":"01234567",
        "video":[
            {
                "id":"123",
                "index":1
            },
            ...
        ]
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<playlist>
    <id>01234567</id>
    <name><![CDATA[列表名称1]]></name>
    <categoryid>01234567</categoryid>
    <video>
        <id>123</id>
        <index>1</index>
    	...
    <video>
</playlist>

编辑视频列表


GET api/playlist/update

通过此接口,可以创建视频列表。请求示例如下所示:

eg.  http://spark.bokecc.com/api/playlist/update

参数列表

参数 含义 备注
playlistid 视频列表名称 必选
userid 用户ID 必选
name 视频列表修改后名称 可选
videoid 视频列表要添加的视频ID,用","分割 可选   注:","为英文半角
categoryid 视频分类ID 可选
format 返回结果格式(xml或json) 可选   注:默认返回xml格式内容

返回数据playlist包含如下字段:

字段名 含义
id 视频列表ID
name 视频列表名称
categoryid 视频分类ID
video 视频信息

video包含如下字段:

字段名 含义
id 视频ID
index 视频在列表中的序号

响应结果

{
    "playlist":{
        "id":"01234567",
        "name":"列表名称1",
        "categoryid":"01234567",
        "video":[
            {
                "id":"123",
                "index":1
            },
            ...
        ]
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<playlist>
    <id>01234567</id>
    <name><![CDATA[列表名称1]]></name>
    <categoryid>01234567</categoryid>
    <video>
        <id>123</id>
        <index>1</index>
    	...
    <video>
</playlist>

删除视频列表


GET api/playlist/delete

通过此接口,可以删除指定的视频列表信息。请求示例如下所示:

eg.  http://spark.bokecc.com/api/playlist/delete

参数列表

参数 含义 备注
playlistid 视频列表ID 必选
userid 用户ID 必选
format 返回结果格式(xml或json) 可选   注:默认返回xml格式内容

响应结果

{
 "result":"OK"
}
<?xml version="1.0" encoding="UTF-8"?>
<result>OK</result>

获取视频播放代码


GET api/video/playcode

通过此接口,可以获取指定视频的视频播放HTML代码段。请求示例如下所示:

eg.  http://spark.bokecc.com/api/video/playcode

参数列表

参数 描述 备注
userid 用户ID 可选
videoid 视频ID 必选
playerid 播放器ID 可选
player_width 播放器宽度 可选
player_height 播放器高度 可选
auto_play 是否自动播放 可选
format 返回结果格式(xml或json) 可选

返回数据video包括如下字段

字段名 含义
palycode 嵌入网页的播放代码

响应结果

{
    "video":{
        "playcode":"<script src='http://union.bokecc.com/player?vid=96479767C315E6A9&siteid=1936D297411C3A27&autoStart=false&width=600&height=490&playerid=6ED7421AB96B522E&playertype=1' type='text/javascript'></script>"
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<video>
    <playcode>
        <![CDATA[<script src='http://union.bokecc.com/player?vid=96479767C315E6A9&siteid=1936D297411C3A27&autoStart=false&width=600&height=490&playerid=6ED7421AB96B522E&playertype=1' type='text/javascript'></script>]]>
    </playcode>
</video>

批量获取视频信息


第一版(原接口):

GET api/videos

通过此接口,可以批量获取视频信息(不包括已删除、正在处理中的视频)。请求示例如下所示:

eg.  http://spark.bokecc.com/api/videos

参数列表

参数 描述 备注
userid 用户ID 必选
videoid_from 起始视频ID,返回结果不包含该视频;若为空,则从第一个视频开始。 可选
videoid_to 终止视频ID,返回结果包含该视频;若为空,则到最后一个视频为止。 可选
num_per_page 返回信息页面中,每页包含的视频个数。 可选   注:阈值为1~100
page 当前页码 可选
format 返回结果格式(xml或json) 可选

返回数据videos包含如下字段:

字段名 含义
total 返回视频数量
video 视频信息

video包含如下字段:

字段名 含义
id 视频ID
title 视频标题
desp 视频描述
tags 视频标签
duration 视频时长,单位秒
category 视频分类ID
image 视频截图地址
imageindex 视频截图序号
image-alternate 视频截图排列信息

image-alternate包含如下字段:

字段名 含义
index 视频截图排列序号
url 视频截图地址

响应结果

{
    "videos":{
        "total":100,
        "video":[
            {
                "id":"01234567",
                "title":"Video Title",
                "desp":"Video Description",
                "tags":"tag1 tag2 tag3",
                "duration":12345,
                "category":"12345",
                "image":"http://image.bokecc.com/abc.jpg",
                "imageindex":1,
                "image-alternate":[
                    {
                        "index":0,
                        "url":"http://image.bokecc.com/abc0.jpg"
                    },
                    ...
                ]
            },
            ...
        ]
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<videos>
    <total>100</total>
    <video>
        <id>01234567</id>
        <title><![CDATA[Video Title]]></title>
        <desp><![CDATA[Video Description]]></desp>
        <tags><![CDATA[tag1 tag2 tag3]]></tags>
        <duration>12345</duration>
        <category>12345</category>
        <image>http://image.bokecc.com/abc.jpg</image>
        <imageindex>1</imageindex>
        <image-alternate>
            <index>0</index>
            <url>http://image.bokecc.com/abc0.jpg</url>
        </image-alternate>
        <image-alternate>
            <index>1</index>
            <url>http://image.bokecc.com/abc1.jpg</url>
        </image-alternate>
        ...
    </video>
    ...
</videos>

第二版:

GET api/videos/v2

通过此接口,除了获取原接口返回的信息,还在每个视频信息中添加了视频转码文件大小。请求示例如下所示:

eg.  http://spark.bokecc.com/api/videos/v2

参数列表

参数 描述 备注
userid 用户ID 必选
videoid_from 起始视频ID,返回结果不包含该视频;若为空,则从第一个视频开始。 可选
videoid_to 终止视频ID,返回结果包含该视频;若为空,则到最后一个视频为止。 可选
num_per_page 返回信息页面中,每页包含的视频个数。 可选   注:阈值为1~100
page 当前页码 可选
format 返回结果格式(xml或json) 可选

返回数据videos包含如下字段:

字段名 含义
total 返回视频数量
video 视频信息

video包含如下字段:

字段名 含义
id 视频ID
title 视频标题
desp 视频描述
tags 视频标签
duration 视频时长,单位秒
category 视频分类ID
image 视频截图地址
imageindex 视频截图序号
image-alternate 视频截图排列信息
definition 视频文件大小信息

image-alternate包含如下字段:

字段名 含义
index 视频截图排列序号
url 视频截图地址

definition包含如下字段:

字段名 含义
definitionlevel 视频清晰度值
definitiondesc 视频清晰度描述
terminaltype 终端类型(0:PC端,10:移动端)
filesize 文件大小

响应结果

{
    "videos":{
        "total":100,
        "video":[
            {
                "id":"01234567",
                "title":"Video Title",
                "desp":"Video Description",
                "tags":"tag1 tag2 tag3",
                "duration":12345,
                "category":"12345",
                "image":"http://image.bokecc.com/abc.jpg",
                "imageindex":1,
                "image-alternate":[
                    {
                        "index":0,
                        "url":"http://image.bokecc.com/abc0.jpg"
                    },
                    ...
                ],
                "definition": [
                    {
                        "definitionlevel": 2,
                        "definitiondesc": "高清",
                        "terminaltype": 0,
                        "filesize": 6587147
                    },
                    ...
                ]
            },
            ...
        ]
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<videos>
    <total>100</total>
    <video>
        <id>01234567</id>
        <title><![CDATA[Video Title]]></title>
        <desp><![CDATA[Video Description]]></desp>
        <tags><![CDATA[tag1 tag2 tag3]]></tags>
        <duration>12345</duration>
        <category>12345</category>
        <image>http://image.bokecc.com/abc.jpg</image>
        <imageindex>1</imageindex>
        <image-alternate>
            <index>0</index>
            <url>http://image.bokecc.com/abc0.jpg</url>
        </image-alternate>
        <image-alternate>
            <index>1</index>
            <url>http://image.bokecc.com/abc1.jpg</url>
        </image-alternate>
        ...
        <definition>
       		<definitionlevel>0</definitionlevel>
        	<definitiondesc>普通</definitiondesc>
        	<terminaltype>0</terminaltype>
        	<filesize>2839461</filesize>
    	</definition>
    	...
    </video>
    ...
</videos>

按分类获取视频信息


按分类获取视频信息:

GET api/videos/category

通过此接口,可以获取指定分类下的视频信息(不包括已删除、正在处理中的视频)。请求示例如下所示:

eg.  http://spark.bokecc.com/api/videos/category

参数列表

参数 描述 备注
categoryid 视频分类ID 必选
userid 用户ID 必选
num_per_page 返回信息页面中,每页包含的视频个数。 可选   注:阈值为1~100
page 当前页码 可选
format 返回结果格式(xml或json) 可选

返回数据videos包含如下字段:

字段名 含义
total 返回视频数量
video 视频信息

video包含如下字段:

字段名 含义
id 视频ID
title 视频标题
desp 视频描述
tags 视频标签
duration 视频时长,单位秒
category 视频分类ID
image 视频截图地址
imageindex 视频截图序号
image-alternate 视频截图排列信息

image-alternate包含如下字段:

字段名 含义
index 视频截图排列序号
url 视频截图地址

响应结果

{
    "videos":{
        "total":100,
        "video":[
            {
                "id":"01234567",
                "title":"Video Title",
                "desp":"Video Description",
                "tags":"tag1 tag2 tag3",
                "duration":12345,
                "category":"12345",
                "image":"http://image.bokecc.com/abc.jpg",
                "imageindex":1,
                "image-alternate":[
                    {
                        "index":0,
                        "url":"http://image.bokecc.com/abc0.jpg"
                    },
                    ...
                ]
            },
            ...
        ]
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<videos>
    <total>100</total>
    <video>
        <id>01234567</id>
        <title><![CDATA[Video Title]]></title>
        <desp><![CDATA[Video Description]]></desp>
        <tags><![CDATA[tag1 tag2 tag3]]></tags>
        <duration>12345</duration>
        <category>12345</category>
        <image>http://image.bokecc.com/abc.jpg</image>
        <imageindex>1</imageindex>
        <image-alternate>
            <index>0</index>
            <url>http://image.bokecc.com/abc0.jpg</url>
        </image-alternate>
        <image-alternate>
            <index>1</index>
            <url>http://image.bokecc.com/abc1.jpg</url>
        </image-alternate>
        ...
    </video>
    ...
</videos>

GET api/videos/search

通过此接口,可以搜索视频信息(不包括已删除、正在处理中的视频)。请求示例如下所示:

eg.  http://spark.bokecc.com/api/videos/search

参数列表

参数 描述 备注
userid 用户ID 必选
q 查询条件,不可为空。

格式:查询字段:查询内容
查询字段:TITLE
查询内容:查询关键字

注:格式中的“:”为英文半角
Example:q=TITLE:test
必选
sort 查询结果排序方式,不可为空。

格式:排序字段:排序方式
排序字段:CREATION_DATE、FILE_SIZE
排序方式:ASC、DESC

注:格式中的“:”为英文半角
Example: sort=CREATION_DATE:DESC
必选
categoryid 二级分类ID 可选
num_per_page 返回信息页面中,每页包含的视频个数。 可选
page 当前页码 可选
format 返回结果格式(xml或json) 可选

返回数据videos包含如下字段:

字段名 含义
total 返回视频数量
video 视频信息

video包含如下字段:

字段名 含义
id 视频ID
title 视频标题
desp 视频描述
tags 视频标签
duration 视频时长,单位秒
category 视频分类ID
creation-date 视频创建时间
filesize 视频文件大小,单位字节
image 视频截图地址

响应结果

{
    "videos":{
        "total":100,
        "video":[
            {
                "id":"01234567",
                "title":"Video Title",
                "desp":"Video Description",
                "tags":"tag1 tag2 tag3",
                "duration":12345,
                "category":"12345",
                "creation-date":"2012-10-29 15:16:50",
                "filesize":4174340,
                "image":"http://image.bokecc.com/abc.jpg"
            },
            ...
        ]
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<videos>
    <total>100</total>
    <video>
        <id>01234567</id>
        <title><![CDATA[Video Title]]></title>
        <desp><![CDATA[Video Description]]></desp>
        <tags><![CDATA[tag1 tag2 tag3]]></tags>
        <duration>12345</duration>
        <category>12345</category>
        <creation-date>2012-10-29 15:16:50</creation-date>
        <filesize>4174340</filesize>
        <image>http://image.bokecc.com/abc.jpg</image>
        ...
    </video>
    ...
</videos>

上传API

该接口为用户提供自编码完成视频上传功能,包括Flash和HTTP两种方式。

Flash视频上传


Spark API 需要 Flash 插件的版本在 10.1 以上方可正常使用,请确保 Flash 插件版本符合要求。


在上传视频的过程中,不需要与 Spark 平台进行 HTTP 通信,使用 JavaScript 和 Spark 提供的 Flash 进行交互即可完成。上传接口用到的所有 javascript 函数定义见下表:

函数定义 参数说明
on_spark_selected_file(file_name, file_size) file_name: 上传文件名
file_size: 上传的文件大小,单位字节
on_spark_upload_validated(status, videoid) status: 验证结果
videoid: 视频 id
on_spark_upload_progress(progress) progress: 上传进度。正确时,0~100 之间的整数,包括 0 和 100;错误时,返回-1.

网页嵌入 Spark 提供的上传 Flash 时,需要传递下列参数:

Flash参数(flashvars) 参数说明
progress_interval 回调进度函数的时间间隔,默认 1 秒
notify_url 视频处理完毕后的通知地址

上传视频流程


第一步,选择文件

Spark 提供一个透明的 Flash 进行文件上传,地址如下:

http://union.bokecc.com/flash/api/uploader.swf

由于它是透明的,所以可以置于任何一个 html 元素的上方而不影响的页面视觉效果。上传文件时,必须通过点击到该 flash 从而打开浏览对话框进行文件选择。 文件选择成功后,Flash 会调用页面中的on_spark_selected_file 函数,页面可以选择合适的方式处理该事件。

第二步,验证参数

当用户选择文件后,需将下面的参数按照 THQS 算法处理后传递给 Flash 的 start_upload 函数后,才能开始上传流程。首先要进行参数和权限的验证,通过 后才开始文件上传。

参数列表

参数 含义 备注
userid 用户ID 必选
categoryid 分类id 可选
title 视频标题,若值为空,则采用去后缀的文件名作为title 必选
tag 视频标签 必选
description 视频简介 必选

验证完成后,Flash 会调用 on_spark_upload_validated 函数传递验证结果以及视频 id。验证状态码的含义如下:

验证状态码 说明
OK 成功
NETWORK_ERROR 网络错误
其它 Spark API 错误码

第三步,文件上传

文件开始上传后,Flash 会周期性调用 on_spark_upload_progress 函数来报告上传进度,间隔秒数由 progress_interval 参数指定。如果上传的进度为负数, 则说明发生网络错误,上传中断。返回 100 则表示上传成功。当返回 100 或者 -1 后,Flash 就不再调用该函数了。

第四步,回调

当处理完毕视频后(上传、转码、审核都完成后),Spark 平台会通过由参数 notify_url 指定的 HTTP/HTTPS 地址以 GET 方式发起回调。若用户网站地址使用HTTPS协议进行数据安全传输时,用户需保证其拥有的CA证书是合法的。

用户指定的 notify_url 符合以下四种 notify_url 格式之⼀即为合法:


1、http://domain

2、http://domain?data=****(data为用户自定义的参数)

3、https://domain

4、https://domain?data=****


若参数 notify_url 中携带有用户自定义的参数,则在进行回调通知时会将用户自定义的参数和下表中的参数⼀起以 THQS 方式进行加密。

参数 说明
videoid 视频 id,16位 hex 字符串
status 视频状态。”OK”表示视频处理成功,”FAIL”表示视频处理失败。
duration 片长(单位:秒)
image 视频截图地址

视频处理失败有多种情况,例如视频文件异常、视频内容违规等等。

<?xml version="1.0" encoding="UTF-8"?>
<video>OK</video>

当 notify_url 指定的接口返回上述 xml 时,Spark 会认为网站已经成功接收到了回调信息,不再进行重试。返回其它任何内容,Spark 视频平台会进行重试,重试的间隔会随着重试次数的增大而增大。若重试 7 次后,依然没有成功,则不再进行通知。因此,Spark 视频平台最多通知 8 次。这 8 次的通知时间距第一次的通知时间的差分别为:

[0,15s, 1m, 4m, 16m, 1h4m, 4h16m, 17h4m]

HTTP视频上传(断点续传)


1.创建视频上传信息


GET api/video/create

通过此接口,可以生成用户上传视频信息。请求示例如下所示:

此接口需使用THQS加密请求数据验证。具体算法见 Spark_API文档附录

eg.  http://spark.bokecc.com/api/video/create

参数列表

参数 含义 备注
userid 用户ID 必选
title 视频标题
tag 视频标签 可选
description 视频描述
categoryid 二级分类id,主账号可选
filename 文件名称 可选
filesize 文件大小 单位Byte
notify_url 视频处理完毕的通知地址
format 返回结果格式(json或xml) 可选   注:默认返回xml格式内容

成功响应结果

返回数据uploadinfo包含如下字段:

字段名 含义
videoid 视频ID
userid 用户ID
servicetype 额外参数
metaurl 上传meta信息URL 对应上传视频META信息
chunkurl 上传文件块URL 对应上传视频文件块CHUNK
{
  "uploadinfo": {
     "videoid": "4314321431",
     "userid": "4321431",
     "servicetype": "4321BA12",
     "metaurl": "http://abc.com/servlet/uploadmeta",
     "chunkurl": "http://abc.com/servlet/uploadchunk"
  }
}

<?xml version="1.0" encoding="UTF-8"?>
<uploadinfo>
<videoid>3B35ED608474B8DB2BB</videoid>
<userid>40EF004A6F1</userid>
<servicetype>240593F08</servicetype>
<metaurl><![CDATA[http://abc.com/servlet/uploadmeta]]></metaurl>
<chunkurl><![CDATA[http://abc.com/servlet/uploadchunk]]></chunkurl>
</uploadinfo>
  

失败响应结果


{
    "error":" SERVICE_EXPIRED "
}

<?xml version="1.0" encoding="UTF-8"?>
<error>SERVICE_EXPIRED</error>
  

其他错误信息:

错误关键字 含义
INVALID_REQUEST 用户输入参数错误
SPACE_NOT_ENOUGH 用户剩余空间不足
SERVICE_EXPIRED 用户服务终止
PROCESS_FAIL 服务器处理失败
TOO_MANY_REQUEST 访问过于频繁
PERMISSION_DENY 用户服务无权限

2.创建视频上传信息


GET servlet/uploadmeta

通过此接口,发送用户视频文件meta信息。接口支持断点续传。请求示例如下所示:

eg.  http://*.bokecc.com/servlet/uploadmeta

参数列表

参数 含义 备注
uid 用户id,不可为空 断点续传请求时可为可选
ccvid 视频文件vid 不可为空 必选
first 是否首次 first=1表示首次 断点续传为非首次first=2 必选
filename 视频名称 断点续传请求时可为可选 可选
md5 视频文件md5 断点续传请求时为可选 可选
filesize 视频文件大小 单位Byte 断点续传请求时为可选 可选
servicetype servicetype来源于 创建视频上传信息 接口返回值 断点续传请求时为可选 详情链接
format 返回结果格式(json或xml) 可选   注:默认返回json格式内容

返回数据包含如下字段:

字段名 含义
result 响应结果 0 成功 -1失败
msg 错误信息 出错时会给出错误信息
received 已接收文件长度,单位 Byte

正确响应结果


{
  "result": 0,
  "msg": "success",
  "received": 0
}

<?xml version="1.0" encoding="UTF-8"?>
<root>
<result>0</result>
<msg>success</msg>
<received>0</received>
</root>
  

错误响应结果


{
  "result":  -1,
  "msg": "文件接收异常",
  "received": 0
}

<?xml version="1.0" encoding="UTF-8"?>
<root>
<result>-1</result>
<msg>文件写入错误</msg>
<received>0</received>
</root>
  

3.上传视频文件块CHUNK


POST servlet/uploadchunk

通过此接口,向服务器分块发送视频数据。接口支持断点续传。请求示例如下所示:

为保证效率,最大chunksize=4MB。

eg.  http://*.bokecc.com/servlet/uploadchunk

参数列表

参数 含义 备注
ccvid 视频ID 必选
format 返回结果格式(json或xml) 可选   注:默认返回json格式内容

返回数据包含如下字段:

字段名 含义
result 响应结果 0 成功 -1失败
msg 错误信息 出错时会给出错误信息
received 已接收文件长度,单位 Byte

正确响应结果


{
  "result": 0,
  "msg": "success",
  "received": 10240
}

<?xml version="1.0" encoding="UTF-8"?>
<root>
<result>0</result>
<msg>success</msg>
<received>10240</received>
</root>
  

错误响应结果


{
  "result":  -1,
  "msg": "文件接收异常",
  "received": 0
}

<?xml version="1.0" encoding="UTF-8"?>
<root>
<result>-1</result>
<msg>文件写入错误</msg>
<received>0</received>
</root>
  

协议详解:

此接口使用POST方式将实际文件的指定部分二进制数据发送到服务器, 服务器会返回已接收到的实际文件长度,当服务器返回文件长度等于发送文件长度时即文件已发送完成。


标准协议:HTTP1.1协议(RFC2616)Content-Range部分


POST协议详解示例


HTTP协议需要用户修改 header中Content-Range内容。
Content-Range: bytes x-y/z
x 表示该段数据在文件中的开始位置==上次请求返回received数值
y 表示该段数据在文件中的结束位置
z 表示文件总长度
提醒:y表示文件索引下标位置,所以有 y <= z - 1
(binary)部分为文件部分块二进制内容

##### 报文格式

POST /servlet/uploadchunk HTTP/1.1
Accept: text/*
Content-Type:multipart/form-data; boundary=----------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4)
Host: www.example.com
Content-Length: 421
Connection: Keep-Alive
Cache-Control: no-cache
Content-Range: bytes 0-100/500

------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data;name="file";filename="MyFile.jpg"
Content-Type: application/octet-stream

(binary)
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--


使用步骤:

1 用户调用创建视频上传信息返回数据 并提取vid,metaurl,chunkurl等返回数据。

2 用户调用上传视频META信息(metaurl)将文件描述等信息发送到服务器。

3 用户反复调用上传视频文件块CHUNK(chunkurl)将文件实际数据发送到服务器直到全部发完。

4 如果调用上传视频文件块CHUNK(chunkurl)中间出现中断,可使用断点续传方式上传视频META信息(metaurl)获取已发文件长度后继续调用上传视频文件块CHUNK(chunkurl)将文件发送完成。


流程图

流程图

上传视频文件块CHUNK示例代码



     
     /* url为/servlet/uploadchunk?ccvid=&format= */
     /* chunkStart为chunk起始位置*/
     /* chunkEnd为chunk结束位置*/
     /* file为文件*/
     /* bufferOut为实际文件输出二进制内容*/

  	public String uploadchunk(String url, int chunkStart, int chunkEnd, File file, byte[] bufferOut) {
		HttpURLConnection conn = null;
		try {
			String BOUNDARY = "---------CCHTTPAPIFormBoundaryEEXX" + new Random().nextInt(65536); // 定义数据分隔线
			URL openUrl = new URL(url);
			conn = (HttpURLConnection)openUrl.openConnection();
			// 发送POST请求必须设置如下两行
			conn.setDoOutput(true);
			conn.setDoInput(true);
			conn.setUseCaches(false);
			conn.setRequestMethod("POST");
			conn.setRequestProperty("connection", "Keep-Alive");
			conn.setRequestProperty("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4)");
			conn.setRequestProperty("Charsert", "UTF-8");
			conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
			// content-range
			conn.setRequestProperty("Content-Range", "bytes " + chunkStart + "-" + chunkEnd + "/" + file.length());

			OutputStream out = new DataOutputStream(conn.getOutputStream());
			StringBuilder sb = new StringBuilder();
			sb.append("--").append(BOUNDARY).append("\r\n");
			sb.append("Content-Disposition: form-data;name=\"file" + file.getName() + "\";filename=\"" + file.getName()
					+ "\"\r\n");
			sb.append("Content-Type: application/octet-stream\r\n");
			sb.append("\r\n");
			byte[] data = sb.toString().getBytes();
			out.write(data);
			out.write(bufferOut);
			out.write("\r\n".getBytes());
			// 定义最后数据分隔线
			byte[] end_data = ("--" + BOUNDARY + "--\r\n").getBytes();
			out.write(end_data);
			out.flush();
			out.close();

			// 定义BufferedReader输入流来读取URL的响应
			BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			StringBuffer resultBuf = new StringBuffer("");
			String line = null;
			while ((line = reader.readLine()) != null) {
				resultBuf.append(line);
			}
			reader.close();
			conn.disconnect();
			return resultBuf.toString();
		} catch (Exception e) {
			System.out.println("发送POST请求出现异常!" + e);
			e.printStackTrace();
		} finally {
			if (conn != null)
				conn.disconnect();
		}
		return null;
	}

  

Player API

利用 Player API 与 CC视频播放器进行交互,可以改变播放器界面、实现一些增值功能。 目前仅限于Flash播放器,FlashPlayer插件版本要求为10.1及以上,播放器页面代码中须允许播放器与页面脚本通信。

接口说明

接口分为两种类型:方法、 回调;具体使用方法可参照示例。 方法,是指播放器开放的JavaScript函数,开发者可通过这些函数与播放器进行交互;回调,是指播放过程中,可触发的播放器事件。


接口名称 功能描述 类型
start() 开始播放 方法
pause() 暂停播放 方法
resume() 恢复播放 方法
seek(time) 定位至指定时间,参数time(单位:秒) 方法
getDuration() 获取视频片长(单位:秒) 方法
getPosition() 获取当前播放时间(单位:秒) 方法
getQualities() 获取当前视频可⽤清晰度列表
返回类型:Array
eg. [{value:"0",label:"普通"},{value:"1",label:"清晰"}]
方法
getTitle() 获取视频标题 方法
setQuality(quality) 设置清晰度
参数 quality 为 getQualities 方法获取的 value 值
方法
setVolume(volume) 设置音量
参数volume取值范围:[0-1].  eg. setVolume(0.5)
方法
normalScreen() 退出全屏 方法
setConfig(config) 配置播放器
参数config为配置对象,详细参照播放器配置
方法
on_cc_player_init(vid,objectId) 初始化播放器界面元素
vid : 视频ID
objectId:页面中播放器的id值
回调

示例


HTML代码:

<object ... id="cc_A5FEB0EA05F2100B9C33DC5901307461">
...
<param name="allowFullScreen" value="true" />
<param name="allowScriptAccess" value="always" />
<embed ... name="cc_A5FEB0EA05F2100B9C33DC5901307461" allowFullScreen="true"
allowScriptAccess="always" ... />
</object>

JavaScript代码:

<script type="text/javascript">
  var player1 = getSWF( "cc_A5FEB0EA05F2100B9C33DC5901307461" );

  function on_cc_player_init( vid, objectID ){
    var player = getSWF( objectID );
    console.info( player1 == player ); 
    player.start(); 
  }

  function getSWF( swfID ) {
    if (window.document[ swfID ]) {
      return window.document[ swfID ];
    } else if (navigator.appName.indexOf("Microsoft") == -1) {
      if (document.embeds && document.embeds[ swfID ]) {
        return document.embeds[ swfID ];
      }
    } else {
      return document.getElementById( swfID );
    }
  }
</script>

配置说明

通过配置以下各项参数,可以改变播放器的界面,开启更多的回调接口,还可以使用其他的功能,如自定义全屏、字幕功能。配置播放器的方法见示例,配置项如下所示:


配置项 功能描述
control_enable 是否显示控制条
0, 不显示;1, 显示;默认值为1
progressbar_enable 是否可操作进度条
0, 不可操作;1, 可操作;默认值为1
loadingpic_enable 是否启用缓冲片头
0, 不启用;1, 启用;默认值为1
loading_enable 是否显示loading图标
0, 不显示;1, 显示;默认值为1
bigbutton_enable 是否显示非自动播放是播放器中间的开始按钮
0, 不显示;1, 显示;默认值为1
tip_enable 是否可显示播放器顶部的提示条
0,不显示;1, 显示;默认值为1
alert_enable 是否可显示播放器中间的提示面板
0, 不显示;1, 显示;默认值为1
recommend_enable 是否启用播放结束后的推荐界面
0, 不启用;1, 启用;默认值为1
keyboard_enable 是否启用按键操作
0, 不启用;1, 启用;默认值为1
rightmenu_enable 是否启用右侧菜单
0, 不启用;1, 启用;默认值为1
fullscreen_enable 是否使用自定义全屏操作
默认0,设置为1可以替代Flash全屏
fullscreen_function 替代Flash全屏的JS函数的名称,这个函数需要返回一个值以确定当前状态(0, 正常;1,全屏)
注:使用此配置需将fullscreen_enable值设置为1
player_plugins 配置播放器插件,详见 插件介绍
on_player_stop 播放结束后回调JS函数的名称,默认为 on_spark_player_stop
on_player_pause 暂停播放时回调JS函数的名称,默认为 on_spark_player_pause
on_player_resume 暂停后继续播放时回调JS函数的名称,默认为 on_spark_player_resume
on_player_ready 播放器准备就绪回调JS函数的名称,默认为 on_spark_player_ready
on_player_start 开始播放时回调JS函数的名称,默认为 on_spark_player_start
on_player_seek 拖动播放时回调JS函数的名称。回调函数的参数:from,to
from, 定位之前的时间点(单位 秒);to, 定位指定的时间点(单位 秒)
on_player_buffering 缓冲开始或结束时回调JS函数的名称,回调函数的参数:flag
flag, 是否缓冲中; 取值:0, 否;1, 是
on_player_setquality 清晰度改变时回调JS函数的名称。回调函数的参数:quality
quality, 当前清晰度;取值:0, 普通;1, 清晰;2, 高清
on_player_volumechange 音量改变时回调JS函数的名称。回调函数的参数:vol
vol, 当前音量;取值范围:0-1
on_player_playerror 当播放失败时回调JS函数的名称。回调函数的参数:code
code, 错误码
on_player_fullscreen 全屏或退出全屏时回调JS函数的名称。回调函数的参数:flag
flag, 是否全屏;取值:0, 否;1, 是

示例


JavaScript代码:

<script type="text/javascript"> 

  function customFullScreen(){
    //TODO 自定义全屏
  }
  
  function onPlayPaused(){
    // 已暂停播放
  }
  
  function on_cc_player_init( vid, objectID ){
    var config = {};
    config.fullscreen_enable = 1; //启用自定义全屏
    config.fullscreen_function = "customFullScreen"; //设置自定义全屏函数的名称
    config.on_player_pause = "onPlayPaused"; //设置当暂停播放时的回调函数的名称
    
    var player = getSWF( objectID );
    player.setConfig( config );
  }
  
  function getSWF( swfID ) {
    if (window.document[ swfID ]) {
      return window.document[ swfID ];
    } else if (navigator.appName.indexOf("Microsoft") == -1) {
      if (document.embeds && document.embeds[ swfID ]) {
        return document.embeds[ swfID ];
      }
    } else {
      return document.getElementById( swfID );
    }
  }

</script>

插件介绍

插件是指基于播放器实现的可插拔的独立功能块,开发者可配置player_plugins来启用插件功能。 使用插件时,请在 player_plugins 配置项中配置插件的名称和参数,使用方法见示例


字幕插件

字幕插件可以让播放器在播放视频的同时显示相关文字,启用时在配置中添加插件名称 Subtitle ,参数如下:

参数 描述
url 字幕文件地址,仅支持srt格式的字幕文件,此参数为必需参数
size 字体大小,默认20
color 字体颜色,默认0xFFFFFF
surroundColor 文字环绕颜色,默认0x000000
font 字体名称,默认Times New Roman
bottom 文本与播放区域底部的距离占播放区域高的百分比,默认 0.15
code 字幕文件编码,支持 utf-8 、gbk,默认 utf-8
bgColor 字幕的背景色,默认为0xffffff
bgAplha 字幕的背景透明度,取值0到1,默认值是0
leading 字幕的行与行间距,默认值是0,可赋值整数

注意事项:字幕文件所在的服务器根目录需要部署一个安全策略文件( crossdomin.xml ),使播放器能够跨域访问字幕文件。
了解更多关于安全策略文件可访问如下地址:

http://help.adobe.com/zh_CN/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7c85.html#WS5b3ccc516d4fbf351e63e3d118a9b90204-7e08

示例

JavaScript代码:

<script type="text/javascript">

  function on_cc_player_init( vid, objectID ){
    var config = {};
    config.player_plugins = {
      Subtitle : {
        url : "http://yourdomain/subtitle.srt"
        , size : 20
        , color : 0xCCCCCC
        , surroundColor : 0x0000FF
        , bottom : 0.15
        , font : "微软雅黑"
        , code : "utf-8"
      }
    };

    var player = getSWF( objectID );
    player.setConfig( config );
  }

</script>

播放器错误码


代码 说明
102 视频列表为空
103 无效的视频列表
108 列表模式视频信息加载失败
109 视频信息加载失败
110 视频审核中
111 用户流量已用尽
112 用户账号被锁
114 视频被屏蔽或删除
115 视频信息错误
116 无视频文件
205 当前域名不允许播放
207 授权播放验证未通过
304 测速失败
305 切换清晰度失败
306 播放中播放失败

移动SDK

利用SDK可以对接CC视频云服务平台,进行视频上传和播放。目前上传仅对合作方开启,如果您有使用SDK的需求,请通过CC视频后台申请API Key,审核通过后方可使用。


iOS

当前版本为2.3.1,此版本SDK支持iOS 5.0 及以上操作系统。

视频播放


DWMoviePlayerController 模块继承于 MPMoviePlayerController,提供使用 userId、videoId、API KEY初始化方法,从CC视频云获取视频播放信息。


第一步,初始化 DWMoviePlayerController

Spark 提供一个透明的 Flash 进行文件上传,地址如下:

DWMoviePlayerController *player = [[DWMoviePlayerController alloc] initWithUserId:userId
        andVideoId:videoId 
        key:apiKey];

或者:

DWMoviePlayerController *player = [[DWMoviePlayerController alloc] initWithUserId:userId key:apiKey];
player.videoId = videoId;

第二步,设置请求播放信息HTTP通信超时时间

player.timeoutSeconds = 20;

默认超时时间10秒。

第三步,设置block

DWMoviePlayerController 有以下block:

typedef void(^DWMoivePlayerGetPlayUrlsBlock)(NSDictionary *playUrls);
typedef void(^DWErrorBlock)(NSError *error);

@property (copy, nonatomic)DWMoivePlayerGetPlayUrlsBlock getPlayUrlsBlock;

/**
 *  获取视频播放信息或播放过程中发生错误或失败时,回调该block。可以在该block内更新UI,如更改视频播放状态。
 */
@property (copy, nonatomic)DWErrorBlock failBlock;

其中 getPlayUrlsBlock 获取视频播放信息

player.getPlayUrlsBlock = ^(NSDictionary *playUrls) {
    // [必须]判断 status 的状态,不为"0"说明该视频不可播放,可能正处于转码、审核等状态。
    NSNumber *status = [playUrls objectForKey:@"status"];
    if (status == nil || [status integerValue] != 0) {
        NSLog("playUrlsBlock invalid");
    }
    // 保存playUrls 或 选择某种清晰度进行播放。
};

当SDK准备好视频播放信息时,会调用该block。你可以在该block中保存播放信息或实现播放逻辑。

获取的播放信息 NSDictionary *playUrls 为UTF-8编码,内容形如:

{
   "status": 0,
   "statusinfo": "正常",
   "defaultquality": 10,
   "qualityDescription": [@"清晰", @"高清"],
   "qualities": [{
       "quality": 10,
       "desp": "清晰",
       "playurl": "http://xxx.play.bokecc.com/..."
   }, {
       "quality": 20,
       "desp": "高清",
       "playurl": "http://xxx.play.bokecc.com/..."
   }]
}
参数 含义
status 表示这个视频在CC视频云上的当前的状态值。 只有当status为0时,该视频才可以播放。
statusinfo 是状态值的文字描述,如正处于转码、正在审核等。
defaultquality 默认清晰度值
qualityDescription 清晰度文字描述
qualities 不同清晰度播放url列表
quality 清晰度数值
desp 清晰度数值和清晰度文字描述
playurl 视频播放url

注意:CC视频的播放url具有时效性,你需要在每次播放时请求视频播放信息,以取得最新的视频播放url。

第四步,开始请求播放信息

[player startRequestPlayInfo];

播放控制


播放流程的控制和 MPMoviePlayerController 使用方法一致。这里以前文获取的播放信息做简单介绍。


将 DWMoviePlayerController 的 view 添加到你的UIViewController中

在 - (void)viewDidLoad {} 中

CGRect frame = CGRectZero;
// 设置合适的 frame
UIView *videoBackgroundView = [[UIView alloc] initWithFrame:frame];
[self.view addSubview:videoBackgroundView];

player.view.frame = videoBackgroundView.frame;
[videoBackgroundView addSubview:player.view];

开始播放

[player prepareToPlay];
[player play];

暂停播放

[player pause];

继续播放

[player play];

停止播放

[player stop];

切换清晰度

[player stop];
NSString *playUrlString = @"..."; // 从视频播放信息 playUrls 中选择一种清晰度。
player.contentURL = [NSURL URLWithString:playUrlString];
[player prepareToPlay];
[player play];

视频上传


DWUploader模块提供将本地视频文件上传至CC视频云的功能。上传视频时需提供userId、API KEY、视频标题、标签和简介。 DWUploader采用多个block与App进行交互,上传视频时你需创建一个上传实例,设置上传超时时间,设置各个block,如DWUploaderProgressBlock、DWUploaderFinishBlock等,在这些block中实现App的业务逻辑。


第一步,初始化 DWUploader

视频首次上传使用userId、API KEY、视频本地路径、视频标题、标签及简介初始化DWUploader。服务器根据这些信息为视频分配videoId、上传服务器等资源,通常把这些资源称为上传上下文。当视频上传被中断(如网络断开或用户暂停),可使用上传上文初始化DWUploader实现断点续传,若此时还未获取上传上下文,则使用首次上传初始化方式重新初始化上传。

首次上传视频初始化DWUploader

DWUploader *uploader = [[DWUploader alloc] initWithuserId:userId
        andKey:apiKey
        uploadVideoTitle:videoTitle
        videoDescription:videoDescripton
        videoTag:videoTag
        videoPath:videoPath
        notifyURL:nil];

断点续传初始化DWUploader

DWUploader *uploader = [[DWUploader alloc] initWithVideoContext:self.uploadContext];

注意:通常情况下,不可对同一视频多次使用第一种初始化方式初始化上传,这样会造成大量重复视频,增加你后期管理视频的同事的工作量,且CC视频会根据你的付费套餐对每天的上传次数有不同的限制,超过最大上传次数,当天便无法上传视频。

注意:视频标题不得为空,否则会导致上传失败。

第二步,设置上传HTTP通信超时时间

uploader.timeoutSeconds = 20;

默认超时时间为10秒。

若上传过程中产生HTTP通信超时,则会调用DWErrorBlock,可以在该block设置错误处理逻辑。

第三步,设置block

DWUploader有如下block:

typedef void (^DWUploaderFinishBlock)();
typedef void (^DWErrorBlock)(NSError *error);
typedef void (^DWUploaderVideoContextForRetryBlock)(NSDictionary *videoContext);
typedef void (^DWUploaderProgressBlock)(float progress, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite);

/**
 *  在该block获取上传进度,可以在block内更新UI,如更新上传进度条。
 */
@property (copy, nonatomic)DWUploaderProgressBlock progressBlock;

/**
 *  上传完成时回调该block,可以在block内更新UI,如将视频标记为上传完成。
 */
@property (copy, nonatomic)DWUploaderFinishBlock finishBlock;

/**
 *  上传失败时回调该block,可以在该block内更新UI,如将视频标记为上传失败。
 */
@property (copy, nonatomic)DWErrorBlock failBlock;

/**
 *  在该block内获取上传上下文,并保存上传上下文,用来实现断线续传。
 */
@property (copy, nonatomic)DWUploaderVideoContextForRetryBlock videoContextForRetryBlock;

/**
 *  当遇到网络问题或服务器原因时上传暂停,回调该block。
 */
@property (copy, nonatomic)DWErrorBlock pausedBlock;

第四步,开始上传

[uploader start];

视频上传控制

视频上传控制用来和UI进行交互,当用户点击开始上传、暂停、继续时,可以通过调用DWUploader的start、pause、resume方法实现对应的视频上传控制。

视频下载


DWDownloader模块提供从CC视频云下载视频的功能,下载时需提供userId、API KEY、videoId及用来保存下载视频的本地文件路径。

注意:CC视频的下载url具有时效性,你需要在每次下载时重新初始化DWDownloader,以取得正确的下载url。


流程1

第一步,初始化 DWDownloader

DWDownloader *downloader = [[DWDownloader alloc] initWithUserId:userId
    andVideoId:videoId
    key:apiKey
    destinationPath:videoPath];

第二步,设置下载HTTP通信超时时间

downloader.timeoutSeconds = 20;

默认超时时间为10秒。

下载过程中HTTP通信超时时,会调用failBlock下载失败的block。告知你下载超时。

第三步,设置block

DWDownloader有如下block:

typedef void (^DWErrorBlock)(NSError *error);
typedef void (^DWDownladerFinishBlock)();
typedef void (^DWDownloaderProgressBlock)(float progress, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite);

/**
 *  在该block获取下载进度,可以在block内更新UI,如更新下载进度条。
 */
@property (copy, nonatomic)DWDownloaderProgressBlock progressBlock;

/**
 *  下载完成时回调该block,可以在block内更新UI,如将视频标记为下载完成。
 */
@property (copy, nonatomic)DWDownladerFinishBlock finishBlock;

/**
 *  下载失败时回调该block,可以在该block内更新UI,如将视频标记为下载失败。
 */
@property (copy, nonatomic)DWErrorBlock failBlock;

第四步,开始下载

[downloader start];

流程2

第一步,初始化 DWDownloader

DWDownloader *downloader = [[DWDownloader alloc] initWithUserId:userId
    andVideoId:videoId
    key:apiKey];

第二步,设置下载HTTP通信超时时间

downloader.timeoutSeconds = 20;

默认超时时间为10秒。

下载过程中HTTP通信超时时,会调用failBlock下载失败的block。告知你下载超时。

第三步,设置getplayinfoblock

typedef void(^DWDownloaderGetPlayUrlsBlock)(NSDictionary *playUrls);

/**
 * @brief 获取视频下载信息。
 */
@property (copy, nonatomic)DWDownloaderGetPlayUrlsBlock getPlayinfoBlock;

通过次block获取视频下载信息,NSDictionary *playUrls的结构为:

playinfo : {
defaultdefinition = 10;
definitionDescription =     (
    "\U6e05\U6670",
    "\U9ad8\U6e05"
);
definitions =     (
            {
        definition = 10;
        desp = "\U6e05\U6670";
        playurl = "http://bm2.33.play.bokecc.com/flvs/ca/Qxc52/uCrWqgNwgC-10.mp4?t=1411637615&key=8C6363C34A41EF957134313BE5258FCA&upid=3277991411630415299";
    },
            {
        definition = 20;
        desp = "\U9ad8\U6e05";
        playurl = "http://cm22.c110.play.bokecc.com/flvs/ca/Qxc52/uCrWqgNwgC-20.mp4?t=1411637615&key=E1253F7FB242E295D6F21BADF3BD88C2&upid=3277991411630415299";
    }
);
status = 0;
statusinfo = "\U6b63\U5e38";

第四步,调用获取方法

[downloader getPlayInfo];

第五步,初始化 DWDownloader

DWDownloader *downloader = [[DWDownloader alloc] initWithUserId:userId
    andVideoId:videoId
    key:apiKey
    destinationPath:videoPath];

第六步,设置下载HTTP通信超时时间

downloader.timeoutSeconds = 20;

默认超时时间为10秒。

下载过程中HTTP通信超时时,会调用failBlock下载失败的block。告知你下载超时。

第七步,设置block

参考流程1中设置。

第八步,调用下载方法

[downloader startWithUrlString:(NSString *)urlString];

下载视频控制

视频下载控制用来和UI进行交互,当用户点击开始下载、暂停、继续时,可以通过调用DWDownloader的start、pause、resume方法实现对应的视频下载控制。

使用Demo


SDK Demo是使用SDK对接CC视频云的示例源码,Demo的设计旨在展示SDK各项功能的使用方法,如果希望应用获得更好的使用体验,可根据需求自行更改。

Demo采用代码绘制UI界面,这种方式利于精准控制,批量修改、多人协作。


准备

第一步,设置账户信息

首先将你userId和API KEY填写在Demo工程下的Demo-Prefix.pch 中:

#define DWACCOUNT_USERID @"****************"
#define DWACCOUNT_APIKEY @"********************************"

并核对,确认填写无误。userId和API KEY信息会显示在 Demo app 的首页。

第二步,设置下载使用的videoId

你需要在DWDownloadViewController.m中修改generateTestData函数:

- (void)generateTestData
{
    // 将@"..."替换成你要下载的videoId,可以添加多个。 
    self.videoIds = @[];
}

第三步,设置播放使用的videoId

你需要在DWPlayerViewController.m中修改generateTestData函数:

- (void)generateTestData
{
    // 将@"..."替换成你要播放的videoId,可以添加多个。 
    self.videoIds = @[];
}

到此Demo配置完毕,已可以使用Demo测试你的账号。


播放视频

播放器支持本地播放和网络播放,你可以使用DWCustomPlayerViewController播放CC视频云上的视频,也可以使用它播放本地文件,同时你也可以使用MPMoviePlayerController自带的播放器播放。与MPMoviePlayerController相比,DWCustomPlayerViewController提供了字幕、清晰度切换、画面尺寸调整、音量控制等功能;播放页面的UI元素全部是定制的、可修改的。

第一步,使用DWCustomPlayerViewController播放CC视频云上的视频

参见2.1.1 使用SDK播放CC视频云上视频的流程。

第二步,使用DWCustomPlayerViewController播放从CC视频云下载的视频

DWMoviePlayerController *player = [[DWMoviePlayerController alloc] init];

// 设置屏幕高宽比例为:适应屏幕大小,保持宽高比
player.scalingMode = MPMovieScalingModeAspectFit;

player.view.backgroundColor = [UIColor clearColor];

CGRect frame = CGRectZero;
// 设置合适的 frame
UIView *videoBackgroundView = [[UIView alloc] initWithFrame:frame];
[self.view addSubview:videoBackgroundView];

player.view.frame = videoBackgroundView.frame;
[videoBackgroundView addSubview:player.view];

// 设置本地播放NSURL
player.contentURL = [[NSURL alloc] initFileURLWithPath:self.videoLocalPath];

[player prepareToPlay];
[player play];
//[player pause];
//[player stop];

调试与反馈问题


SDK提供了DWLog模块用来打印HTTP通信日志,可以在App的任意位置开启或关闭 打印HTTP通信日志等功能。下面是DWLog的使用方法:


// 开启 打印HTTP通信日志 功能
[DWLog setIsDebugHttpLog:YES];

// 关闭 打印HTTP通信日志 功能
[DWLog setIsDebugHttpLog:NO];

当遇到无法播放、上传或下载时,首先要排除userId和API KEY是否有效,其次判断网络是否正常、是否已经连接。除此之外还可以通过 HTTP通信日志排查问题。



Android

当前版本为2.3.1,此版本SDK支持Android 2.3及以上操作系统。

概述


CC视频Android SDK是基于Android API实现的类库,支持Android2.3及以上版本,开发者可通过此SDK对接CC视频云服务平台,进行播放、上传和下载操作。


CC视频2.0版Android SDK包提供了以下文件:

  • CCSDK.jar,是集成SDK播放、上传和下载等功能的类库;
  • sdk_guide,是SDK的使用指南;
  • ccsdkdemo,是使用SDK对接CC视频云服务的示例源码,支持Android4.0及以上版本;
  • sdk_doc,是描述SDK内部接口信息的文档。

为确保SDK可正常使用,请按照以下操作配置项目环境:

1. 将CCSDK.jar添加到Android项目中,并配置当前项目可正确的引用此类库。

2. 配置项目的网络权限和文件读写权限:

<!-- 用于网络通信 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 用于存储已下载文件 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3. CCSDK.jar已经过混淆处理,如果需要对应用进行混淆编译,请在混淆的配置文件中加入以下代码,以避免SDK被二次混淆编译。

-keep public class com.bokecc.sdk.mobile.**{*;}
-keep public interface com.bokecc.sdk.mobile.**{*;}

视频播放


SDK视频播放由DWMediaPlayer类实现,DWMediaPlayer继承了Android的媒体播放器MediaPlayer类,并重载其prepare()和prepareAsync()方法。

使用DWMediaPlayer既可播放CC视频云服务平台下的视频(以下简称在线播放),也可播放本地视频。


在线播放

使用SDK的在线播放功能时,仅需设置视频ID、账户ID、API KEY及Context(上下文信息)即可播放云端视频。具体实现方式如下:

String videoId ="123456"; 
Context context = getApplicationContext();
DWMediaPlayer player = new DWMediaPlayer();

// 设置视频播放信息
player.setVideoPlayInfo(videoId, "USERID", "API_KEY", context);
player.prepareAsync();

当播放器准备播放完成后,调用start()方法开始播放视频。同时,DWMediaPlayer提供了getVideoStatusInfo(获取视频状态),getVideoTitle(获取视频标题)等方法,开发者可根据需要在应用中展示相应的信息。

选择清晰度播放

DWMediaPlayer提供了getDefinitions()方法获取当前播放的视频清晰度列表。如果需要切换视频的清晰度,可根据当前视频的清晰度对DWMediaPlayer进行设置。具体实现方式如下,

// 获取清晰度列表
Map<String, Integer> definitions = player.getDefinitions();
// 获取某种清晰度对应的状态码
int definitionCode = definitions.get("definitionInfo");
// 设置播放清晰度
player.setDefinition(context, definitionCode);

本地播放

在使用DWMediaPlayer播放本地视频时,与使用Android默认媒体播放器MediaPlayer播放本地视频的方法相同,仅需设置视频文件地址。具体实现方式如下,

String path = "/123456.MP4";
DWMediaPlayer player = new DWMediaPlayer();

//设置视频文件地址
player.setDataSource(path);
player.prepare();

当播放器准备完成后,调用start()方法即可开始播放视频。

错误处理

DWMediaPlayer重载了MediaPlayer的setOnErrorListener()方法,如果需要在应用中提示错误信息,可调用此方法设置OnErrorListener。具体实现方式如下,

private OnErrorListener onErrorListener = new OnErrorListener() {
    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        
        //TODO 处理错误信息
        
        return false;
    }
};

player.setOnErrorListener(onErrorListener);

视频上传


SDK视频上传由Uploader类实现,Uploader通过HTTP协议与服务端进行通信,上传视频信息和视频文件。同时,SDK提供了上传回调接口UploadListener来监听视频上传流程,如果需要在应用中展示上传状态、上传进度等信息,可根据需要进行设置。


Uploader使用示例

使用Uploader上传前,请先了解Uploader的工作流程:

  • 1. 创建Uploader实例,初始化视频信息,此时Uploader进入等待状态(WAIT)。
  • 2. 当需要开始上传时,调用start()方法开始上传,此时Uploader进入上传状态(UPLOAD)。
  • 3. 当需要暂停上传时,调用pause()方法。另外,在上传过程中可能出现网络异常问题,当出现此问题时,Uploader默认会暂停当前上传操作,进入暂停状态(PAUSE)。
  • 4. 当需要恢复上传时,调用resume()方法,若无网络异常等问题,此时Uploader会重新上传视频文件。
  • 5. 当需要取消上作时,调用cancel()方法,此时Uploader会进入等待状态(WAIT)。

创建Uploader实例需提供VideoInfo(视频信息)和 API KEY,使用示例如下:

VideoInfo videoInfo = new VideoInfo();
videoInfo.setTitle("title");
videoInfo.setTags("tag");
videoInfo.setDescription("description"); 
 
// 设置视频文件地址
videoInfo.setFilePath("filePath");
// 设置账号信息
videoInfo.setUserId("USERID"
// 设置回调信息
videoInfo.setNotifyUrl(“NOTIFY_URL");

Uploader uploader = new Uploader(videoInfo,"API_KEY");

// 开始上传
uploader.start();

VideoInfo是用来记录上传过程与视频相关的信息,具体介绍请参考sdk_doc,在初始化视频信息时,服务端需根据视频的标题、标签、描述等来创建视频,所以在使用VideoInfo创建Uploader实例时,请确保视频信息非空。

设置上传回调

Uploader在执行上传操作时,默认会检查是否设置了UploadListener。若已设置UploadListener,Uploader会回调UploadListener已实现的方法;若未设置,则不回调任何信息。UploadListener具体使用方法如下:


UploadListener uploadListener = new UploadListener(){

    @Override
    public void handleProcess(long range, long size, String videoId) {
        // TODO 处理上传进度
    }

    @Override
    public void handleException(DreamwinException exception, int status) {
        // TODO 处理上传过程中出现的异常
    }

    @Override
    public void handleStatus(VideoInfo videoInfo, int status) {
        // TODO 处理上传回调的视频信息及上传状态    
    }

    @Override
    public void handleCancel(String videoId) {
        // TODO 处理取消上传的后续操作    
    }
};

uploader.setUploadListener(uploadListenner);

视频下载


SDK视频下载由Downloader类实现的,Downloader通过HTTP协议与服务端进行通信,获取视频下载地址。同时,SDK提供了下载回调接口DownloadListener来监听视频下载流程,如果需要向用户展示下载状态、下载进度等信息,可根据需要进行设置。


Downloader使用示例

在使用Downloader前,请先了解Downloader的工作流程:

  • 1. 创建Downloader实例,初始化视频文件下载信息,此时Downloader进入等待状态(WAIT)。
  • 2. 当需要开始下载时,调用start()方法,此时Downloader进入下载状态(DOWNLOAD)。
  • 3. 当需要暂停下载时,调用pause()方法。另外,在下载过程中可能出现网络异常问题,当出现此问题时,Downloader默认会暂停下载操作,进入暂停状态(PAUSE)。
  • 4. 当需要恢复下载时,调用resume()方法。若无网络异常等问题,此时Downloader会重新下载视频文件。
  • 5. 当需要取消视频下载时,调用cancel()方法,此时Downloader会进入等待状态(WAIT)。

创建Downloader实例需提供视频存储文件,视频ID,账户ID和API KEY。示例如下:

File file = new File("/123456.MP4");
String videoId ="123456";
Downloader downloader = new Downloader(file, videoId,"USERID","API_KEY");

// 开始下载
downloader.start();

SDK视频下载需指定文件存储路径,所以在创建Downloader实例时,请提供正确的文件存储路径。

设置下载回调

Downloader在执行下载操作时,默认会检查是否设置了DownloadListener。若已设置DownloadListener,Downloader会回调DownloadListener接口已实现的方法;若未设置,则不回调任何信息。DownloadListener使用方法如下:

DownloadListener downloadListener = new DownloadListener(){
    @Override
    public void handleProcess(long start, long end, String videoId) {
        // TODO 处理下载进度
    }

    @Override
    public void handleException(DreamwinException exception, int status) {
        // TODO 处理下载过程中发生的异常信息        
    }

    @Override
    public void handleStatus(String videoId, int status) {
        // TODO 处理视频下载信息及相应状态
    }

    @Override
    public void handleCancel(String videoId) {
        // TODO 处理取消下载的后续操作
    }
};

downloader.setDownloadListener(downloadListener);

选择清晰度下载

流程如下:

  • 1. 创建Downloader实例;
  • 2. 调用setOnProcessDefinitionListener()方式设置清晰度回调;
  • 3. 调用getDefinitionMap()方法获取清晰度;
  • 4. 根据获取的清晰度,调用setDownloadDefinition()方法设置想要的清晰度;
  • 5. 调用start()下载指定清晰度。

获取清晰度时需实现OnProcessDefinitionListener接口的onProcessDefinition()方法,并调用Downloader的setOnProcessDefinitionListener()方法设置获取清晰度回调,获取清晰度的示例如下:

class DownloadDemo{
    private HashMap<Integer, String> dm;
    private Downlaoder downloader;

    private OnProcessDefinitionListener onProcessDefinitionListener = new OnProcessDefinitionListener(){
        @Override
        public void onProcessDefinition(HashMap<Integer, String> definitionMap) {
            if(definitionMap != null){
                dm = definitionMap;
            } else {
                Log.e("get definition error", "视频清晰度获取失败");
            }
        }

        @Override
        public void onProcessException(DreamwinException exception) {
            Log.i("get definition exception", exception.getErrorCode().Value());
        }

    };
    
    private getDefinition(){
        downloader.setOnProcessDefinitionListener(onProcessDefinitionListener);
        downloader.getDefinitionMap();
    }
    ……

}

使用Demo


SDK Demo是使用SDK对接CC视频云服务的示例源码,目前支持Android4.0及以上版本。Demo的设计旨在展示SDK各项功能的使用方法,如果希望应用获得更好的使用体验,可根据需求自行更改。


准备

在编译安装Demo前,请按照以下操作进行配置:

1. 设置帐户信息,在ConfigUtil类中配置USERID(帐户ID)和API KEY。

public final static String API_KEY = "API KEY";
public final static String USERID = "123456";

2. 添加播放列表,在PlayFragment类中配置playVideoIds(可播放的视频ID)。

//TODO 待播放视频ID列表,可根据需求自定义
private String[] playVideoIds = new String[] {
    "123456",
    "234567",
    "345678", 
    "111111"};

添加下载列表,在DownloadFragment类中配置downloadVideoIds(可下载的视频ID)。

//TODO 待下载视频ID,可根据需求自定义
private String[] downloadVideoIds = new String[] {
    "123456",
    "234567",
    "345678", 
    "111111"};

功能模块简介

Demo包含播放、上传和下载三个功能模块:

  • 播放模块,展示了在线播放,屏幕缩放,清晰度切换,字幕等功能,具体实现请参考PlayFragment及MediaPlayActivity类。
  • 上传模块,展示了视频上传的处理流程,及如何使用SDK进行后台上传,具体实现请参考UploadFragment及UploadService类。
  • 下载模块,展示了视频下载的处理流程,及如何使用SDK进行后台下载,具体实现请参考DownloadFragment及DownloadService类。

调试与反馈问题


辅助调试工具

SDK提供HTTP通信日志调试功能。在使用SDK进行播放、上传、下载过程中,如果遇到与网络通信相关的问题,可通过设置HTTP日志的级别获取通信信息。使用示例如下:

// 设置HTTP通信日志级别
HttpUtil.LOG_LEVEL = HttpLogLevel.DETAIL;

默认日志级别为GENERAL(记录HTTP通信发⽣生时间、响应状态码)。

FAQ

Q:无法播放视频

1. 检查已配置的帐户是否开通移动端播放权限      
2. 根据HTTP通信日志,排查网络问题
3. 检查视频状态是否正常

Q:上传视频出现异常

1. 检查已配置的帐户是否开通了客户端上传权限
2. 根据HTTP通信日志,排查网络问题

Q:下载视频出现异常

1. 检查已配置的帐户是否开通了移动端权限
2. 根据HTTP通信日志,排查网络问题
3. 检查视频状态是否正常