AUI Kits互动直播AppServer提供了登录服务和直播间管理服务等后台服务,通过与AUI Kits互动直播场景SDK搭配使用可以快速实现互动直播应用,助力业务创新快速上线。
AppServer的作用
集成方基于AUI Kits框架快速搭建诸如互动直播、电商直播等服务时,场景SDK需要对接视频直播(用于普通直播及连麦场景)、点播(用于直播录屏,可选)及IM服务(用于互动消息)等产品的能力。AppServer将这上述3个产品的能力进行封装,提供一套标准化的HTTP接口供场景SDK使用,降低了集成方的开发成本。
AppServer属于客户自行部署、维护的范畴。
AppServer除了封装上面几个产品的能力外,还实现了直播间管理服务,包括创建/修改/删除直播间、开始/结束直播等常见功能。
AppServer不直接依赖视频直播提供的接口,而是按照视频直播推拉流协议拼接地址实现推拉流地址获取。同时,AppServer也实现了监听视频直播的推流状态回调,以解决主播端异常退出而直播间状态不对的问题。
IM服务区分新旧IM两个系统,新IM服务提供更为强大且稳定的IM服务能力,旧IM后面会逐渐下线,使用新的IM替换。对于新客户来说,建议直接对接新IM服务,而对于已经接入旧IM的客户,后期也会提供迁移方案协助客户迁移至新的IM服务上。
AppServer的实现
AppServer通过DB表来管理直播间,表设计如下所示:
CREATE TABLE `room_infos` (
`id` varchar(256) NOT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`title` varchar(256) DEFAULT NULL,
`anchor` varchar(256) DEFAULT NULL,
`extends` mediumtext,
`status` bigint DEFAULT NULL,
`mode` bigint DEFAULT NULL,
`chat_id` varchar(256) DEFAULT NULL,
`pk_id` varchar(256) DEFAULT NULL,
`notice` varchar(256) DEFAULT NULL,
`meeting_id` varchar(256) DEFAULT NULL,
`cover_url` varchar(256) DEFAULT NULL,
`anchor_id` varchar(256) DEFAULT NULL,
`anchor_nick` varchar(256) DEFAULT NULL,
`vod_id` varchar(256) DEFAULT NULL,
`meeting_info` mediumtext,
`started_at` datetime DEFAULT NULL,
`stopped_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_create_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
注意事项
跨域问题:该服务有可能给到Web端使用,因此需要设置好cors。
相关文档
AppServer接口文档
接口概览
API | 是否鉴权 | 是否必须 | 描述 | ||||
/api/v1/live/login | 否 | 否 | 登录 登录成功会返回token标识,只有带有该标识才能访问授权的接口 | ||||
/api/v1/live/token | 是 | 是 | 获取IM建连的token | ||||
/api/v1/live/create | 是 | 是 | 创建直播间 | ||||
/api/v1/live/list | 是 | 是 | 分页获取直播间列表 | ||||
/api/v1/live/get | 是 | 是 | 获取单个直播间 | ||||
/api/v1/live/start | 是 | 是 | 开始直播 | ||||
/api/v1/live/stop | 是 | 是 | 结束直播 | ||||
/api/v1/live/update | 是 | 否 | 更新直播间公告等信息 | ||||
/api/v1/live/getMeetingInfo | 是 | 否 仅连麦场景使用 | 获取连麦信息 | ||||
/api/v1/live/updateMeetingInfo | 是 | 否 仅连麦场景使用 | 更新连麦信息 | ||||
/api/v2/live/token | 是 | 是 | V2版本,用于获取IM建连的token。用于新旧IM兼容 | ||||
/api/v2/live/create | 是 | 是 | V2版本,用于创建直播间。用于新旧IM兼容 |
鉴权方式
Demo中的鉴权实现供参考,客户可自行调整鉴权策略
需要先调用/login接口获取鉴权的token,将token放到请求头中,然后再调用其它接口。
详细接口定义
登录
该接口客户可按自身业务需求实现,包括token的生成算法也是可以自定义,不过要确保生成及检验token使用相同的算法。
使用说明
请求协议:http/https
请求Path:/login
是否需要授权:否
请求Method:POST
请求ContentType:application/json
请求参数
名称 | 类型 | 是否必填 | 示例值 | 描述 | |||
username | String | 是 | usernamexxx | 用户名 | |||
password | String | 是 | passwordxxxx | 密码 |
返回数据
名称 | 类型 | 示例值 | 描述 | ||||
code | Integer | 200 | 业务响应码。参考HTTP响应码 | ||||
expire | String | 2023-02-28T14:38:06+08:00 | 过期时间。使用UTC时间格式 | ||||
token | String | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9*** | 授权凭证。默认使用jwt生成 |
示例
请求示例
{
"username":"usernamexxx",
"password":"passwordxxxx"
}
正常返回示例
{
"code": 200,
"expire": "2023-02-28T14:38:06+08:00",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2Nzc1NjYyODYsImlkIjoieXl5eSIsIm9yaWdfaWF0IjoxNjc3NDc5ODg2fQ.xxxxxx"
}
获取IM建连的token
实质调用的是IM Server的GetMessageToken接口,可参考接口实现:获取长连接建连Token
使用说明
请求协议:http/https
请求Path:/api/v1/live/token
是否需要授权:是
请求Method:POST
请求ContentType:JSON
请求参数
名称 | 类型 | 是否必填 | 示例值 | 描述 | |||
user_id | String | 是 | useridxxxx | 用户UserId,用户自定义,在AppId下单独唯一 | |||
device_id | String | 是 | deviceidxxx | 终端设备ID,唯一代表一个用户终端设备,用户自定义 | |||
device_type | String | 是 | 终端设备类型,取值:
|
返回数据
名称 | 类型 | 示例值 | 描述 | ||||
code | Integer | 200 | 业务响应码。参考HTTP响应码 | ||||
access_token | String | oauth_cloud_key:***-b0YY5Gy6Q | 用于长连接建连的Token | ||||
refresh_token | String | oauth_cloud_key:***-b0YY5Gy6Q | 更新Token,若AccessToken过期,则可以使用RefreshToken再次获取新Token |
示例
请求示例
{
"user_id": "useridxxxx",
"device_id": "deviceidxxxxx",
"device_type":"android"
}
正常返回示例
{
"code": 200,
"access_token": "yJlbmRwb2ludHMiOlsid3NzOi8vbWV0YXBhdGguYWxpeXVuY3MuY29tL3dzIl0sImFwcElkIjoiVFkzSTJZWDAiLCJ0b2tlbiI6Im1wLmV5SjBlWEFpT2lKS1YxUWlMQ0poYkdjaU9pSklVekkxTmlKOxxxxxxx",
"refresh_token": "yJlbmRwb2ludHMiOlsid3NzOi8vbWV0YXBhdGguYWxpeXVuY3MuY29tL3dzIl0sImFwcElkIjoiVFkzSTJZWDAiLCJ0b2tlbiI6Im1wLmV5SjBlWEFpT2lKS1YxUWlMQ0poYkdjaU9pSklVekkxTmlKOxxxxxxx"
}
创建直播间
实现原理
创建群信息(消息组):创建消息组
视频直播地址生成规则:生成推流地址和播放地址
连麦直播地址生成规则:直播连麦地址规则
使用说明
请求协议:http/https
请求Path:/api/v1/live/create
是否需要授权:是
请求Method:POST
请求ContentType:JSON
请求参数
名称 | 类型 | 是否必填 | 示例值 | 描述 | |||
title | String | 是 | titlexxxx | 直播标题 | |||
notice | String | 否 | noticexxx | 直播公告 | |||
anchor | String | 是 | anchorxxxx | 主播userId | |||
anchor_nick | String | 否 | anchornickxxxx | 主播昵称 | |||
mode | Integer | 否 | 0 | 直播模式,默认为0
| |||
extends | String | 否 | {"xx":"xxx"} | 扩展字段,SON格式字符串 |
返回数据
名称 | 类型 | 示例值 | 描述 | ||||
code | Integer | 200 | 业务响应码。参考HTTP响应码 | ||||
id | String | ee487235-5f9b-4cb3-82ce-45c91c3xxxx | 直播间Id | ||||
created_at | String | 2023-02-27T17:34:00.592750182+08:00 | 创建时间 | ||||
updated_at | String | 2023-02-27T17:34:00.592750182+08:00 | 修改时间 | ||||
title | String | titlexxx | 直播标题 | ||||
notice | String | noticexxx | 直播公告 | ||||
cover_url | String | 封面图。预留字段 | |||||
anchor_id | String | anchor_idxxx | 主播userId | ||||
anchor_nick | String | anchor_nickxxx | 主播昵称 | ||||
extends | String | {"xx":"xxx"} | 扩展字段 | ||||
status | Integer | 0 | 直播间状态: 0:准备中 1:已开播 2:已停止 | ||||
mode | Integer | 0 | 直播模式
| ||||
chat_id | String | ee487235-5f9b-4cb3-82ce-45c91c3xxxx | IM群Id | ||||
meeting_id | String | 0a7656c4-c01b-424d-9882-xxxxxx | 连麦Id | ||||
meeting_info | String | {"members":[{"user_id":"xxx","user_nick":"xxx","user_avatar":"http://xxx"}]} | Json字符串。连麦观众信息 | ||||
push_url_info | JSON | 推流地址集合 | |||||
push_url_info.rtmp_url | String | rtmp://pushxxxx | rtmp推流 | ||||
push_url_info.rts_url | String | artc://pushxxxx | rts推流 | ||||
push_url_info.srt_url | String | srt://pushxxxx | srt推流 | ||||
pull_url_info | JSON | 拉流地址集合 | |||||
pull_url_info.rtmp_url | String | rtmp://pullxxxx | rtmp拉流 | ||||
pull_url_info.rts_url | String | artc://pullxxxx | rts拉流 | ||||
pull_url_info.hls_url | String | http://pullxxxx.m3u8?xxxx | hls拉流 | ||||
pull_url_info.flv_url | String | http://pullxxxx.flv?xxxx | flv拉流 | ||||
link_info | JSON | 连麦地址集合 | |||||
link_info.rtc_push_url | String | artc://live.aliyun.com/push/xxxx | rtc推流地址 | ||||
link_info.rtc_pull_url | String | artc://live.aliyun.com/play/xxxx | rtc拉流地址 | ||||
link_info.cdn_pull_info | JSON | 普通观众的拉流地址集合 | |||||
link_info.cdn_pull_info.rtmp_url | String | rtmp://pullxxxx | rtmp拉流 | ||||
link_info.cdn_pull_info.rts_url | String | artc://pullxxxx | rts拉流 | ||||
link_info.cdn_pull_info.hls_url | String | http://pullxxxx.m3u8?xxxx | hls拉流 | ||||
link_info.cdn_pull_info.flv_url | String | http://pullxxxx.flv?xxxx | flv拉流 |
示例
请求示例
{
"title": "titlexxx",
"notice": "noticexxx",
"anchor":"主播userId",
"anchor_nick":"主播nick",
"mode":0,
"extends":"{\"xx\":\"xxx\"}"
}
正常返回示例
{
"id": "ee487235-5f9b-4cb3-82ce-45c91c365d06",
"created_at": "2023-02-27T17:34:00.592750182+08:00",
"updated_at": "2023-02-27T17:34:00.592750314+08:00",
"title": "直播标题",
"notice": "23232",
"anchor_id": "主播userId",
"anchor_nick": "",
"extends": "{\"xx\":\"xxx\"}",
"status": 0,
"mode": 0,
"chat_id": "ee487235-5f9b-4cb3-82ce-45c91c365d06",
"meeting_id": "0a7656c4-c01b-424d-9882-a8bf44bd3a4b",
"meeting_info": "",
"push_url_info": {
"rtmp_url": "rtmp://push.h5video.vip/live/ee487235-5f9b-4cb3-82ce-45c91c365d06?auth_key=167809x",
"rts_url": "artc://push.h5video.vip/live/ee487235-5f9b-4cb3-82ce-45c91c365d06?auth_key=1678095xc",
"srt_url": "srt://push.h5video.vip/live/ee487235-5f9b-4cb3-82ce-45c91c365d06?auth_key=167809524x"
},
"pull_url_info": {
"rtmp_url": "rtmp://pull.h5video.vip/live/ee487235-5f9b-4cb3-82ce-45c91c365d06?auth_key=167809524x",
"rts_url": "artc://pull.h5video.vip/live/ee487235-5f9b-4cb3-82ce-45c91c365d06?auth_key=167809524x",
"flv_url": "http://pull.h5video.vip/live/ee487235-5f9b-4cb3-82ce-45c91c365d06.flv?auth_key=167809524x",
"hls_url": "http://pull.h5video.vip/live/ee487235-5f9b-4cb3-82ce-45c91c365d06.m3u8?auth_key=167809524x"
},
"link_info": {
"rtc_push_url": "artc://live.aliyun.com/push/0a7656c4-c01b-424d-9882-a8bf44bd3a4b?sdkAppId=7c61616e-480b-4de6-b3fc-95cef48f5b53&userId=主播userId×tamp=1677576840&token=95e014264c0b937b449e9a5f3f854c32fd4x",
"rtc_pull_url": "artc://live.aliyun.com/play/0a7656c4-c01b-424d-9882-a8bf44bd3a4b?sdkAppId=7c61616e-480b-4de6-b3fc-95cef48f5b53&userId=主播userId×tamp=1677576840&token=95e014264c0b937b449ex",
"cdn_pull_info": {
"rtmp_url": "rtmp://pull.h5video.vip/live/7c61616e-480b-4de6-b3fc-95cef48f5b53_0a7656c4-c01b-424d-9882-a8bf44bd3a4b_主播userId_camera?auth_key=167757684x",
"rts_url": "artc://pull.h5video.vip/live/7c61616e-480b-4de6-b3fc-95cef48f5b53_0a7656c4-c01b-424d-9882-a8bf44bd3a4b_主播userId_camera?auth_key=16775768x",
"flv_url": "http://pull.h5video.vip/live/7c61616e-480b-4de6-b3fc-95cef48f5b53_0a7656c4-c01b-424d-9882-a8bf44bd3a4b_主播userId_camera.flv?auth_key=167757684x",
"hls_url": "http://pull.h5video.vip/live/7c61616e-480b-4de6-b3fc-95cef48f5b53_0a7656c4-c01b-424d-9882-a8bf44bd3a4b_主播userId_camera.m3u8?auth_key=167757684x"
}
}
}
分页获取直播间列表
实现原理
GetGroupStatistics:获取群统计信息,该接口暂未对外开放文档,后续补充
ListMessageGroupUserById:通过用户ID查询用户信息
SearchMedia:SearchMedia - 搜索媒体信息
GetPlayInfo:GetPlayInfo - 获取音视频播放地址
只有请求的userId是群主才会返回推流地址
使用说明
请求协议:http/https
请求Path:/api/v1/live/list
是否需要授权:是
请求Method:POST
请求ContentType:JSON
请求参数
名称 | 类型 | 是否必填 | 示例值 | 描述 | |||
user_id | String | 是 | useridxxx | 用户UserId | |||
page_num | Integer | 是 | 1 | 页码,默认值:1 | |||
page_size | Integer | 是 | 10 | 单页显示数量,默认值:10。 | |||
im_server | JSON数组 | 是 | ["aliyun_old","aliyun_new"] | 配置使用哪些IM服务。可多选。不传默认为aliyun_old
|
返回数据
名称 | 类型 | 示例值 | 描述 | ||||
code | Integer | 200 | 业务响应码。参考HTTP响应码 | ||||
id | String | ee487235-5f9b-4cb3-82ce-45c91c3xxxx | 直播间Id | ||||
created_at | String | 2023-02-27T17:34:00.592750182+08:00 | 创建时间 | ||||
updated_at | String | 2023-02-27T17:34:00.592750182+08:00 | 修改时间 | ||||
started_at | String | 2023-02-27T18:54:37+08:00 | 直播的开始时间 | ||||
stopped_at | String | 2023-02-27T19:25:37+08:00 | 直播的结束时间 | ||||
title | String | titlexxx | 直播标题 | ||||
notice | String | noticexxx | 直播公告 | ||||
cover_url | String | 封面图。预留字段 | |||||
anchor_id | String | anchor_idxxx | 主播userId | ||||
anchor_nick | String | anchor_nickxxx | 主播昵称 | ||||
extends | String | {"xx":"xxx"} | 扩展字段 | ||||
status | Integer | 0 | 直播间状态: 0:准备中 1:已开播 2:已停止 | ||||
mode | Integer | 0 | 直播模式
| ||||
chat_id | String | ee487235-5f9b-4cb3-82ce-45c91c3xxxx | IM群Id | ||||
meeting_id | String | 0a7656c4-c01b-424d-9882-xxxxxx | 连麦Id | ||||
meeting_info | String | {"members":[{"user_id":"xxx","user_nick":"xxx","user_avatar":"http://xxx"}]} | Json字符串。连麦观众信息 | ||||
metrics | JSON | 统计数据 | |||||
metrics.online_count | Long | 20 | 在线人数 | ||||
metrics.like_count | Long | 0 | 点赞人数 | ||||
metrics.pv | Long | 30 | IM群PV | ||||
metrics.uv | Long | 20 | IM群UV | ||||
vod_info | JSON | 直播录制视频信息 | |||||
vod_info.status | Integer | 1 | 录制视频的状态
| ||||
vod_info.playlist | Array | 录制的视频信息。对象信息见: | |||||
vod_info.playlist[].bit_rate | String | 858.198 | 媒体流码率 | ||||
vod_info.playlist[].creation_time | String | 2017-06-26T06:38:48Z | 音/视频创建时间。格式为:yyyy-MM-ddTHH:mm:ssZ(UTC时间) | ||||
vod_info.playlist[].definition | String | OD | 视频流清晰度定义
| ||||
vod_info.playlist[].duration | String | 67.685 | 媒体流长度。单位:秒。 | ||||
vod_info.playlist[].format | String | m3u8 | 媒体流格式
| ||||
vod_info.playlist[].fps | String | 90000.0 | 媒体流帧率 | ||||
vod_info.playlist[].height | Long | 720 | 媒体流高度。单位:px。 | ||||
vod_info.playlist[].width | Long | 1280 | 媒体流宽度。单位:px。 | ||||
vod_info.playlist[].play_url | String | https://vod.h5vxxx/Record/VOD_NO_TRANSCODE/live/b92ed0ce-e29f-4df3-984a-dbxxxx.m3u8 | 视频流的播放地址。 | ||||
vod_info.playlist[].size | Long | 3034884 | 媒体流大小。单位:Byte。 | ||||
vod_info.playlist[].status | String | Normal | 媒体流状态,取值:
| ||||
vod_info.playlist[].stream_type | String | 媒体流类型。若媒体流为视频则取值:video,若是纯音频则取值:audio。 | |||||
user_status | JSON | 用户的禁言状态 | |||||
user_status.mute | Boolean | false | 用户是否被禁言。取值:
| ||||
user_status.mute_source | String | 待定。暂时没有返回 | |||||
link_info | JSON | 连麦地址集合 | |||||
link_info.rtc_push_url | String | artc://live.aliyun.com/push/xxxx | rtc推流地址 | ||||
link_info.rtc_pull_url | String | artc://live.aliyun.com/play/xxxx | rtc拉流地址 | ||||
link_info.cdn_pull_info | JSON | 普通观众的拉流地址集合 | |||||
link_info.cdn_pull_info.rtmp_url | String | rtmp://pullxxxx | rtmp拉流 | ||||
link_info.cdn_pull_info.rts_url | String | artc://pullxxxx | rts拉流 | ||||
link_info.cdn_pull_info.hls_url | String | http://pullxxxx.m3u8?xxxx | hls拉流 | ||||
link_info.cdn_pull_info.flv_url | String | http://pullxxxx.flv?xxxx | flv拉流 |
示例
请求示例
{
"page_size": 10,
"page_num":1,
"user_id": "useridxxxx"
"im_server":["aliyun_old","aliyun_new"]
}
正常返回示例
[
{
"id": "c8d619e2-e7ec-445d-b8a1-e1ebf967d6c3",
"created_at": "2023-02-27T20:45:28+08:00",
"updated_at": "2023-02-27T20:45:28+08:00",
"started_at": "2023-02-27T20:52:01+08:00",
"stopped_at": "0001-01-01T00:00:00Z",
"title": "直播标题",
"notice": "直播公告",
"cover_url": "",
"anchor_id": "AUILivePusher",
"anchor_nick": "",
"extends": "",
"status": 1,
"mode": 0,
"chat_id": "c8d619e2-e7ec-445d-b8a1-e1ebf967d6c3",
"meeting_id": "",
"vod_id": "",
"meeting_info": "",
"metrics": {
"online_count": 2,
"like_count": 0,
"pv": 12,
"uv": 2
},
"vod_info": {
"status": 1,
"playlist": [
{
"bit_rate": "858.198",
"creation_time": "2023-02-27T11:28:39Z",
"definition": "OD",
"duration": "67.685",
"format": "m3u8",
"fps": "90000.0",
"height": 720,
"width": 1280,
"play_url": "https://vod.h5video.vip/liveRecord/VOD_NO_TRANSCODE/live/b92ed0ce-e29f-4df3-984a-dbdb314d7e4e/2023-02-27-19-24-38_2023-02-27-19-25-36.m3u8",
"size": 3034884,
"status": "Normal",
"stream_type": "video"
}
]
},
"user_status": {
"mute": false,
"mute_source": null
},
"pull_url_info": {
"rtmp_url": "rtmp://pull.h5video.vip/live/c8d619e2-e7ec-445d-b8a1-e1ebf967d6c3?auth_key=167810730x",
"rts_url": "artc://pull.h5video.vip/live/c8d619e2-e7ec-445d-b8a1-e1ebf967d6c3?auth_key=167810730x",
"flv_url": "http://pull.h5video.vip/live/c8d619e2-e7ec-445d-b8a1-e1ebf967d6c3.flv?auth_key=167810730x",
"hls_url": "http://pull.h5video.vip/live/c8d619e2-e7ec-445d-b8a1-e1ebf967d6c3.m3u8?auth_key=167810730x"
}
}
]
获取单个直播间
实现原理:参考/api/v1/live/list实现
使用说明
请求协议:http/https
请求Path:/api/v1/live/get
是否需要授权:是
请求Method:POST
请求ContentType:JSON
请求参数
名称 | 类型 | 是否必填 | 示例值 | 描述 | |||
id | String | 是 | liveIdxxxx | 直播间ID | |||
user_id | String | 是 | useridxxx | UserId | |||
im_server | JSON数组 | 是 | ["aliyun_old","aliyun_new"] | 配置使用哪些IM服务。可多选。不传默认为aliyun_old
|
返回数据
参考/api/v1/live/list。只是将列表换为单个对象
示例
请求示例
{
"id": "675e6783-0bac-4990-b6da-5aa890535029",
"user_id": "Cedric8"
"im_server":["aliyun_old","aliyun_new"]
}
正常返回示例
{
"id": "675e6783-0bac-4990-b6da-5aa890535029",
"created_at": "2023-02-14T14:34:14+08:00",
"updated_at": "2023-02-14T14:34:19+08:00",
"started_at": "2023-02-14T14:34:19+08:00",
"stopped_at": "2023-02-14T14:34:26+08:00",
"title": "该喝喝",
"notice": "fgg",
"cover_url": "",
"anchor_id": "Cedric8",
"anchor_nick": "",
"extends": "{\"userNick\":\"Cedric8\",\"userAvatar\":\"https:\/\/img.alicdn.com\/imgextra\/i1\/O1CN01chynzk1uKkiHiQIvE_!!6000000006019-2-tps-80-80.png\"}",
"status": 2,
"mode": 1,
"chat_id": "675e6783-0bac-4990-b6da-5aa890535029",
"meeting_id": "66584c06-347f-47c6-8a18-fa2860c563ba",
"vod_id": "",
"meeting_info":"{\"members\":[{\"user_id\":\"Cedric8\",\"user_nick\":\"Cedric8\",\"user_avatar\":\"\",\"camera_opened\":true,\"mic_opened\":true,\"rtc_pull_url\":\"artc://live.aliyun.com/play/66584c06-347f-47c6-8a18-fa2860c563ba?sdkAppId=7c61616e-480b-4de6-b3fc-95cef48f5b53\&userId=Cedric8\×tamp=1676442853\&token=079116a1c721ac219814d513190be48fcb324800b0b482467ddd04a178e9bf2c\"}]}",
"metrics": {
"online_count": 0,
"like_count": 0,
"pv": 18,
"uv": 6
},
"vod_info": {
"status": 0
},
"user_status": {
"mute": false,
"mute_source": []
},
"push_url_info": {
"rtmp_url": "rtmp://push.h5video.vip/live/675e6783-0bac-4990-b6da-5aa890535029?auth_key=1678109226-0-0-fed270f2c9d79d3216ba7cfb842b811c",
"rts_url": "artc://push.h5video.vip/live/675e6783-0bac-4990-b6da-5aa890535029?auth_key=1678109226-0-0-fed270f2c9d79d3216ba7cfb842b811c",
"srt_url": "srt://push.h5video.vip/live/675e6783-0bac-4990-b6da-5aa890535029?auth_key=1678109226-0-0-fed270f2c9d79d3216ba7cfb842b811c"
},
"pull_url_info": {
"rtmp_url": "rtmp://pull.h5video.vip/live/675e6783-0bac-4990-b6da-5aa890535029?auth_key=1678109226-0-0-f935f515baa272bb83c5bcc44597a3fa",
"rts_url": "artc://pull.h5video.vip/live/675e6783-0bac-4990-b6da-5aa890535029?auth_key=1678109226-0-0-f935f515baa272bb83c5bcc44597a3fa",
"flv_url": "http://pull.h5video.vip/live/675e6783-0bac-4990-b6da-5aa890535029.flv?auth_key=1678109226-0-0-059cf974a2dc12919f92b3be70a99fef",
"hls_url": "http://pull.h5video.vip/live/675e6783-0bac-4990-b6da-5aa890535029.m3u8?auth_key=1678109226-0-0-b31e749bbead2fa86d061c3767e31401",
},
"link_info": {
"rtc_push_url": "artc://live.aliyun.com/push/66584c06-347f-47c6-8a18-fa2860c563ba?sdkAppId=7c61616e-480b-4de6-b3fc-95cef48f5b53&userId=Cedric8×tamp=1677590826&token=3833146f33fa914e3b4c25373d780f54fb3a81371fec0884ee062f25d9522566",
"rtc_pull_url": "artc://live.aliyun.com/play/66584c06-347f-47c6-8a18-fa2860c563ba?sdkAppId=7c61616e-480b-4de6-b3fc-95cef48f5b53&userId=Cedric8×tamp=1677590826&token=3833146f33fa914e3b4c25373d780f54fb3a81371fec0884ee062f25d9522566",
"cdn_pull_info": {
"rtmp_url": "rtmp://pull.h5video.vip/live/7c61616e-480b-4de6-b3fc-95cef48f5b53_66584c06-347f-47c6-8a18-fa2860c563ba_Cedric8_camera?auth_key=1677590826-0-0-22af27f1cc1c9ea2362d6bb8d49dd077",
"rts_url": "artc://pull.h5video.vip/live/7c61616e-480b-4de6-b3fc-95cef48f5b53_66584c06-347f-47c6-8a18-fa2860c563ba_Cedric8_camera?auth_key=1677590826-0-0-22af27f1cc1c9ea2362d6bb8d49dd077",
"flv_url": "http://pull.h5video.vip/live/7c61616e-480b-4de6-b3fc-95cef48f5b53_66584c06-347f-47c6-8a18-fa2860c563ba_Cedric8_camera.flv?auth_key=1677590826-0-0-384a33ab3857a556d576af0f5d7563e5",
"hls_url": "http://pull.h5video.vip/live/7c61616e-480b-4de6-b3fc-95cef48f5b53_66584c06-347f-47c6-8a18-fa2860c563ba_Cedric8_camera.m3u8?auth_key=1677590826-0-0-3ab7aeede3dcd589252c2282428f1a22"
}
}
}
开始直播
实现原理:修改DB的直播间状态status字段值。注意缓存一致性
使用说明
请求协议:http/https
请求Path:/api/v1/live/start
是否需要授权:是
请求Method:POST
请求ContentType:JSON
请求参数
名称 | 类型 | 是否必填 | 示例值 | 描述 | |||
user_id | String | 是 | useridxxxx | 用户UserId,用户自定义,在AppId下单独唯一 | |||
id | String | 是 | liveIdxxxx | 直播间Id |
返回数据
参考/api/v1/live/get获取单个直播间的响应参数
示例
请求示例
{
"id": "675e6783-0bac-4990-b6da-5aa890535029",
"user_id": "useridxxxx"
}
正常返回示例
参考/api/v1/live/get获取单个直播间的响应参数示例
结束直播
实现原理:修改DB的直播间状态status字段值。注意缓存一致性!
使用说明
请求协议:http/https
请求Path:/api/v1/live/stop
是否需要授权:是
请求Method:POST
请求ContentType:JSON
请求参数
名称 | 类型 | 是否必填 | 示例值 | 描述 | |||
user_id | String | 是 | useridxxxx | 用户UserId,用户自定义,在AppId下单独唯一 | |||
id | String | 是 | liveIdxxxx | 直播间Id |
返回数据
参考/api/v1/live/get获取单个直播间的响应参数
示例
请求示例
{
"id": "675e6783-0bac-4990-b6da-5aa890535029",
"user_id": "useridxxxx"
}
正常返回示例
参考/api/v1/live/get获取单个直播间的响应参数示例
更新直播间公告等信息
实现原理:修改DB的直播间信息。
使用说明
请求协议:http/https
请求Path:/api/v1/live/update
是否需要授权:是
请求Method:POST
请求ContentType:JSON
请求参数
名称 | 类型 | 是否必填 | 示例值 | 描述 | |||
user_id | String | 是 | useridxxxx | 用户UserId,用户自定义,在AppId下单独唯一 | |||
id | String | 是 | liveIdxxxx | 直播间Id | |||
title | String | 否 | titlexxx | 直播标题 |
返回数据
参考/api/v1/live/get获取单个直播间的响应参数
示例
请求示例
{
"id": "675e6783-0bac-4990-b6da-5aa890535029",
"user_id": "useridxxx"
"title": "测试更新标题",
"notice":"测试更新直播公告",
"extends":"{}"
}
正常返回示例
参考/api/v1/live/get获取单个直播间的响应参数示例
获取连麦信息
使用说明
请求协议:http/https
请求Path:/api/v1/live/getMeetingInfo
是否需要授权:是
请求Method:POST
请求ContentType:JSON
请求参数
名称 | 类型 | 是否必填 | 示例值 | 描述 | |||
id | String | 是 | liveIdxxxx | 直播间Id |
返回数据
参考/api/v1/live/get获取单个直播间的响应参数
示例
请求示例
{
"id": "675e6783-0bac-4990-b6da-5aa890535029"
}
正常返回示例
参考/api/v1/live/get获取单个直播间的响应参数示例
更新连麦信息
修改在线连麦信息。一般由主播端触发。
使用说明
请求协议:http/https
请求Path:/api/v1/live/updateMeetingInfo
是否需要授权:是
请求Method:POST
请求ContentType:JSON
请求参数
名称 | 类型 | 是否必填 | 示例值 | 描述 | |||
id | String | 是 | liveIdxxxx | 直播间Id | |||
members | Array | 是 | 连麦成员 | ||||
members[].user_id | String | 是 | useridxxx | 用户Id | |||
members[].user_nick | String | 是 | usernickxxx | 用户昵称 | |||
members[].user_avatar | String | 是 | http://xxx.jpg | 用户头像 | |||
members[].camera_opened | Boolean | 是 | true | 摄像头状态 | |||
members[].mic_opened | Boolean | 是 | true | 麦克风状态 | |||
members[].rtc_pull_url | String | 是 | 连麦拉流地址 |
返回数据
参考/api/v1/live/get获取单个直播间的响应参数
示例
请求示例
{
"id": "675e6783-0bac-4990-b6da-5aa890535029",
"members": [
{
"user_id": "user_idxxx",
"user_nick": "user_idxxx",
"user_avatar": "user_idxxx",
"camera_opened": true,
"mic_opened": true,
"rtc_pull_url": "artc://live.alixxx"
}
]
}
正常返回示例
参考/api/v1/live/get获取单个直播间的响应参数示例
生成《开播小助手》唤端链接
配合桌面主播客户端《开播小助手》使用,通过该链接主播得以进入直播间开播。
使用说明
接口地址:/api/v1/live/getLiveJumpUrl
请求方式:Post
是否需要授权:是
Content-Type:application/json; charset=utf-8
请求参数
名称 | 类型 | 是否必填 | 示例值 | 描述 | |||
user_name | String | 否 | test*** | 昵称 | |||
user_id | String | 是 | a494caec-***-695ef345db77 | 用户id | |||
live_id | String | 是 | de1**a0,hu**9 | 直播id |
返回数据
名称 | 类型 | 示例值 | 描述 | ||||
code | int | 200 | 业务code,参考http code含义 | ||||
liveJumpUrl | String | auipusher://page/live-room?app_server=http%3A%2F%2Flive-example.live.1569899459811379.cn-hangzhou.fc.devsapp.net&token=fdasdasafdfadasd&user_id=131312414&user_name=%E7%BE%8E%E5%A5%B3%E4%B8%BB%E6%92%AD&live_id=e3141312312321 | 返回直播跳转链接。参数包括如下:
|
验签
使用说明
接口地址:/api/v1/live/verifyAuthToken
请求方式:Post
Content-Type:application/json; charset=utf-8
请求参数
名称 | 类型 | 是否必填 | 示例值 | 描述 | |||
user_name | String | 否 | BatchGetOnlineUsers | 昵称。utf-8编码 | |||
user_id | String | 是 | a494caec-***-695ef345db77 | 用户id | |||
live_id | String | 是 | de1**a0 | 直播id | |||
app_server | String | 是 | http://xxx | 服务地址 | |||
token | String | 是 | 7da3c10e-ce85-498a-a0ca-03d6e2297955 | 验签参数 |
返回数据
名称 | 类型 | 示例值 | 描述 | ||||
code | int | 200 | 业务code,参考http code含义 | ||||
loginToken | String | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxxxxxxxxxx.jIsjbRRO1B0xV2iVkshcrykz2Lj-6WcloZ9o0HkT3O0 | 登录的token,用于调用服务地址serverUrl |
获取IM建连的token
使用说明
请求协议:http/https
请求Path:/api/v2/live/token
是否需要授权:是
请求Method:POST
请求ContentType:JSON
请求参数
名称 | 类型 | 是否必填 | 示例值 | 描述 | |||
user_id | String | 是 | useridxxxx | 用户UserId,用户自定义,在AppId下单独唯一 | |||
device_id | String | 是 | deviceidxxx | 终端设备ID,唯一代表一个用户终端设备,用户自定义 说明 仅针对aliyun_old服务起作用。 | |||
device_type | String | 是 | android | 终端设备类型,取值:
说明 仅针对aliyun_old服务起作用。 | |||
im_server | Json数组 | 是 | ["aliyun_old","aliyun_new"] | 配置使用哪些IM服务。可多选
| |||
role | String | 否 | admin | 角色,默认为空。为admin时,表示该用户可以调用管控接口 说明 仅针对aliyun_old服务起作用。 |
返回数据
名称 | 类型 | 示例值 | 描述 | ||||
code | Integer | 200 | 业务响应码。参考HTTP响应码 | ||||
aliyun_old_im | access_token | String | yJlbmRwb2ludHMiOlsid3NzOi8vbWV0YXBhdGguYWxpeXVuY3MuY29tL3dzIl0sImFwcElkIjoiVFkzSTJZWDAiLCJ0b2tlbiI6Im1wLmV5SjBlWEFpT2lKS1YxUWlMQ0poYkdjaU9pSklVekkxTmlKO******* | 旧IM的token | |||
refresh_token | String | yJlbmRwb2ludHMiOlsid3NzOi8vbWV0YXBhdGguYWxpeXVuY3MuY29tL3dzIl0sImFwcElkIjoiVFkzSTJZWDAiLCJ0b2tlbiI6Im1wLmV5SjBlWEFpT2lKS1YxUWlMQ0poYkdjaU9pSklVekkxTmlKO******* | 旧IM的refreshtoken | ||||
aliyun_new_im | app_id | String | exampleapp | 用户的AppID | |||
app_sign | String | examplesign | 服务器生成的加密串,包含接入域名等信息 | ||||
app_token | String | exampletoken | 登录鉴权 | ||||
auth.user_id | String | 123 | 要登录的用户的ID | ||||
auth.nonce | String | exampleAK | 格式:"随机串-AK", 最长64字节 | ||||
auth.timestamp | Long | 1677576840 | 过期时间, 从1970到过期时间的秒数 | ||||
auth.role | String | admin | 角色,为admin时,表示该用户可以调用管控接口 |
示例
请求示例
{
"user_id": "useridxxxx",
"device_id": "deviceidxxxxx",
"device_type":"android",
"im_server":["aliyun_old","aliyun_new"]
"role":"admin"
}
正常返回示例
{
"code": 200,
"aliyun_old_im":{
"access_token": "yJlbmRwb2ludHMiOlsid3NzOi8vbWV0YXBhdGguYWxpeXVuY3MuY29tL3dzIl0sImFwcElkIjoiVFkzSTJZWDAiLCJ0b2tlbiI6Im1wLmV5SjBlWEFpT2lKS1YxUWlMQ0poYkdjaU9pSklVekkxTmlKOxxxxxxx",
"refresh_token": "yJlbmRwb2ludHMiOlsid3NzOi8vbWV0YXBhdGguYWxpeXVuY3MuY29tL3dzIl0sImFwcElkIjoiVFkzSTJZWDAiLCJ0b2tlbiI6Im1wLmV5SjBlWEFpT2lKS1YxUWlMQ0poYkdjaU9pSklVekkxTmlKOxxxxxxx"
},
"aliyun_new_im":{
"appid":"exampleapp",
"appsign":"examplesign",
"apptoken":"exampletoken",
"auth":{
"userid":"123",
"nonce":"exampleAK", // 可为空
"timestamp":1677576840,
"role":"admin"
}
}
}
创建直播间
接口说明
请求协议:http/https
请求Path:/api/v2/live/create
是否需要授权:是
请求Method:POST
请求ContentType:JSON
请求参数
名称 | 类型 | 是否必填 | 示例值 | 描述 | |||
title | String | 是 | title**** | 直播标题, 长度小于64字符 | |||
notice | String | 否 | notice**** | 直播公告 说明 仅针对aliyun_old服务起作用。 | |||
anchor | String | 是 | anchor**** | 主播的UserID | |||
anchor_nick | String | 否 | anchornick**** | 主播昵称 说明 仅针对aliyun_old服务起作用。 | |||
mode | Integer | 否 | 0 | 直播模式,默认为0
| |||
extends | String | 否 | {"xx":"xxx"} | 扩展字段,JSON格式字符串,长度小于512字符 | |||
im_server | JSON数组 | 是 | ["aliyun_old","aliyun_new"] | 配置使用哪些IM服务。可多选
|
返回数据
名称 | 类型 | 示例值 | 描述 | ||||
code | Integer | 200 | 业务响应码。参考HTTP响应码 | ||||
id | String | ee487235-5f9b-4cb3-82ce-45c91c365**** | 直播间ID | ||||
created_at | String | 2023-02-27T17:34:00.592750182+08:00 | 创建时间 | ||||
updated_at | String | 2023-02-27T17:34:00.592750182+08:00 | 修改时间 | ||||
title | String | title**** | 直播标题 | ||||
notice | String | notice**** | 直播公告 | ||||
cover_url | String | 封面图。预留字段 | |||||
anchor_id | String | anchor_id**** | 主播UserID | ||||
anchor_nick | String | anchor_nick**** | 主播昵称 | ||||
extends | String | {"xx":"xxx"} | 扩展字段 | ||||
status | Integer | 0 | 直播间状态: 0:准备中 1:已开播 2:已停止 | ||||
mode | Integer | 0 | 直播模式
| ||||
chat_id | String | ee487235-5f9b-4cb3-82ce-45c91c36**** | IM群ID | ||||
meeting_id | String | 0a7656c4-c01b-424d-9882-a8bf44bd**** | 连麦ID | ||||
meeting_info | String | {"members":[{"user_id":"xxx","user_nick":"xxx","user_avatar":"http://xxx"}]} | JSON字符串。连麦观众信息 | ||||
push_url_info | JSON | 推流地址集合 | |||||
push_url_info.rtmp_url | String | rtmp://push.h5v****.vip/live/ee487235-5f9b-4cb3-82ce-45c91c36****?auth_key=167**** | RTMP推流 | ||||
push_url_info.rts_url | String | artc://push.h5v****.vip/live/ee487235-5f9b-4cb3-82ce-45c91c36****?auth_key=16780**** | RTS推流 | ||||
push_url_info.srt_url | String | srt://push.h5v****.vip/live/ee487235-5f9b-4cb3-82ce-45c91c36****?auth_key=167809**** | SRT推流 | ||||
pull_url_info | JSON | 拉流地址集合 | |||||
pull_url_info.rtmp_url | String | rtmp://pull.h5v****.vip/live/ee487235-5f9b-4cb3-82ce-45c91c36****?auth_key=167809**** | RTMP拉流 | ||||
pull_url_info.rts_url | String | artc://pull.h5v****.vip/live/ee487235-5f9b-4cb3-82ce-45c91c36****?auth_key=167809**** | RTS拉流 | ||||
pull_url_info.hls_url | String | http://pull.h5v****.vip/live/ee487235-5f9b-4cb3-82ce-45c91c36****.flv?auth_key=167809**** | HLS拉流 | ||||
pull_url_info.flv_url | String | http://pull.h5v****.vip/live/ee487235-5f9b-4cb3-82ce-45c91c36****.m3u8?auth_key=167809**** | FLV拉流 | ||||
link_info | JSON | 连麦地址集合 | |||||
link_info.rtc_push_url | String | artc://live****.aliyun.com/push/0a7656c4-c01b-424d-9882-a8bf44bd****?sdkAppId=7c61616e-480b-4de6-b3fc-95cef48f****&userId=主播userId×tamp=1677576840&token=95e014264c0b937b449e9a5f3f854c32**** | RTC推流地址 | ||||
link_info.rtc_pull_url | String | artc://live****.aliyun.com/play/0a7656c4-c01b-424d-9882-a8bf44bd****?sdkAppId=7c61616e-480b-4de6-b3fc-95cef48f*****&userId=主播userId×tamp=1677576840&token=95e014264c0b937b**** | CRTC拉流地址 | ||||
link_info.cdn_pull_info | JSON | 普通观众的拉流地址集合 | |||||
link_info.cdn_pull_info.rtmp_url | String | rtmp://pull.h5v****.vip/live/7c61616e-480b-4de6-b3fc-95cef48f****_0a7656c4-c01b-424d-9882-a8bf44bd****_主播userId_camera?auth_key=167757**** | RTM拉流 | ||||
link_info.cdn_pull_info.rts_url | String | artc://pull.h5v****.vip/live/7c61616e-480b-4de6-b3fc-95cef48f****_0a7656c4-c01b-424d-9882-a8bf44bd****_主播userId_camera?auth_key=16775**** | RS拉流 | ||||
link_info.cdn_pull_info.hls_url | String | http://pull.h5v****.vip/live/7c61616e-480b-4de6-b3fc-95cef48f****_0a7656c4-c01b-424d-9882-a8bf44bd****_主播userId_camera.flv?auth_key=167757**** | HLS拉流 | ||||
link_info.cdn_pull_info.flv_url | String | http://pull.h5v****.vip/live/7c61616e-480b-4de6-b3fc-95cef48f****_0a7656c4-c01b-424d-9882-a8bf44bd****_主播userId_camera.m3u8?auth_key=167757**** | FLV拉流 |
示例
请求示例
{
"title": "title****",
"notice": "notice****",
"anchor":"anchor****",
"anchor_nick":"anchornick****",
"mode":0,
"extends":"{\"xx\":\"xxx\"}",
"im_server":["aliyun_old","aliyun_new"]
}
返回示例
{
"id": "ee487235-5f9b-4cb3-82ce-45c91c36****",
"created_at": "2023-02-27T17:34:00.592750182+08:00",
"updated_at": "2023-02-27T17:34:00.592750314+08:00",
"title": "title****",
"notice": "notice****",
"anchor_id": "anchor_id****",
"anchor_nick": "anchor_nick****",
"extends": "{\"xx\":\"xxx\"}",
"status": 0,
"mode": 0,
"chat_id": "ee487235-5f9b-4cb3-82ce-45c91c36****",
"meeting_id": "0a7656c4-c01b-424d-9882-a8bf44bd****",
"meeting_info": "",
"push_url_info": {
"rtmp_url": "rtmp://push.h5v****.vip/live/ee487235-5f9b-4cb3-82ce-45c91c36****?auth_key=167****",
"rts_url": "artc://push.h5v****.vip/live/ee487235-5f9b-4cb3-82ce-45c91c36****?auth_key=16780****",
"srt_url": "srt://push.h5v****.vip/live/ee487235-5f9b-4cb3-82ce-45c91c36****?auth_key=167809****"
},
"pull_url_info": {
"rtmp_url": "rtmp://pull.h5v****.vip/live/ee487235-5f9b-4cb3-82ce-45c91c36****?auth_key=167809****",
"rts_url": "artc://pull.h5v****.vip/live/ee487235-5f9b-4cb3-82ce-45c91c36****?auth_key=167809****",
"flv_url": "http://pull.h5v****.vip/live/ee487235-5f9b-4cb3-82ce-45c91c36****.flv?auth_key=167809****",
"hls_url": "http://pull.h5v****.vip/live/ee487235-5f9b-4cb3-82ce-45c91c36****.m3u8?auth_key=167809****"
},
"link_info": {
"rtc_push_url": "artc://live****.aliyun.com/push/0a7656c4-c01b-424d-9882-a8bf44bd****?sdkAppId=7c61616e-480b-4de6-b3fc-95cef48f****&userId=主播userId×tamp=1677576840&token=95e014264c0b937b449e9a5f3f854c32anchor****",
"rtc_pull_url": "artc://live****.aliyun.com/play/0a7656c4-c01b-424d-9882-a8bf44bd****?sdkAppId=7c61616e-480b-4de6-b3fc-95cef48f****&userId=主播userId×tamp=1677576840&token=95e014264c0b937b4anchor****",
"cdn_pull_info": {
"rtmp_url": "rtmp://pull.h5v****.vip/live/7c61616e-480b-4de6-b3fc-95cef48f****_0a7656c4-c01b-424d-9882-a8bf44bd****_主播userId_camera?auth_key=167757****",
"rts_url": "artc://pull.h5v****.vip/live/7c61616e-480b-4de6-b3fc-95cef48f****_0a7656c4-c01b-424d-9882-a8bf44bd****_主播userId_camera?auth_key=16775****",
"flv_url": "http://pull.h5v****.vip/live/7c61616e-480b-4de6-b3fc-95cef48f****_0a7656c4-c01b-424d-9882-a8bf44bd****_主播userId_camera.flv?auth_key=167757****",
"hls_url": "http://pull.h5v****.vip/live/7c61616e-480b-4de6-b3fc-95cef48f****_0a7656c4-c01b-424d-9882-a8bf44bd****_主播userId_camera.m3u8?auth_key=167757****"
}
}
}