直播服务端API文档
1 接口概述
1.1 请求说明
1.1.1 服务地址
网易云信直播服务使用的域名访问地址为:vcloud.163.com。
1.1.2 通信协议
网易云信直播服务的所有接口均通过HTTPS进行通信,提供高安全性的通信通道。
1.1.3 请求方法
所有接口都只支持POST请求。
1.1.4 字符编码
所有接口均使用UTF-8编码。
1.2 公共参数
所有接口均需要放置以下公共参数在请求头中,用于标识用户和接口鉴权。后续的接口说明不再对这些参数进行说明,但每次发起请求均需要携带。
| 参数 |
类型 |
必须 |
说明 |
| AppKey |
String |
是 |
开发者平台分配的AppKey |
| Nonce |
String |
是 |
随机数(随机数,最大长度128个字符) |
| CurTime |
String |
是 |
当前UTC时间戳,从1970年1月1日0点0分0秒开始到现在的秒数 |
| CheckSum |
String |
是 |
服务器认证需要,SHA1(AppSecret+Nonce+CurTime),16进制字符小写 |
1.3 接口鉴权
接口通过请求头中的公共参数进行鉴权。用户通过在用户中心->安全中心获取到的一对安全凭证进行SHA1(AppSecret+Nonce+CurTime)计算。
重要提示: 本文档中提供的所有接口均面向开发者服务器端调用,用于计算CheckSum的AppSecret开发者应妥善保管,可在应用的服务器端存储和使用,但不应存储或传递到客户端,也不应在网页等前端代码中嵌入。
计算CheckSum的java代码举例如下:
import java.security.MessageDigest;
public class CheckSumBuilder {
public static String getCheckSum(String appSecret, String nonce, String curTime) {
return encode("sha1", appSecret + nonce + curTime);
}
private static String encode(String algorithm, String value) {
if (value == null) {
return null;
}
try {
MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
messageDigest.update(value.getBytes());
return getFormattedText(messageDigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static String getFormattedText(byte[] bytes) {
int len = bytes.length;
StringBuilder buf = new StringBuilder(len * 2);
for (int j = 0; j < len; j++) {
buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
}
return buf.toString();
}
private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
}
1.4 返回说明
所有接口返回类型为JSON。返回字段如下:
| 名称 |
类型 |
说明 |
| code |
Int |
返回结果的状态码 |
| ret |
String |
返回的结果集 |
| msg |
String |
当返回结果的状态码不为200时,包含的错误信息 |
| requestId |
String |
用户唯一请求标识字符串 |
2 频道管理
2.1 创建频道
2.1.1 接口说明
创建一个直播频道
2.1.2 请求说明
POST https://vcloud.163.com/app/channel/create HTTP/1.1
Content-Type: application/json;charset=utf-8
2.1.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| name |
String |
频道名称(最大长度64个字符,只支持中文、字母、数字和下划线) |
是 |
| type |
int |
频道类型(0:rtmp) |
是 |
2.1.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"name":"channel_name", "type":0}' https://vcloud.163.com/app/channel/create
Java示例,以下各接口的HttpClient调用方式参考此处:
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.apache.http.Consts;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception{
DefaultHttpClient httpClient = new DefaultHttpClient();
String url = "https://vcloud.163.com/app/channel/create";
HttpPost httpPost = new HttpPost(url);
String appKey = "94kid09c9ig9k1loimjg012345123456";
String appSecret = "123456789012";
String nonce = "1";
String curTime = String.valueOf((new Date()).getTime() / 1000L);
String checkSum = CheckSumBuilder.getCheckSum(appSecret, nonce ,curTime);//参考 计算CheckSum的java代码
// 设置请求的header
httpPost.addHeader("AppKey", appKey);
httpPost.addHeader("Nonce", nonce);
httpPost.addHeader("CurTime", curTime);
httpPost.addHeader("CheckSum", checkSum);
httpPost.addHeader("Content-Type", "application/json;charset=utf-8");
// 设置请求的参数
StringEntity params = new StringEntity("{\"name\":\"netease_vcloud\", \"type\":0}",Consts.UTF_8);
httpPost.setEntity(params);
// 执行请求
HttpResponse response = httpClient.execute(httpPost);
// 打印执行结果
System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));
}
}
2.1.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| cid |
String |
频道ID,32位字符串 |
| ctime |
Long |
创建频道的时间戳 |
| name |
String |
频道名称 |
| pushUrl |
String |
推流地址 |
| httpPullUrl |
String |
http拉流地址 |
| hlsPullUrl |
String |
hls拉流地址 |
| rtmpPullUrl |
String |
rtmp拉流地址 |
| msg |
String |
错误信息 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg" : XXX,
"ret" : {
"cid" : XXX,
"ctime" : XXX,
"pushurl" : XXX,
"httpPullUrl" : XXX,
"hlsPullUrl" : XXX,
"rtmpPullUrl" : XXX
}
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"ret":{
"httpPullUrl":"http://v1.live.126.net/live/cidxxxxxxxxx.flv",
"hlsPullUrl":"http://pullhls1.live.126.net/live/cidxxxxxxxxx/playlist.m3u8",
"rtmpPullUrl":"rtmp://v1.live.126.net/live/cidxxxxxxxxx",
"name":"channel_name",
"pushUrl":"rtmp://p1.live.126.net/live/cidxxxxxxxxx?wsSecret=312e11af6136a77b46afd0ebbb3102af&wsTime=1469411599",
"ctime":1469411598850,
"cid":"cidxxxxxxxxx"
},
"code":200
}
//失败结果示例
{
"code":611,
"msg":"频道名称已经存在"
}
2.1.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 604 |
频道添加失败 |
| 607 |
用户信息不存在 |
| 610 |
频道名称为空 |
| 611 |
频道名称已经存在 |
| 612 |
频道类型错误 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 635 |
服务未开通,请联系商务申请开通! |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
2.2 修改频道
2.2.1 接口说明
修改直播频道信息
2.2.2 请求说明
POST https://vcloud.163.com/app/channel/update HTTP/1.1
Content-Type: application/json;charset=utf-8
2.2.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| name |
String |
频道名(最大长度64个字符) |
是 |
| cid |
String |
频道ID,32位字符串 |
是 |
| type |
int |
频道类型 ( 0 : rtmp) |
是 |
2.2.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"name":"channel_name", "cid":"cidxxxxxxxxx", "type":0}' https://vcloud.163.com/app/channel/update
2.2.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| msg |
String |
错误信息 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg" : XXX,
"ret" : {
}
}
//错误返回示例
"Content-Type": "application/json; charset=utf-8"
{
"code":609,
"msg":"频道ID为空"
}
2.2.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 605 |
频道更新失败 |
| 607 |
用户信息不存在 |
| 609 |
频道ID为空 |
| 610 |
频道名称为空 |
| 611 |
频道名称已经存在 |
| 612 |
频道类型错误 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
2.3 删除频道
2.3.1 接口说明
删除一个直播频道
2.3.2 请求说明
POST https://vcloud.163.com/app/channel/delete HTTP/1.1
Content-Type: application/json;charset=utf-8
2.3.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| cid |
String |
频道ID,32位字符串 |
是 |
2.3.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"cid":"1452b15e9b6941a384a6a5688d478620"}' https://vcloud.163.com/app/channel/delete
2.3.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| msg |
String |
错误信息 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg" : XXX,
"ret" : {
}
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"code" : 200,
"ret" : {}
}
2.3.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 603 |
频道删除失败 |
| 607 |
用户信息不存在 |
| 609 |
频道ID为空 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
2.4 获取频道状态
2.4.1 接口说明
获取一个直播频道的信息
2.4.2 请求说明
POST https://vcloud.163.com/app/channelstats HTTP/1.1
Content-Type: application/json;charset=utf-8
2.4.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| cid |
String |
频道ID,32位字符串 |
是 |
2.4.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"cid":"cidxxxxxxxxx"}' https://vcloud.163.com/app/channelstats
2.4.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| ctime |
Long |
创建频道的时间戳 |
| cid |
String |
频道ID,32位字符串 |
| name |
String |
频道名称 |
| status |
int |
频道状态(0:空闲; 1:直播; 2:禁用; 3:直播录制) |
| type |
int |
频道类型 ( 0 : rtmp, 1 : hls, 2 : http) |
| uid |
Long |
无效字段,无需关注。 |
| needRecord |
int |
1-开启录制; 0-关闭录制 |
| format |
int |
1-flv; 0-mp4 |
| duration |
int |
录制切片时长(分钟),默认120分钟 |
| filename |
String |
录制后文件名 |
| recordStatus |
String |
网易云信内部维护用字段,用户不需关注。后续版本将删除,请勿调用 |
| msg |
String |
错误信息 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg" : XXX,
"ret" : {
"ctime" : XXX,
"cid" : XXX,
"name" : XXX,
"status" : XXX,
"uid" : XXX,
"needRecord" : XXX,
"format" : XXX,
"duration" : XXX,
"filename" : XXX
}
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"ret":{
"needRecord":0,
"uid":10001,
"duration":120,
"status":0,
"name":"channel_name",
"filename":"channel_name",
"format":1,
"type":0,
"ctime":1469411598850,
"cid":"cidxxxxxxxxx"
},
"code":200
}
2.4.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 602 |
查询失败 |
| 607 |
用户信息不存在 |
| 609 |
频道ID为空 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 617 |
频道信息与当前用户不匹配 |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
2.5 获取频道列表
2.5.1 接口说明
获取用户直播频道列表
2.5.2 请求说明
POST https://vcloud.163.com/app/channellist HTTP/1.1
Content-Type: application/json;charset=utf-8
2.5.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| records |
int |
单页记录数,默认值为10 |
否 |
| pnum |
int |
要取第几页,默认值为1 |
否 |
| ofield |
String |
排序的域,支持的排序域为:ctime(默认) |
否 |
| sort |
int |
升序还是降序,1升序,0降序,默认为desc |
否 |
| status |
int |
筛选频道状态,status取值:(0:空闲,1:直播,2:禁用,3:录制中) |
否 |
2.5.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"records":10, "pnum":1, "ofield": "ctime", "sort": 0}' https://vcloud.163.com/app/channellist
2.5.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| ctime |
Long |
创建频道的时间戳 |
| cid |
String |
频道ID,32位字符串 |
| name |
String |
频道名称 |
| status |
int |
频道状态(0:空闲; 1:直播; 2:禁用; 3:直播录制) |
| type |
int |
频道类型 ( 0 : rtmp, 1 : hls, 2 : http) |
| uid |
Long |
无效字段,无需关注。 |
| needRecord |
int |
1-开启录制; 0-关闭录制 |
| format |
int |
1-flv; 0-mp4 |
| duration |
int |
录制切片时长(分钟),默认120分钟 |
| filename |
String |
录制后文件名 |
| msg |
String |
错误信息 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg" : XXX,
"ret" : {
"list" : [
{
"ctime" : XXX,
"cid" : XXX,
"name" : XXX,
"status" : XXX,
"uid" : XXX,
"needRecord" : XXX,
"format" : XXX,
"duration" : XXX,
"filename" : XXX
},
{
"ctime" : XXX,
"cid" : XXX,
"name" : XXX,
"status" : XXX,
"uid" : XXX,
"needRecord" : XXX,
"format" : XXX,
"duration" : XXX,
"filename" : XXX
},
...
]
}
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"ret":{
"pnum":1,
"list":[
{
"needRecord":0,
"uid":10001,
"duration":120,
"status":0,
"name":"channel_name",
"filename":"channel_name",
"format":1,
"type":0,
"ctime":1469411598850,
"cid":"cidxxxxxxxxx"
},
{
"needRecord":0,
"uid":10001,
"duration":120,
"status":0,
"name":"11111",
"filename":"11111",
"format":1,
"type":0,
"ctime":1458701553160,
"cid":"614a2eb9741f46658f400e681e9bdee0"
}
],
...
},
"code":200
}
2.5.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 602 |
查询失败 |
| 607 |
用户信息不存在 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 618 |
查询数据信息不存在 |
| 631 |
请求参数错误 |
| 638 |
访问频率超限,每个应用对该接口限制为500次/分钟。 |
2.6 重新获取推流地址
2.6.1 接口说明
用户创建频道时获取的推流地址失效时,重新获取推流地址。
2.6.2 请求说明
POST https://vcloud.163.com/app/address HTTP/1.1
Content-Type: application/json;charset=utf-8
2.6.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| cid |
String |
频道ID,32位字符串 |
是 |
2.6.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"cid":"cidxxxxxxxxx"}' https://vcloud.163.com/app/address
2.6.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| pushUrl |
String |
推流地址 |
| httpPullUrl |
String |
http拉流地址 |
| hlsPullUrl |
String |
hls拉流地址 |
| rtmpPullUrl |
String |
rtmp拉流地址 |
| msg |
String |
错误信息 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg" : XXX,
"ret" : {
"pushUrl" : XXX,
"httpPullUrl" : XXX,
"hlsPullUrl" : XXX,
"rtmpPullUrl" : XXX
}
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"ret":{
"httpPullUrl":"http://v1.live.126.net/live/cidxxxxxxxxx.flv",
"hlsPullUrl":"http://pullhls1.live.126.net/live/cidxxxxxxxxx/playlist.m3u8",
"rtmpPullUrl":"rtmp://v1.live.126.net/live/cidxxxxxxxxx",
"name":"channel_name",
"pushUrl":"rtmp://p1.live.126.net/live/cidxxxxxxxxx?wsSecret=582e02209271e6bf7fc762e68a7c51cc&wsTime=1469416637"
},
"code":200
}
2.6.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 602 |
查询失败:获取直播地址失败 |
| 607 |
用户信息不存在 |
| 609 |
频道ID为空 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 617 |
频道信息与当前用户不匹配 |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
2.7 设置频道为录制状态
2.7.1 接口说明
设置频道为录制状态,用户推流时,即可录制为视频文件。文件格式、文件名、切片时长等录制配置会在下次推流生效,现推荐调用接口2.22。
2.7.2 请求说明
POST https://vcloud.163.com/app/channel/setAlwaysRecord HTTP/1.1
Content-Type: application/json;charset=utf-8
2.7.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| cid |
String |
频道ID,32位字符串 |
是 |
| needRecord |
int |
1-开启录制; 0-关闭录制 |
是 |
| format |
int |
0-mp4, 1-flv, 2-mp3 |
是 |
| duration |
int |
录制切片时长(分钟),5~120分钟 |
是 |
| filename |
String |
录制后文件名(只支持中文、字母和数字),格式为filename_YYYYMMDD-HHmmss_YYYYMMDD-HHmmss, 文件名_录制起始时间(年月日时分秒) -录制结束时间(年月日时分秒) |
否 |
注意:format设置为mp3格式时,即使推流包含视频流数据,录制文件也只包含音频流数据。
2.7.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"cid": "cidxxxxxxxxx", "needRecord": 1, "format":1, "duration":20, "filename":"record"}' https://vcloud.163.com/app/channel/setAlwaysRecord
2.7.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| msg |
String |
错误信息 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg" : XXX
}
//错误返回示例
"Content-Type": "application/json; charset=utf-8"
{
"code":723,
"msg":"使用直播录制功能需开通云点播服务"
}
2.7.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 501 |
内部错误 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 617 |
频道信息与当前用户不匹配 |
| 618 |
查询数据信息不存在 |
| 631 |
请求参数错误 |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
| 723 |
使用直播录制功能需开通云点播服务 |
2.8 禁用频道
2.8.1 接口说明
禁用用户正在直播的频道。
2.8.2 请求说明
POST https://vcloud.163.com/app/channel/pause HTTP/1.1
Content-Type: application/json;charset=utf-8
2.8.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| cid |
String |
频道ID,32位字符串 |
是 |
2.8.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"cid":"cidxxxxxxxxx"}' https://vcloud.163.com/app/channel/pause
2.8.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| msg |
String |
错误信息 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg" : XXX
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"code" : 200
}
2.8.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 501 |
内部错误 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 617 |
频道信息与当前用户不匹配 |
| 618 |
查询数据信息不存在 |
| 629 |
频道禁用失败 |
| 631 |
请求参数错误 |
| 638 |
访问频率超限,每个应用每天对禁用和恢复频道的接口总调用上限为400次。单次和批量接口统一计算,批量操作每频道每次操作计一次调用。 |
2.9 批量禁用频道
2.9.1 接口说明
禁用一组用户正在直播的频道。(注意:每应用每天对禁用和恢复频道的接口总调用上限为400次。单次和批量接口统一计算,批量操作每频道每次操作计一次调用。超限后,批量禁用或恢复接口可能部分执行失败,请以successList返回内容为准。)
2.9.2 请求说明
POST https://vcloud.163.com/app/channellist/pause HTTP/1.1
Content-Type: application/json;charset=utf-8
2.9.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| cidList |
JsonArray |
频道ID列表 |
是 |
2.9.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"cidList": ["cidxxxxxxxxx", "cidxxxxxxxxx1", "cidxxxxxxxxx2"]}' https://vcloud.163.com/app/channellist/pause
2.9.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| msg |
String |
错误信息 |
| successList |
JsonArray |
成功禁用cid列表 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg" : XXX,
"ret" : {
"successList" : [
XXX,
XXX,
XXX,
...
]
}
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"ret":{
"successList":[
"cidxxxxxxxxx",
"cidxxxxxxxxx1",
"cidxxxxxxxxx2"
]
},
"code":200
}
2.9.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 501 |
内部错误 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 631 |
请求参数错误 |
2.10 恢复频道
2.10.1 接口说明
恢复用户被禁用的频道。
2.10.2 请求说明
POST https://vcloud.163.com/app/channel/resume HTTP/1.1
Content-Type: application/json;charset=utf-8
2.10.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| cid |
String |
频道ID,32位字符串 |
是 |
2.10.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"cid":"cidxxxxxxxxx"}' https://vcloud.163.com/app/channel/resume
2.10.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| msg |
String |
错误信息 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg" : XXX
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"code" : 200
}
2.10.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 501 |
内部错误 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 617 |
频道信息与当前用户不匹配 |
| 618 |
查询数据信息不存在 |
| 630 |
频道恢复失败 |
| 631 |
请求参数错误 |
| 638 |
访问频率超限,每个应用每天对禁用和恢复频道的接口总调用上限为400次。单次和批量接口统一计算,批量操作每频道每次操作计一次调用。 |
2.11 批量恢复频道
2.11.1 接口说明
恢复一组用户正在直播的频道。(注意:每应用每天对禁用和恢复频道的接口总调用上限为400次。单次和批量接口统一计算,批量操作每频道每次操作计一次调用。超限后,批量禁用或恢复接口可能部分执行失败,请以successList返回内容为准。)
2.11.2 请求说明
POST https://vcloud.163.com/app/channellist/resume HTTP/1.1
Content-Type: application/json;charset=utf-8
2.11.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| cidList |
JsonArray |
频道ID列表 |
是 |
2.11.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"cidList": ["cidxxxxxxxxx", "cidxxxxxxxxx1", "cidxxxxxxxxx2"]}' https://vcloud.163.com/app/channellist/resume
2.11.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| msg |
String |
错误信息 |
| successList |
JsonArray |
成功禁用cid列表 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg" : XXX,
"ret" : {
"successList" : [
XXX,
XXX,
XXX,
...
]
}
}
//成功返回示例
"Content-Type": "application/json; charset=utf-8"
{
"ret":{
"successList":[
"cidxxxxxxxxx",
"cidxxxxxxxxx1",
"cidxxxxxxxxx2"
]
},
"code":200
}
2.11.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 501 |
内部错误 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 631 |
请求参数错误 |
| 638 |
访问频率超限,每个应用每天对禁用和恢复频道的接口总调用上限为400次。单次和批量接口统一计算,批量操作每频道每次操作计一次调用。 |
2.12 获取录制视频文件列表
2.12.1 接口说明
获取某频道录制视频文件列表,按生成时间由近至远提供分页。
2.12.2 请求说明
POST https://vcloud.163.com/app/videolist HTTP/1.1
Content-Type: application/json;charset=utf-8
2.12.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| cid |
String |
频道ID,32位字符串 |
是 |
| records |
int |
单页记录数,默认值为10 |
否 |
| pnum |
int |
要取第几页,默认值为1 |
否 |
2.12.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"cid":"cidxxxxxxxxx","records":xx, "pnum":xx}' https://vcloud.163.com/app/videolist
curl -X POST -H "Content-Type: application/json" -H "AppKey: 027338bf05cc4a65b5d98bc9d6af80b3" -H "Nonce: 12345" -H "CurTime: 1469427735815" -H "CheckSum: 86d9602149544997a86769a8d6088cabb12b212b" -d '{"cid":"c82a2b4afe124f53b41b30296768103b","records":10, "pnum":1}' https://vcloud.163.com/app/videolist
2.12.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| msg |
String |
错误信息 |
| videoList |
JsonArray |
录制视频列表 |
| video_name |
String |
录制后文件名,格式为filename_YYYYMMDD-HHmmss_YYYYMMDD-HHmmss, 文件名_录制起始时间(年月日时分秒) -录制结束时间(年月日时分秒) |
| orig_video_key |
String |
视频文件在点播桶中的存储路径 |
| uid |
Long |
无效字段,无需关注。 |
| vid |
Long |
视频文件ID |
| pnum |
Long |
当前页 |
| totalRecords |
Long |
总记录数 |
| totalPnum |
Long |
总页数 |
| records |
Long |
单页记录数 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg" : XXX,
"ret" : {
"pnum" : XXX,
"totalRecords" : XXX,
"totalPnum" : XXX,
"records" : XXX,
"videoList" : [
{
"video_name" : XXX,
"orig_video_key" : XXX,
"uid" : XXX,
"vid" : XXX
},
{
"video_name" : XXX,
"orig_video_key" : XXX,
"uid" : XXX,
"vid" : XXX
},
...
]
}
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"ret":{
"pnum" : 1,
"totalRecords" : 69,
"totalPnum" : 7,
"records" : 10,
"videoList":[
{
"video_name":"new_20160628-113352_20160628-133351",
"orig_video_key":"1_291e3a9d662c4cfaa672bad689f0750b_1467084832593_1467092031353_1312-00001.flv",
"uid":24133,
"vid":42
},
{
"video_name":"new_20160628-093349_20160628-113352",
"orig_video_key":"1_291e3a9d662c4cfaa672bad689f0750b_1467077629013_1467084832593_1312-00000.flv",
"uid":24133,
"vid":41
},
...
]
},
"code":200
}
2.12.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 501 |
内部错误 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 617 |
频道信息与当前用户不匹配 |
| 618 |
频道信息不存在 |
| 631 |
请求参数错误 |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
2.13 获取某一时间范围的录制视频文件列表
2.13.1 接口说明
通过开始和结束的时间点,获取某频道录制视频文件列表。(时间跨度不能超过1周)
2.13.2 请求说明
POST https://vcloud.163.com/app/vodvideolist HTTP/1.1
Content-Type: application/json;charset=utf-8
2.13.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| cid |
String |
频道ID,32位字符串 |
是 |
| beginTime |
long |
查询的起始时间戳(毫秒) |
是 |
| endTime |
long |
查询的结束时间戳(毫秒) |
是 |
| sort |
int |
排序字段,取值为0时降序,为1时升序,默认降序 |
否 |
2.13.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"cid":"cidxxxxxxxxx", "beginTime":begintime, "endTime":endTime}' https://vcloud.163.com/app/vodvideolist
curl -X POST -H "Content-Type: application/json" -H "AppKey: 027338bf05cc4a65b5d98bc9d6af80b3" -H "Nonce: 12345" -H "CurTime: 1469427735815" -H "CheckSum: 86d9602149544997a86769a8d6088cabb12b212b" -d '{"cid":"291e3a9d662c4cfaa672bad689f0750b", "beginTime":1476115200000, "endTime":1476201600000}' https://vcloud.163.com/app/vodvideolist
2.13.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| msg |
String |
错误信息 |
| videoList |
JsonArray |
录制视频列表 |
| name |
String |
录制后文件名,格式为filename_YYYYMMDD-HHmmss_YYYYMMDD-HHmmss, 文件名_录制起始时间(年月日时分秒) -录制结束时间(年月日时分秒) |
| url |
String |
视频文件在点播桶中的存储路径 |
| vid |
Long |
视频文件ID |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg" : XXX,
"ret" : {
"videoList" : [
{
"name" : XXX,
"url" : XXX,
"vid" : XXX
},
{
"name" : XXX,
"url" : XXX,
"vid" : XXX
},
...
]
}
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"ret":{
"videoList":[
{
"name":"new_20160628-113352_20160628-133351",
"url":"1_291e3a9d662c4cfaa672bad689f0750b_1467084832593_1467092031353_1312-00001.flv",
"vid":42
},
{
"name":"new_20160628-093349_20160628-113352",
"url":"1_291e3a9d662c4cfaa672bad689f0750b_1467077629013_1467084832593_1312-00000.flv",
"vid":41
},
...
]
},
"code":200
}
2.13.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 501 |
内部错误 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 617 |
频道信息与当前用户不匹配 |
| 618 |
频道信息不存在 |
| 631 |
请求参数错误 |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
2.14 设置视频录制回调地址
2.14.1 接口说明
用户录制文件生成后,会将生成文件信息推送到该地址, 目前支持HTTP POST,HTTPS POST方式。
2.14.2 请求说明
POST https://vcloud.163.com/app/record/setcallback HTTP/1.1
Content-Type: application/json;charset=utf-8
2.14.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| recordClk |
String |
录制文件生成回调地址(http开头或https开头) |
是 |
2.14.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"recordClk":"http://xxxxxxxxx"}' https://vcloud.163.com/app/record/setcallback
2.14.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| result |
boolean |
是否设置成功 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"ret" : {
result : XXX
}
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"ret":{
"result":true
},
"code":200
}
2.14.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 501 |
内部错误 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 618 |
频道信息不存在 |
| 631 |
请求参数错误 |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
| 655 |
请求参数中回调地址无法访问 |
2.14.7 回调内容示例
{"vid":"7563","orig_video_key":"8bfe052367414ef1bf8baa5b118111_1480499359291_1480499570111_2541778-00002.flv","video_name":"创建频道1_20161130-174919_20161130-175250","uid":"10000","nId":"nId1144","beginTime":"1480499359291","endTime":"1480499570111","cid":"1234XXX","type":"live_record"}
注意:计算MD5签名时须考虑body所有字段,请以实际收到的body字段为准,以下仅为body字段示例。
| 参数 |
说明 |
| video_name |
录制后文件名,格式为filename_YYYYMMDD-HHmmss_YYYYMMDD-HHmmss, 文件名_录制起始时间(年月日时分秒) -录制结束时间(年月日时分秒) |
| origUrl |
视频文件原地址 |
| orig_video_key |
视频文件在点播桶中的存储路径 |
| uid |
无效字段,无需关注。 |
| vid |
视频文件ID |
| cid |
频道ID |
| beginTime |
录制文件起始时间戳(毫秒) |
| endTime |
录制文件结束时间戳(毫秒) |
| nId |
消息ID,同一条消息nId全局唯一,网络超时或接收方返回非200状态码时根据业务规则进行重发,接收方接到多条通知情况下可用于进行消息去重 |
| sign(http请求头) |
对回调body内容按指定格式转换后进行MD5加密生成的签名,sign字段为http请求头内容。 签名规则:将body所有字段按key进行字典排序(升序)组成待签名字符串content,对字符串content+signKey进行MD5签名,如:beginTime=1483406830579&cid=6355099987a648bfb8fb265847&endTime=1483406857109&nId=nId1000&origUrl=http://bucket.vod.126.net/bucket/6355099987a648bfbec0c53.mp4&orig_video_key=6355099987a648bfbec0c53.mp4&uid=100&vid=1000&video_name=092710_20170103signKey,对其进行MD5签名 |
| type |
回调类型,录制回调为"live_record" |
2.15 设置频道状态变化回调地址
2.15.1 接口说明
频道状态发生变化后,会将新的状态信息推送到该地址, 目前支持HTTP POST,HTTPS POST方式。
2.15.2 请求说明
POST https://vcloud.163.com/app/chstatus/setcallback HTTP/1.1
Content-Type: application/json;charset=utf-8
2.15.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| chStatusClk |
String |
频道状态变化回调地址(http开头或https开头) |
是 |
2.15.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"chStatusClk":"http://xxxxxxxxx"}' https://vcloud.163.com/app/chstatus/setcallback
2.15.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| result |
boolean |
是否设置成功 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"ret" : {
result : XXX
}
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"ret":{
"result":true
},
"code":200
}
2.15.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 501 |
内部错误 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 618 |
频道信息不存在 |
| 631 |
请求参数错误 |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
| 655 |
请求参数中回调地址无法访问 |
2.15.7 回调内容示例
{"status":"1","cid":"1234XXX","time":"1480499359291","type":"channel_status"}
注意:计算MD5签名时须考虑body所有字段,请以实际收到的body字段为准,以下仅为body字段示例。
| 参数 |
类型 |
说明 |
| status |
String |
频道状态(0:空闲; 1:直播; 2:禁用; 3:直播录制) |
| cid |
String |
频道ID |
| time |
String |
频道状态变化时间戳(毫秒) |
| type |
String |
回调类型,频道状态回调为"channel_status" |
2.16 设置回调的加签秘钥
2.16.1 接口说明
用该秘钥对回调内容生成MD5签名,用于用户接口的校验。可以不设置,默认为“vcloud”。该秘钥对用户所有设置的回调地址生效。
2.16.2 请求说明
POST https://vcloud.163.com/app/callback/setSignKey HTTP/1.1
Content-Type: application/json;charset=utf-8
2.16.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| signKey |
String |
加签秘钥 |
是 |
2.16.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"signKey":"xxxxxxxxx"}' https://vcloud.163.com/app/callback/setSignKey
2.16.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| result |
boolean |
是否设置成功 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"ret" : {
result : XXX
}
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"ret":{
"result":true
},
"code":200
}
2.16.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 501 |
内部错误 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 618 |
频道信息不存在 |
| 631 |
请求参数错误 |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
2.17 录制文件合并
2.17.1 接口说明
对于同一次录制产生的切片文件,合并成一个文件,通过查询录制文件列表接口可获取。目前支持同MP4格式间或同flv格式间的文件合并,待合并文件的分辨率、音视频轨道数编码格式要求一致,且同时在合并的任务数不能超过3个, 待合并视频总时长不得超过8小时,1分钟接口调用不能超过10次。如果用户设置了回调地址,也会将合并好的视频回调给用户(回调内容不包含beginTime,endTime),参看接口2.14 (设置视频录制回调地址)。
2.17.2 请求说明
POST https://vcloud.163.com/app/video/merge HTTP/1.1
Content-Type: application/json;charset=utf-8
2.17.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| outputName |
String |
合并文件的名称(不能含有空格),无需包含文件后缀 |
是 |
| vidList |
JsonArray |
待合并的视频文件的ID列表(文件ID类型为long),视频文件数量限制为2-20个 |
是 |
| widthCutStyle |
int |
当视频的分辨率不一样时宽度的处理策略,默认填充黑边 |
否 |
| heightCutStyle |
int |
当视频的分辨率不一样时高度的处理策略,默认填充黑边 |
否 |
2.17.4 CutStyle参数说明
| 值 |
说明 |
| 0 |
填充黑边,宽度和高度都能用 |
| 1 |
平均切割,宽度和高度都可用,表示如果输入视频的宽高比不一样时要剪裁视频的宽度或高度时在左右或者上下平均剪裁 |
| 2 |
如果要切宽的时候只切左边,宽度可用,表示如果输入视频的宽高比不一样 要剪裁视频的宽度时只剪裁左边 |
| 3 |
如果要切宽的时候只切右边,宽度可用,表示如果输入视频的宽高比不一样要剪裁视频的宽度时只剪裁右边 |
| 4 |
如果要切高的时候只切上边,高度可用,表示如果输入视频的宽高比不一样要剪裁视频的高度时只剪裁上边 |
| 5 |
如果要切高的时候只切下边,高度可用,表示如果输入视频的宽高比不一样要剪裁视频的高度时只剪裁下边 |
2.17.5 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"outputName":"xxxxxxxxx", "vidList": [vidxxxxxxxxx0, vidxxxxxxxxx1, vidxxxxxxxxx2],"widthCutStyle":0,"heightCutStyle":0}' https://vcloud.163.com/app/video/merge
2.17.6 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| result |
boolean |
请求是否成功 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"ret" : {
result : XXX
}
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"ret":{
"result":true
},
"code":200
}
2.17.7 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 501 |
内部错误 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 618 |
频道信息不存在 |
| 631 |
请求参数错误 |
| 638 |
访问频率超限 |
| 639 |
任务数量已达上限 |
| 1667 |
合并总时长超过8小时限制 |
2.17.8 合并视频回调内容示例
,//视频合并成功的回调示例
{"vid":"5898","orig_video_key":"aafbf25d-1a40-4097-aa6e-f4a2fd692xxx.mp4","video_name":"合并请求参数outputName","uid":"2900","nId":"nId46514","cid":"a285cxxxxxxx","type":"live_merge_video"}
//视频合并失败的回调示例
{"outputName":"合并请求参数outputName","nId":"nId1144","devMsg":"Merge Video Fail","type":"live_merge_video"}
2.18 录制重置
2.18.1 接口说明
该接口用于:在直播录制过程中,结束正在进行的录制,开启一个新的录制任务。可用来对录制进行主动分片。
2.18.2 请求说明
POST https://vcloud.163.com/app/channel/resetRecord HTTP/1.1
Content-Type: application/json;charset=utf-8
2.18.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| cid |
String |
频道ID,32位字符串 |
是 |
2.18.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"cid": "cidxxxxxxxxx"}' https://vcloud.163.com/app/channel/resetRecord
2.18.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| msg |
String |
错误信息 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg": XXX,
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"code":200
}
//错误返回示例
"Content-Type": "application/json; charset=utf-8"
{
"code":723,
"msg":"使用直播录制功能需开通云点播服务"
}
2.18.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 501 |
内部错误 |
| 607 |
用户信息不存在 |
| 609 |
频道ID为空 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 617 |
频道信息与当前用户不匹配 |
| 618 |
查询数据信息不存在 |
| 631 |
请求参数错误 |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
| 647 |
频道不存在 |
| 648 |
频道未开启录制 |
| 723 |
使用直播录制功能需开通云点播服务 |
2.19 直播实时转码地址
2.19.1 接口说明
该接口用于:获取直播实时转码相关地址。
2.19.2 请求说明
POST https://vcloud.163.com/app/transcodeAddress HTTP/1.1
Content-Type: application/json;charset=utf-8
2.19.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| cid |
String |
频道ID |
是 |
2.19.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"cid": "cidxxxxxxxxx"}' https://vcloud.163.com/app/transcodeAddress
2.19.5 返回说明
| 参数 |
类型 |
说明 |
| code |
int |
错误码 |
| msg |
String |
错误信息 |
| requestId |
String |
全局唯一请求id |
| status |
int |
拉流转码状态0->暂未开通,1->已开通 |
| pushUrl |
String |
推流地址 |
| httpPullUrl |
String |
http拉流地址 |
| hlsPullUrl |
String |
hls拉流地址 |
| rtmpPullUrl |
String |
rtmp拉流地址 |
| transcodeHttpPullUrl |
String |
实时转码http拉流地址,当status=0时该数据结点不存在 |
| transcodeRtmpPullUrl |
String |
实时转码rtmp拉流地址,当status=0时该数据结点不存在 |
| transcodeHlsPullUrl |
String |
实时转码hls拉流地址,当status=0时该数据结点不存在 |
| 1280 |
String |
16:9,1280x720,1600k格式拉流地址 |
| 960 |
String |
16:9,960x540,1000k格式拉流地址 |
| 640 |
String |
16:9,640x360,600k格式拉流地址 |
| 320 |
String |
16:9,320x180,300k格式拉流地址 |
| 540 |
String |
9:16,540x960,1000k格式拉流地址 |
| 360 |
String |
9:16,360x640,600k格式拉流地址 |
| 180 |
String |
9:16,180x320,300k格式拉流地址 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg": XXX,
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"code":200,
"requestId":"xxxxxxxxx",
"ret":{
"status":1,
"pushUrl":"rtmp://pxxxxxx.live.126.net/live/cidxxxxxxxxx?wsSecret=582e02209271e6bf7fc762e68a7c51cc&wsTime=1469416637",
"httpPullUrl":"http://flvxxxxx.live.126.net/live/频道id.flv",
"hlsPullUrl":"http://pullhlsxxxxx.live.126.net/live/频道id/playlist.m3u8",
"rtmpPullUrl":"http://vxxxxx.live.126.net/live/频道id",
"transcodeHttpPullUrl":{
"1280":"http://flvxxxxx.live.126.net/live/频道id_H1.flv",
"960":"http://flvxxxxx.live.126.net/live/频道id_H2.flv",
"640":"http://flvxxxxx.live.126.net/live/频道id_H3.flv",
"320":"http://flvxxxxx.live.126.net/live/频道id_H4.flv",
"540":"http://flvxxxxx.live.126.net/live/频道id_S1.flv",
"360":"http://flvxxxxx.live.126.net/live/频道id_S2.flv",
"180":"http://flvxxxxx.live.126.net/live/频道id_S3.flv"
},
"transcodeRtmpPullUrl":{
"1280":"rtmp://vxxxxx.live.126.net/live/频道id_H1",
"960":"rtmp://vxxxxx.live.126.net/live/频道id_H2",
"640":"rtmp://vxxxxx.live.126.net/live/频道id_H3",
"320":"rtmp://vxxxxx.live.126.net/live/频道id_H4",
"540":"rtmp://vxxxxx.live.126.net/live/频道id_S1",
"360":"rtmp://vxxxxx.live.126.net/live/频道id_S2",
"180":"rtmp://vxxxxx.live.126.net/live/频道id_S3"
},
"transcodeHlsPullUrl":
{
"1280":"http://pullhlsxxxxx.live.126.net/live/频道id_H1/playlist.m3u8",
"960":"http://pullhlsxxxxx.live.126.net/live/频道id_H2/playlist.m3u8",
"640":"http://pullhlsxxxxx.live.126.net/live/频道id_H3/playlist.m3u8",
"320":"http://pullhlsxxxxx.live.126.net/live/频道id_H4/playlist.m3u8",
"540":"http://pullhlsxxxxx.live.126.net/live/频道id_S1/playlist.m3u8",
"360":"http://pullhlsxxxxx.live.126.net/live/频道id_S2/playlist.m3u8",
"180":"http://pullhlsxxxxx.live.126.net/live/频道id_S3/playlist.m3u8"
}
}
}
2.19.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 602 |
查询失败:获取直播地址失败 |
| 607 |
用户信息不存在 |
| 609 |
频道ID为空 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 617 |
频道信息与当前用户不匹配 |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
2.20 视频录制回调地址查询
2.20.1 接口说明
用于查询视频录制回调地址。
2.20.2 请求说明
POST https://vcloud.163.com/app/record/callbackQuery HTTP/1.1
Content-Type: application/json;charset=utf-8
2.20.3 参数说明
2.20.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey:29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" https://vcloud.163.com/app/record/callbackQuery
2.20.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| callbackUrl |
String |
回调地址 |
| lastUpdateTime |
String |
最近更新时间 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"ret": {
"callbackUrl" : "xxxxxxxxxxx",
"lastUpdateTime" : "2017-08-15 12:22:11"
},
"code": 200
}
2.20.6 响应状态码
| 状态码 |
含义 |
| 200 |
处理成功 |
| 409 |
用户登录认证失败 |
| 607 |
用户信息不存在 |
| 608 |
Session信息不完整 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 624 |
请求参数非法 |
| 625 |
appKey为空 |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
2.21 频道状态变化回调地址查询
2.21.1 接口说明
用于查询频道状态变化回调地址。
2.21.2 请求说明
POST https://vcloud.163.com/app/chstatus/callbackQuery HTTP/1.1
Content-Type: application/json;charset=utf-8
2.21.3 参数说明
2.21.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey:29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" https://vcloud.163.com/app/chstatus/callbackQuery
2.21.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| callbackUrl |
String |
回调地址 |
| lastUpdateTime |
String |
最近更新时间 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"ret": {
"callbackUrl" : "xxxxxxxxxxx",
"lastUpdateTime" : "2017-08-15 12:22:11"
},
"code": 200
}
2.21.6 响应状态码
| 状态码 |
含义 |
| 200 |
处理成功 |
| 409 |
用户登录认证失败 |
| 607 |
用户信息不存在 |
| 608 |
Session信息不完整 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 624 |
请求参数非法 |
| 625 |
appKey为空 |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
2.22 设置录制信息
2.22.1 接口说明
设置直播录制信息。直播录制信息包括录制文件的格式、切片时长、文件名等录制配置,以及频道的自动录制标志位。直播录制信息的变更在下次推流生效。
注意:由于录制信息的变更不会在当前推流录制中启用,建议针对使用自动录制功能的频道,在创建完毕后即进行设置,不建议频繁调用
2.22.2 请求说明
POST https://vcloud.163.com/app/channel/setupRecordInfo HTTP/1.1
Content-Type: application/json;charset=utf-8
2.22.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| cid |
String |
频道ID,32位字符串 |
是 |
| needRecord |
int |
1-自动录制; 0-不录制 |
是 |
| format |
int |
0-mp4, 1-flv, 2-mp3 |
是 |
| duration |
int |
录制切片时长(分钟),5~120分钟 |
是 |
| filename |
String |
录制后文件名(只支持中文、字母和数字),格式为filename_YYYYMMDD-HHmmss_YYYYMMDD-HHmmss, 文件名_录制起始时间(年月日时分秒) -录制结束时间(年月日时分秒) |
否 |
注意:format设置为mp3格式时,即使推流包含视频流数据,录制文件也只包含音频流数据。
2.22.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"cid": "cidxxxxxxxxx", "needRecord": 1, "format":1, "duration":20, "filename":"record"}' https://vcloud.163.com/app/channel/setupRecordInfo
2.22.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| msg |
String |
错误信息 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg" : XXX
}
//错误返回示例
"Content-Type": "application/json; charset=utf-8"
{
"code":723,
"msg":"使用直播录制功能需开通云点播服务"
}
2.22.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 501 |
内部错误 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 617 |
频道信息与当前用户不匹配 |
| 618 |
查询数据信息不存在 |
| 631 |
请求参数错误 |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
| 650 |
录制文件名长度非法,长度应在1~60个字符 |
| 723 |
使用直播录制功能需开通云点播服务 |
2.23 设置录制视频存活时间
2.23.1 接口说明
用户可设置录制视频的存活时间,过期后视频将被自动删除
2.23.2 请求说明
POST https://vcloud.163.com/app/record/setExpire HTTP/1.1
Content-Type: application/json;charset=utf-8
2.23.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| cid |
String |
频道ID |
否 |
| lifespan |
Long |
录制视频存活时间(单位:秒),范围:[1天-1年] 如果cid为NULL,则是用户级别的存活时间 如果cid不为NULL,则是频道级别的存活时间 |
是 |
注意:如果同时设置了用户级别和频道级别的存活时间,如:设置用户级别存活时间为172800(2天),频道ID为"cidxxx"的录制视频存活时间为86400(1天),那么频道"cidxxx"下产生的录制视频的存活时间为1天,除了"cidxxx"之外的所有频道产生的录制视频的存活时间为2天。
2.23.4 curl请求实例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"cid":"cidxxxxxxxxx", "lifespan": 86400}' https://vcloud.163.com/app/record/setExpire
2.23.5 返回说明
http响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| msg |
String |
错误信息 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg" : XXX
}
//错误返回示例
"Content-Type": "application/json; charset=utf-8"
{
"code":723,
"msg":"使用直播录制功能需开通云点播服务"
}
2.23.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 602 |
查询失败 |
| 607 |
用户信息不存在 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 618 |
查询数据信息不存在 |
| 631 |
请求参数错误 |
| 638 |
访问频率超限,每个应用对该接口限制为500次/分钟。 |
2.24 查询录制视频存活时间
2.24.1 接口说明
用户可查询之前设置的录制视频的存活时间,包括用户级别和频道级别,频道级别按频道ID升序返回
2.24.2 请求说明
POST https://vcloud.163.com/app/record/getExpire HTTP/1.1
Content-Type: application/json;charset=utf-8
2.24.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| records |
int |
单页记录数,不超过200,默认值为10 |
否 |
| pnum |
int |
要取第几页,默认值为1 |
否 |
2.24.4 curl请求实例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"records":10, "pnum": 1}' https://vcloud.163.com/app/record/getExpire
2.24.5 返回说明
http响应:json
| 参数 |
类型 |
说明 |
| cid |
String |
频道ID |
| lifespan |
Long |
录制视频存活时间(秒) |
| pnum |
Long |
当前页 |
| totalRecords |
Long |
总记录数 |
| totalPnum |
Long |
总页数 |
| records |
Long |
单页记录数 |
| code |
int |
状态码 |
| msg |
String |
错误信息 |
//正确返回示例
"Content-Type": "application/json; charset=utf-8"
{
"ret": {
// 用户级别的存活时间
"userLevel": 172800,
// 频道级别的存活时间
"channelLevel": {
"pnum": 1,
"list": [{
// <cid:lifespan>
"03ba531015dd4b6bb7574fcdfe4103d5": 86400
}, {
"055fa99af861422e9d72e1917dec2cfb": 86400
}, {
"0ca6689b337349c4878f808a98d52c61": 86400
}, {
"11eeeb1c3cb64e178c0500d5ce21aa38": 86400
}, {
"15b481e68e8d44f096b2ba9c10012cd5": 86400
}, {
"196d092940a84751bc6c065829f547e5": 86400
}, {
"205f4d4e1b8e445e8f7d5d36af2952ce": 86400
}, {
"2e72caafd0bf4debb15358d160754a9d": 86400
}, {
"3e3dedd39017481c91713ec0611942ad": 86400
}, {
"43deb4dd899744ab9067b2a1b7803004": 86400
}],
"totalRecords": 12,
"totalPnum": 2,
"records": 10
}
},
"requestId": "livec67488ad5a434afbab6cfdde4e9a5e4e",
"code": 200
}
2.24.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 602 |
查询失败 |
| 607 |
用户信息不存在 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 618 |
查询数据信息不存在 |
| 631 |
请求参数错误 |
| 638 |
访问频率超限,每个应用对该接口限制为500次/分钟。 |
2.25 取消录制视频存活时间
2.25.1 接口说明
用户可取消录制视频的存活时间。取消后,录制视频不再有存活时间的概念,除非主动删除否则视频将永久保存。
2.25.2 请求说明
POST https://vcloud.163.com/app/record/cancelExpire HTTP/1.1
Content-Type: application/json;charset=utf-8
2.25.3 参数说明
| 参数 |
类型 |
说明 |
必须 |
| cid |
String |
频道ID 如果cid为NULL,则取消用户级别的存活时间 如果cid不为NULL,则取消频道级别的存活时间 |
否 |
说明:取消用户级别和频道级别的存活时间是互不影响的。如果同时设置了用户级别和频道级别的存活时间:取消某频道级别的存活时间后,该频道下的录制视频的存活时间遵循用户级别的设置;取消用户级别的存活时间后,频道下的录制视频的存活时间仍遵循该频道的设置。
2.25.4 curl请求实例
curl -X POST -H "Content-Type: application/json" -H "AppKey: 29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"cid":"cidxxxxxxxxx"}' https://vcloud.163.com/app/record/cancelExpire
2.25.5 返回说明
http响应:json
| 参数 |
类型 |
说明 |
| code |
int |
状态码 |
| msg |
String |
错误信息 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code" : XXX,
"msg" : XXX
}
//错误返回示例
"Content-Type": "application/json; charset=utf-8"
{
"code":723,
"msg":"使用直播录制功能需开通云点播服务"
}
2.25.6 响应状态码
| 状态码 |
含义 |
| 200 |
操作成功 |
| 409 |
用户登录认证失败 |
| 602 |
查询失败 |
| 607 |
用户信息不存在 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 618 |
查询数据信息不存在 |
| 631 |
请求参数错误 |
| 638 |
访问频率超限,每个应用对该接口限制为500次/分钟。 |
2.26 删除回调地址
2.26.1 接口说明
用于删除指定类型的回调地址,调用本接口后,您不会再收到相应类型的回调信息。
2.26.2 请求说明
POST https://vcloud.163.com/app/callback/delUrl HTTP/1.1
Content-Type: application/json;charset=utf-8
2.26.3 参数说明
| 参数 |
类型 |
必须 |
说明 |
| type |
int |
是 |
回调地址类型: 1:录制回调 2:频道状态变化回调 |
2.26.4 curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey:29781bbc4db54742a3ebcxxxxxxxxxxx" -H "Nonce: 12345" -H "CurTime: 1469171950571" -H "CheckSum: 4ba6ca70c685eb900917e423eadaxxxxxxxxxxxxx" -d '{"type":1}' https://vcloud.163.com/app/callback/delUrl
2.26.5 返回说明
http 响应:json
| 参数 |
类型 |
说明 |
| code |
int |
错误码 |
| result |
boolean |
是否删除成功 |
//返回结果格式
"Content-Type": "application/json; charset=utf-8"
{
"code": 200,
"ret": {
"result" : XXX
}
}
//成功结果示例
"Content-Type": "application/json; charset=utf-8"
{
"code": 200,
"ret": {
"result" : true
}
}
2.26.6 响应状态码
| 状态码 |
含义 |
| 200 |
处理成功 |
| 409 |
用户登录认证失败 |
| 607 |
用户信息不存在 |
| 608 |
Session信息不完整 |
| 613 |
CheckSum为空 |
| 614 |
AppKey为空 |
| 615 |
CurTime为空 |
| 624 |
请求参数非法 |
| 625 |
appKey为空 |
| 638 |
访问频率超限,每个应用对该接口限制为80次/秒。 |
3 直播安全
如何保证直播资源的安全是直播服务面临的一个重要问题。对于直播推流,攻击者拿到推流地址后会进行抢占式推流,不仅影响源流的正常推流,还抢占了带宽资源;对于直播拉流,如果用户的视频源是热门资源(比如赛事的独家直播),竞争对手拿到拉流地址后会在自己的平台上进行播放,严重影响用户的正常业务。因此,网易云信提供了防盗链功能,保障用户的资源不被轻易盗用。
3.1 防盗链
3.1.1 功能简介
直播防盗链是指通过在推拉流地址中添加鉴权字符串,来保证视频资源安全的一种方式。开通直播防盗链功能后,推拉流地址中会包含一段鉴权字符串,只有合法生成的鉴权串才能进行正常的推流和拉流;另外,推拉流地址具有时效性,只有在有效期内才能正常地推拉流。
3.1.2 功能原理
直播防盗链分为推流防盗链和拉流防盗链,都是利用URL鉴权来实现的,该功能是通过云信CDN加速节点与用户资源站点配合实现:
- 开通防盗链功能后,用户服务器向视频云服务器请求推拉流地址URL(已添加鉴权串)
- 用户资源站点提供给终端用户加密URL(资源地址加权限验证信息);
- 终端用户使用加密后的URL向云信加速节点发起请求;
- 加速节点对加密URL中的权限信息和时效信息进行验证,对合法且在有效期内的请求正常响应,对非法或过期的请求拒绝响应
3.1.3 使用说明
直播防盗链使用说明