豪翔天下

Change My World by Program

0%

Agora 声网 使用手册

  • 每月1万分钟的免费额度,可以说相当不错的了

生成token

  • 无论是主持人还是用户还是录制UID进入频道前都需要先生成一个token
  • token的生成方式点击标题即可,里面有各种语言生成token的方式
  • 生成token必须提供一个UID,得自己找办法和数据库中原有的用户关联
  • token相关错误码

服务端

  • 服务端的Restful API都有频率限制且阈值并不高,这是官方提供的超出频率限制解决方法,可以参考一下,之前我以为hook能够帮助我减少很多请求,但发现并不如我的预期,主要是实效和顺序性的问题

Channel相关的服务端Restful API

项目管理

踢人规则

查询在线频道信息

获取用户列表
  • 可以同时获取主持人和观众的用户列表,但是只有创建token时候的UID
1
# 接口地址: /dev/v1/channel/user/{appid}/{channelName}

云端录制Restful API

  • 如果一个频道超过30秒内没有主持人以及观众,那么频道会关闭,下面的接口都会提示找不到该频道
  • 云端录制的原理就是添加了一个观众去听
  • 目前云端录制无论是自建服务器还是使用官方接口都只支持生成m3u8格式的音视频文件,如果需要其他格式需要自己去转换
  • 云端录制常见错误码
  • 要测试云端录制,只需在控制台的APP设置页面点击Web demo即可开启一个demo,这个demo的channelName就是demo,然后调用下面这几个接口即可

获取云端录制资源resource ID

  • 后续对云端录制的几个接口都需要该resource ID,并且每次调用都能生成一个新的
  • resource ID的时效是5分钟,必须5分钟内用它去开始云端录制,但是后续仍然可以用它来query/stop
  • 如果400错误,有可能是没有开通云端录制权限,需要在控制台查看云端录制统计即可开通
1
2
3
4
5
6
7
8
9
# 接口地址: /v1/apps/{appid}/cloud_recording/acquire
# 接口参数:
{
"cname": "频道名称",
"uid": "1234567890", # 可以固定一个与数据库中其他用户uid不会重复的id
"clientRequest": {
"resourceExpiredHour": 24
}
}

开始云端录制

  • 一般紧接着获取resource ID后进行
    • 需要注意的是,多次对同一个频道调用start接口,会开启多个录制,会生成多份录制文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 接口地址: /v1/apps/{appid}/cloud_recording/resourceid/{resourceid}/mode/{mode}/start
# 其中mode=mix的是默认模式,表示将频道哪所有UID的音视频混合录制为一个音视频文件,可选individual/web
# 接口参数:
{
"cname": "频道名",
"uid": "录制的用户ID", # 需要和获取resource ID的一致
"clientRequest": {
"token": `${this.buildTokenWithUid(uid)}`, # 调用buildTokenWithUid方法生成的token
"recordingConfig": {
"channelType": 1,
"streamTypes": 0,
"maxIdleTime": 3000, # 这个一定要注意设置大一点,否则可能出现超过一定时间不出声频道自动销毁的情况
"videoStreamType": 0,
"unSubscribeAudioUids": [
"1234567890" # 不录制指定uid的音视频,可以直接设置为录制用的那个UID
]
},
"recordingFileConfig": {
"avFileType": [
"hls"
]
},
"storageConfig": {
"vendor": 1,
"accessKey": config.aws3.accessKeyId,
"region": config.aws3.regionNum,
"bucket": config.aws3.bucket,
"secretKey": config.aws3.secretAccessKey,
"fileNamePrefix": [ # 需要注意的是文件夹名称在agora这边不允许下划线
'directoryPrefix',
audioPost.id
]
}
}
}

查询云端录制状态

  • 可以通过该方法获取云端录制生成的m3u8文件名称(如果不使用agora提供的回调服务,就只能自己找个时机去获取了,否则频道销毁后就获取不到该文件了,并且频道在刚调用完start的时候也是获取不到该文件的)
1
# 接口地址:/v1/apps/{appid}/cloud_recording/resourceid/{resourceid}/sid/{sid}/mode/{mode}/query

停止云端录制

  • 当所有用户都离开频道后,云端录制也会自动暂停的
  • 云端录制停止不代表频道被销毁
1
2
3
4
5
6
7
# 接口地址: /v1/apps/{appid}/cloud_recording/resourceid/{resourceid}/sid/{sid}/mode/{mode}/stop
# 接口参数:
{
"cname": "频道名称",
"uid": "录制用的用户ID",
"clientRequest": {}
}

回调服务/消息通知服务

  • 要开通回调服务国内必须提交工单,国外必须通过email联系
  • 回调服务需要提供接口给他们,否则他们总说你的接口有问题,我都还没接入我怎么提供接口呢,关键改接口地址又得发邮件,所以这里最好先写好一个返回200的接口,并且把body都打印到日志里面去
  • 回调服务需要问你是否需要retry,之前我觉得加上会比较好,后来看觉得还是取消好一点,他们的回调没发现漏发的,只有不及时的,反正时间顺序完全没有

实时通信回调服务

云端录制 RESTful API 回调服务

EventType Description comment
4 The M3U8 playlist file is generated. M3U8文件生成 可以在这时候获取到m3u8文件的文件名
11 The cloud recording service has ended its tasks and exited. 云端录制退出 退出的时候可以尝试从m3u8文件中解析出云端录制的总时长
33 录制文件上传到第三方云存储的进度 个人感觉没多大用,每个分片都会进行上传并回调,再加上retry,这个事件相当多
42 同步录制文件信息
43 音频流状态变化
坚持原创技术分享,谢谢支持

欢迎关注我的其它发布渠道