语音相关接口
本文档主要列出语音相关接口。
本文档中的接口均符合接口规范,如有疑问,建议先查阅接口引言。
加入语音频道
接口说明
地址 |
请求方式 |
说明 |
/api/v3/voice/join |
POST |
加入某个语音频道 |
参数列表
参数名 |
类型 |
必传 |
参数区域 |
说明 |
channel_id |
string |
是 |
POST |
需要加入的语音频道 id |
audio_ssrc |
string |
否 |
POST |
默认为1111. 传输的语音数据的ssrc, 不熟悉慎改。参见RFC 3550 |
audio_pt |
string |
否 |
POST |
默认为111, 传输的语音数据的payload_type,不熟悉慎改。参见RFC 3551 |
rtcp_mux |
boolean |
否 |
POST |
默认为true.将rtcp与rtp使用同一个端口进行传输,参见RFC 5761 |
password |
string |
否 |
POST |
有些房间需要密码才能进入,可以传入密码 |
返回参数说明
参数名 |
类型 |
说明 |
ip |
string |
媒体服务器的推流ip |
port |
string |
媒体服务器的推流端口 |
rtcp_mux |
boolean |
是否将rtcp与rtp使用同一个端口进行传输,如果为true,推流地址应该为 rtp://ip:port |
rtcp_port |
int |
媒体服务器的rtcp推流端口.如果使用rtcp_mux,请忽略该参数。如果不使用rtcp_mux,则推流地址中需要写上rtcpport,如: rtp://xxx:port?rtcpport=rtcpPort |
bitrate |
int |
当前语音房间要求的比特率,系统会检测机器人的推流码率, 如果超速(正常推流由于各种原因会在码率上下浮动,请不要超过120%)会被关闭,甚至处罚,请遵照比特率进行推流 |
audio_ssrc |
string |
同上, 最终的ssrc |
audio_pt |
string |
同上, 最终的payload_type |
返回示例
//假设我们发起了请求,返回了如下的数据,说明我们已经创建了相应的语音推流地址
{
"code": 0,
"message": "操作成功",
"data": {
"ip": "127.0.0.1",
"port": "1000",
"rtcp_port": "10001",
"rtcp_mux" : false,
"bitrate": 48000,
"audio_ssrc": "1111",
"audio_pt": "111"
}
}
那么现在,我们可以使用ffmpeg/gstreamer来进行推流,如下为ffmpeg的示例:
# 如下为推流的一个示例,最主要的是后面的推流地址,我们需要交json中返回的audio_ssrc, audio_pt, ip, port, rtcpPort填入即可。
# -ab 参数后面是码率,本示例中推流码率为48k, 大家可以根据返回的参数自行调整
# 其它的参数如果不会ffmeg请尽量不要改动, 如果有需求,可以参考 https://ffmpeg.org/ffmpeg.html
ffmpeg -i 'test.mp3' -re -map '0:a:0' -acodec libopus -ab 48k -ac 2 -ar 48000 -filter:a 'volume=0.8' -f tee '[select=a:f=rtp:ssrc=1111:payload_type=111]rtp://127.0.0.1:1000?rtcpport=1001'
Tips:
- KOOK默认的编码是opus编码,你可能需要在ffmpeg的基础上安装libopus.
- 基于安全考量,在创建推流的ip和端口后,我们会将你的ip和端口与该推流地址绑定,防止黑客扫描端口或者泄漏带来的可能的安全风险。因此,该措施会导致你创建好的地址,在第一次推流后,第二次向该端口推流会失败(你的外网的端口和ip可能会变化,无法连续使用)。因此,对于多个文件连续推流有两个解决方法:
- 每次都调该接口,重新生成ip地址和端口
- 采用ffmpeg的播放列表
- 由于推流会占据较多资源,因此,每个机器人还是有限额的,如果当前的额度不够,请在开发者中心联系管理员进行调整。系统会针对每个推流的ip进行检查,如果长期不使用,也会回收资源。对于不再使用的ip,建议开发者主动调用api/v3/voice/leave来释放资源。
获取频道列表
接口说明
地址 |
请求方式 |
说明 |
/api/v3/voice/list |
GET |
获取机器人加入的语音频道列表 |
参数列表
返回参数说明
参数名 |
类型 |
说明 |
id |
string |
频道id |
guild_id |
string |
服务器id |
parent_id |
string |
频道的父频道id |
name |
string |
频道名 |
返回示例
{
"code":0,
"message":"操作成功",
"data":{
"items":[
{
"id":"12345",
"guild_id":"12345",
"parent_id":"11234",
"name":"语音频道"
}
],
"meta":{
"page":1,
"page_total":1,
"page_size":50,
"total":1
},
"sort":{}
}
}
离开语音频道
接口说明
地址 |
请求方式 |
说明 |
/api/v3/voice/leave |
POST |
离开语音频道 |
参数列表
参数名 |
位置 |
类型 |
必需 |
说明 |
channel_id |
string |
是 |
POST |
需要离开的语音频道 id |
返回参数说明
返回示例
{
"code": 0,
"message": "操作成功",
"data": {
}
}
保持语音连接活跃
接口说明
地址 |
请求方式 |
说明 |
/api/v3/voice/keep-alive |
POST |
保持语音连接活跃。正常如果长时间断流,系统会回收端口等资源,如果不希望系统回收,可以每隔45s,调用该接口,保持端口活跃,这样系统不会回收该端口资源 |
参数列表
参数名 |
位置 |
类型 |
必需 |
说明 |
channel_id |
string |
是 |
POST |
需要保持活跃语音频道 id |
返回参数说明
返回示例
{
"code": 0,
"message": "操作成功",
"data": {
}
}