由于文档过多,本帖主要分享直播开发教程,网易视频云提供一对一技术支持,感兴趣的同学,2479775187qq交流。
一、使用流程
产品描述
网易视频云直播源自网易多年视频技术沉淀,基于专业的跨平台视频编解码技术和大规模视频内容分发网络,提供稳定流畅、低延时、高并发的实时音视频服务,有视频直播需求的用户可调用视频云直播提供的API或SDK即可将视频直播无缝对接到自身的业务应用系统。
本服务适用于各类音视频直播场景,比如教育行业的在线教育、网络课堂等,娱乐行业的美女直播、游戏直播等,广电行业的电视直播、赛事直播等,另外还适用于企业协作、远程医疗、云监控、庭审直播等其他视频相关行业。
目前,网易视频云直播面向注册用户开放。
开通流程
注册和登录
1.注册登录后点击“云直播”打开开通申请页,提交申请后等待后台审核。
2.后台审核通过,直播服务开通,点击“管理控制台”后进入直播管理控制台。
计费模式
计费方式 | 价格 | 说明 |
---|---|---|
按流量 | 1.00元/GB | 计费周期:以自然月为周期,计算周期内每日消耗的流量累计值,以此为计费值,出日账单和月账单 |
按带宽峰值 | 35元/Mbps/月 | 计费周期:以自然月为周期,计算周期内每日消耗的带宽峰值,按最高的日峰值为计费值,出月账单 |
管理控制台
频道管理
点击“管理控制台”进入直播管理
在直播管理页面中,您可以查看当前直播频道的情况。包括频道名称、ID、创建时间、频道状态和操作等等。可
以对直播名称进行搜索,也可以批量对直播频道进行暂停、恢复和删除。直播频道建立后,将出现在频道列表中。
频道状态
频道状态共有“空闲”、“直播中”、“直播录制中”和“禁用”四种状态。
新建频道
1.在频道管理页中点击“新建”按钮
2.输入频道名称
3.频道类型:当前默认RTMP类型,后期会其他类型可选择
4.创建后跳转频道列表页显示
频道地址
点击频道列表操作下的“地址”,显示1条RTMP推流地址和HTTP、HLS、RTMP3条拉流地址。使用直播推流SDK或Demo输入推流地址即可开始直播推流,使用播放器SDK或Demo输入拉流地址(任意一条拉流地址)即可收看直播。
直播录制
点击频道列表操作下的“录制”,可以修改此频道的录制配置,如是否开启直播时自动录制、录制视频的名称、录制视频的默认格式及切片的长度等,直播录制一律存放到云点播服务器,因此使用直播录制功能必须先开通云点播VOD服务。
数据统计
点击“数据统计”,可查询带宽峰值、流量(含上行和下行流量)统计信息,其中带宽峰值统计粒度为10分钟,流量以天为统计粒度,统计粒度内的累计消耗。
二、直播服务端API文档
接口概述
API调用说明
本文档中,所有调用视频云服务端接口的请求都需要按此规则校验。
API token校验
以下参数需要放在Http Request Header中
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
AppKey | String | 是 | 开发者平台分配的appkey |
Nonce | String | 是 | 随机数(随机数,最大长度128个字符) |
CurTime | String | 是 | 当前UTC时间戳,从1970年1月1日0点0分0秒开始到现在的秒数 |
CheckSum | String | 是 | 服务器认证需要,SHA1(AppSecret+Nonce+CurTime),16进制字符小写 |
重要提示: 本文档中提供的所有接口均面向开发者服务器端调用,用于计算CheckSum的secretkey开发者应妥善保管,可在应用的服务器端存储和使用,但不应存储或传递到客户端,也不应在网页等前端代码中嵌入。
计算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' }; }
接口说明
所有接口都只支持POST请求
所有接口请求Content-Type类型为:application/json;charset=utf-8
所有接口返回类型为JSON,同时进行UTF-8编码
频道管理
创建频道
接口说明
创建一个直播频道
请求说明
POST https://vcloud.163.com/app/channel/create HTTP/1.1 Content-Type: application/json;charset=utf-8
参数说明
参数 | 类型 | 说明 | 必须 |
---|---|---|---|
name | String | 频道名称 | 是 |
type | int | 频道类型(0:rtmp;1:hls;2:http) | 是 |
curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: XXXX" -H "Nonce: XXXX" -H "CurTime: xxxx" -H "CheckSum: XXXX" -d '{"name":"netease_vcloud", "type":0}' https://vcloud.163.com/app/channel/create
HttpClient请求示例(以下各接口的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")); } }
返回说明
http 响应:json
参数 | 类型 | 说明 |
---|---|---|
code | int | 错误码 |
cid | String | 频道ID,32位字符串 |
ctime | Long | 创建频道的时间戳 |
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 } }
code参考code状态表
修改频道
接口说明
修改直播频道信息
请求说明
POST https://vcloud.163.com/app/channel/update HTTP/1.1 Content-Type: application/json;charset=utf-8
参数说明
参数 | 类型 | 说明 | 必须 |
---|---|---|---|
name | String | 频道名 | 是 |
cid | String | 频道ID,32位字符串 | 是 |
type | int | 频道类型 ( 0 : rtmp, 1 : hls, 2 : http) | 是 |
curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: XXXX" -H "Nonce: XXXX" -H "CurTime: xxxx" -H "CheckSum: XXXX" -d '{"name":"netease_vcloud", "cid":"XXXXX", "type":0}' https://vcloud.163.com/app/channel/update
返回说明
http 响应:json
参数 | 类型 | 说明 |
---|---|---|
code | int | 错误码 |
msg | String | 错误信息 |
"Content-Type": "application/json; charset=utf-8" { "code" : XXX, "msg" : XXX, "ret" : { } }
code参考code状态表
删除频道
接口说明
删除一个直播频道
请求说明
POST https://vcloud.163.com/app/channel/delete HTTP/1.1 Content-Type: application/json;charset=utf-8
参数说明
参数 | 类型 | 说明 | 必须 |
---|---|---|---|
cid | String | 频道ID,32位字符串 | 是 |
curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: XXXX" -H "Nonce: XXXX" -H "CurTime: xxxx" -H "CheckSum: XXXX" -d '{"cid":"XXXXX"}' https://vcloud.163.com/app/channel/delete
返回说明
http 响应:json
参数 | 类型 | 说明 |
---|---|---|
code | int | 错误码 |
msg | String | 错误信息 |
"Content-Type": "application/json; charset=utf-8" { "code" : XXX, "msg" : XXX, "ret" : { } }
code参考code状态表
获取频道状态
接口说明
获取一个直播频道的信息
请求说明
POST https://vcloud.163.com/app/channelstats HTTP/1.1 Content-Type: application/json;charset=utf-8
参数说明
参数 | 类型 | 说明 | 必须 |
---|---|---|---|
cid | String | 频道ID,32位字符串 | 是 |
curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: XXXX" -H "Nonce: XXXX" -H "CurTime: xxxx" -H "CheckSum: XXXX" -d '{"cid":"XXXXX", "name":"netease_vcloud"}' https://vcloud.163.com/app/channelstats
返回说明
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 | 用户ID |
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" : { "ctime" : XXX, "cid" : XXX, "name" : XXX, "status" : XXX, "uid" : XXX, "needRecord" : XXX, "format" : XXX, "duration" : XXX, "filename" : XXX } }
code参考code状态表
获取频道列表
接口说明
获取用户直播频道列表
请求说明
POST https://vcloud.163.com/app/channellist HTTP/1.1 Content-Type: application/json;charset=utf-8
参数说明
参数 | 类型 | 说明 | 必须 |
---|---|---|---|
records | int | 单页记录数,默认值为10 | 否 |
pnum | int | 要取第几页,默认值为1 | 否 |
ofield | String | 排序的域,支持的排序域为:ctime(默认) | 否 |
sort | int | 升序还是降序,1升序,0降序,默认为desc | 否 |
curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: XXXX" -H "Nonce: XXXX" -H "CurTime: xxxx" -H "CheckSum: XXXX" -d '{"records":XXX, "pnum":XXX, "ofield": "XXX", "sort": XXX}' https://vcloud.163.com/app/channellist
返回说明
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 | 用户ID |
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 }, ... ] } }
code参考code状态表
重新获取推流地址
接口说明
用户创建频道时获取的推流地址失效时,重新获取推流地址。
请求说明
POST https://vcloud.163.com/app/address HTTP/1.1 Content-Type: application/json;charset=utf-8
参数说明
参数 | 类型 | 说明 | 必须 |
---|---|---|---|
cid | String | 频道ID | 是 |
curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: XXXX" -H "Nonce: XXXX" -H "CurTime: xxxx" -H "CheckSum: XXXX" -d '{"cid": "xxxx"}' https://vcloud.163.com/app/address
返回说明
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 } }
code参考code状态表
设置频道为录制状态
接口说明
设置频道为录制状态,用户推流时,即可录制为视频文件。
请求说明
POST https://vcloud.163.com/app/channel/setAlwaysRecord HTTP/1.1 Content-Type: application/json;charset=utf-8
参数说明
参数 | 类型 | 说明 | 必须 |
---|---|---|---|
cid | String | 频道ID | 是 |
needRecord | int | 1-开启录制; 0-关闭录制 | 是 |
format | int | 1-flv; 0-mp4 | 是 |
duration | int | 录制切片时长(分钟),默认120分钟 | 否 |
filename | String | 录制后文件名,格式为filename_YYYYMMDD-HHmmssYYYYMMDD-HHmmss, 文件名录制起始时间(年月日时分秒) -录制结束时间(年月日时分秒) |
否 |
curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: XXXX" -H "Nonce: XXXX" -H "CurTime: xxxx" -H "CheckSum: XXXX" -d '{"cid": "XXX", "needRecord": XXX, "format":XXX, "duration":XXX, "filename":"XXX"}' https://vcloud.163.com/app/channel/setAlwaysRecord
返回说明
http 响应:json
参数 | 类型 | 说明 |
---|---|---|
code | int | 错误码 |
msg | String | 错误信息 |
"Content-Type": "application/json; charset=utf-8" { "code" : XXX, "msg" : XXX }
code参考code状态表
暂停频道
接口说明
暂停用户正在直播的频道。
请求说明
POST https://vcloud.163.com/app/channel/pause HTTP/1.1 Content-Type: application/json;charset=utf-8
参数说明
参数 | 类型 | 说明 | 必须 |
---|---|---|---|
cid | String | 频道ID | 是 |
curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: XXXX" -H "Nonce: XXXX" -H "CurTime: xxxx" -H "CheckSum: XXXX" -d '{"cid": "XXX"}' https://vcloud.163.com/app/channel/pause
返回说明
http 响应:json
参数 | 类型 | 说明 |
---|---|---|
code | int | 错误码 |
msg | String | 错误信息 |
"Content-Type": "application/json; charset=utf-8" { "code" : XXX, "msg" : XXX }
code参考code状态表
批量暂停频道
接口说明
暂停一组用户正在直播的频道。
请求说明
POST https://vcloud.163.com/app/channellist/pause HTTP/1.1 Content-Type: application/json;charset=utf-8
参数说明
参数 | 类型 | 说明 | 必须 |
---|---|---|---|
cidList | JsonArray | 频道ID列表 | 是 |
curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: XXXX" -H "Nonce: XXXX" -H "CurTime: xxxx" -H "CheckSum: XXXX" -d '{"cidList": ["XXX", "XXX", "XXX", ...]}' https://vcloud.163.com/app/channellist/pause
返回说明
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, ... ] } }
code参考code状态表
恢复频道
接口说明
恢复用户被暂停的频道。
请求说明
POST https://vcloud.163.com/app/channel/resume HTTP/1.1 Content-Type: application/json;charset=utf-8
参数说明
参数 | 类型 | 说明 | 必须 |
---|---|---|---|
cid | String | 频道ID | 是 |
curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: XXXX" -H "Nonce: XXXX" -H "CurTime: xxxx" -H "CheckSum: XXXX" -d '{"cid": "XXX"}' https://vcloud.163.com/app/channel/resume
返回说明
http 响应:json
参数 | 类型 | 说明 |
---|---|---|
code | int | 错误码 |
msg | String | 错误信息 |
"Content-Type": "application/json; charset=utf-8" { "code" : XXX, "msg" : XXX }
code参考code状态表
批量恢复频道
接口说明
恢复一组用户正在直播的频道。
请求说明
POST https://vcloud.163.com/app/channellist/resume HTTP/1.1 Content-Type: application/json;charset=utf-8
参数说明
参数 | 类型 | 说明 | 必须 |
---|---|---|---|
cidList | JsonArray | 频道ID列表 | 是 |
curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: XXXX" -H "Nonce: XXXX" -H "CurTime: xxxx" -H "CheckSum: XXXX" -d '{"cidList": ["XXX", "XXX", "XXX", ...]}' https://vcloud.163.com/app/channellist/resume
返回说明
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, ... ] } }
code参考code状态表
获取录制视频文件列表
接口说明
获取某频道录制视频文件列表。
请求说明
POST https://vcloud.163.com/app/videolist HTTP/1.1 Content-Type: application/json;charset=utf-8
参数说明
参数 | 类型 | 说明 | 必须 |
---|---|---|---|
cid | String | 频道ID | 是 |
curl请求示例
curl -X POST -H "Content-Type: application/json" -H "AppKey: XXXX" -H "Nonce: XXXX" -H "CurTime: xxxx" -H "CheckSum: XXXX" -d '{"cid": "XXX"}' https://vcloud.163.com/app/videolist
返回说明
http 响应:json
参数 | 类型 | 说明 |
---|---|---|
code | int | 错误码 |
msg | String | 错误信息 |
videoList | JsonArray | 录制视频列表 |
video_name | String | 录制后文件名,格式为filename_YYYYMMDD-HHmmssYYYYMMDD-HHmmss, 录制起始时间(年月日时分秒) -录制结束时间(年月日时分秒) |
orig_video_key | String | 视频文件在点播桶中的存储路径 |
uid | Long | 用户ID |
vid | Long | 视频文件ID |
"Content-Type": "application/json; charset=utf-8" { "code" : XXX, "msg" : XXX, "ret" : { "videoList" : [ { "video_name" : XXX, "orig_video_key" : XXX, "uid" : XXX, "vid" : XXX }, { "video_name" : XXX, "orig_video_key" : XXX, "uid" : XXX, "vid" : XXX }, ... ] } }
code参考code状态表
code状态表
code | 详细描述 |
---|---|
200 | 操作成功 |
402 | 验证码错误 |
403 | 请求信息不完整 |
404 | 用户已存在 |
405 | 激活码不存在 |
406 | 用户未激活 |
407 | 用户不存在 |
408 | 密码错误 |
409 | 认证失败 |
410 | 用户已激活 |
411 | 邮箱不存在 |
501 | 内部错误 |
602 | 频道查询失败 |
603 | 频道删除失败 |
604 | 频道添加失败 |
605 | 频道更新失败 |
607 | AppKey不存在 |
609 | 频道ID为空 |
610 | 频道名称为空 |
612 | 频道类型错误 |
613 | CheckSum为空 |
614 | AppKey为空 |
615 | CurTime为空 |
617 | cid或uid错误 |
618 | uid不存在或该uid下无频道 |
629 | 频道暂停失败 |
630 | 频道恢复失败 |
631 | 请求体参数错误 |
直播推流 iOS SDK
网易视频云直播推流 iOS SDK是网易官方推出的 iOS 平台上用于推流的软件开发工具包,提供简单、便捷的开发接口,支持 iOS 7.0及以上版本的 iPad/iPhone/iPod 设备上实现直播推流功能。
开发指南
http://vcloud.163.com/vcloud-sdk-manual/LiveStreaming_Android/sdk/android_livestreaming.html
API文档
http://vcloud.163.com/vcloud-sdk-manual/LiveStreaming_Android/api/index.html
三、直播推流 Windows SDK
网易视频云直播推流 Windows SDK是网易官方推出的 Windows 平台上用于推流的软件开发工具包,提供简单、便捷的开发接口,支持 Windows 平台上音视频采集,编码,实现直播推流功能。
开发指南
http://vcloud.163.com/vcloud-sdk-manual/LiveStreaming_iOS/sdk/ios_livestreaming.html
API文档
http://vcloud.163.com/vcloud-sdk-manual/LiveStreaming_iOS/api/index.html
四、播放器 Android SDK
网易视频云播放器 Android SDK是网易官方推出的 Android 平台视频播放器软件开发工具包,提供简单、便捷的开发接口,支持 Android 2.3.3 及以上版本的移动设备上实现媒体播放功能。
开发指南
http://vcloud.163.com/vcloud-sdk-manual/LivePlayer_Android/sdk/android_liveplayer.html
API文档
http://vcloud.163.com/vcloud-sdk-manual/LivePlayer_Android/api/index.html
播放器 iOS SDK
网易视频云播放器 iOS SDK是网易官方推出的 iOS 平台视频播放器软件开发工具包,提供简单、便捷的开发接口,支持 iOS 7.0及以上版本的 iPad/iPhone/iPod 设备上实现媒体播放功能。
开发指南
http://vcloud.163.com/vcloud-sdk-manual/LivePlayer_iOS/sdk/ios_liveplayer.html
API文档
http://vcloud.163.com/vcloud-sdk-manual/LivePlayer_iOS/api/index.html
由于文档过多,本帖主要分享直播开发教程,网易视频云提供一对一技术支持,感兴趣的同学,2479775187qq交流