语音相关接口
本文档主要列出语音相关接口。
本文档中的接口均符合接口规范,如有疑问,建议先查阅接口引言。
加入语音频道
接口说明
| 地址 | 
请求方式 | 
说明 | 
/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": {
    }
}