maple-rtc 为蓝蘑云推出的实时音视频会议系统,包括了实时音频,视频,变声,美颜等功能,适用于娱乐,游戏,教育等实时场景中;
maple-rtc voice sdk 目录结构如下:
演示的cocos2d 语音demo源码自行前往github下载;
在工程下面建一个BMGamingSDK目录, 把include和libs文件夹拷贝到 BMGamingSDK。添加jar文件,在proj.android-studio/app/build.gradle的dependencies处添加如下:
在proj.android-studio/app/jni的Android.mk中添加库文件和头文件的引用:
在proj.android-studio/app/AndroidManifest.xml添加如下权限:
android.permission.INTERNET
android.permission.BLUETOOTH
android.permission.RECORD_AUDIO
android.permission.MODIFY_AUDIO_SETTINGS
确保已满足以下环境要求:
在工程下面建一个BMGamingSDK目录, 把include和libs文件夹拷贝到 BMGamingSDK。添加MapleAudioKit.framework和添加以下必要的系统库:
引用头文件:
#include "../BMGamingSDK/include/BMediaNativeCore.h"
设置project privacy来获取 microphone 权限;
设置Other Link Flags 加-ObjC
确保已满足以下环境要求:
Cocos2dx 主要基于c++ 语言调用,包括以下类:
BMediaKit | 包含应用程序需要调用的主要方法 |
---|---|
IBMediaEventHandler | 包含回调方法 |
android 需要单独调用一个额外接口来注册Android的activity到SDK;该接口需要在Android java客户端启动的入口方法中加入protected void onCreate(final Bundle savedInstanceState)如下示例:
import com.maple.rtc.BMediaKit;
BMediaKit.registerActivity(this);
如果不注册activity,Android后续的C++接口调用可能都会失败;
注:如无特殊说明接口,建议在主线程调用;
virtual void setChannelProfile(CHANNEL_PROFILE_TYPE profile);
profile:
int ret = BMediaKit_getInstance(MAPLE_APP_ID)->setChannelProfile(CHANNEL_PROFILE_VOICE_ONLY);
virtual int setJoinChannelUserId(const char* uid);
uid:
int ret = BMediaKit_getInstance(MAPLE_APP_ID)->setJoinChannelUserId(“abcd”);
virtual void setEventHandler(IBMediaEventHandler* handler);
该方法为设置一个回调函数到SDK。如果不设置,后续全面回调函数无法返回;该方法必须在加入频道前调用和进行设置,进入频道后无法再设置;
handler: * 类型:IBMediaEventHandler * 默认值:无 * 描述:具体查看IBMediaEventHandler 类方法;
无
int version = BMediaKit_getInstance(MAPLE_APP_ID)->setEventHandler(this);
static int getSdkVersion();
该方法返回SDK版本号。
无
int version = BMediaKit_getInstance(MAPLE_APP_ID)->getSdkVersion();
virtual int joinChannel(const char* channelId);
该方法允许用户加入频道。如果频道尚未建立,调用该方法可以自动创建频道。 同一个频道内的用户可以互相通话,多个用户加入同一个频道,可以群聊。使用不同 App ID 的应用程序是不能互通的。如果已在通话中,用户必须调用 leaveChannel() 退出当前通话,才能进入下一个频道。
channelId:
int ret = BMediaKit_getInstance(MAPLE_APP_ID)->joinChannel(“123”);
virtual int joinChannel(const char* channelId, const char* uid);
该方法允许用户加入频道。如果频道尚未建立,调用该方法可以自动创建频道。 同一个频道内的用户可以互相通话,多个用户加入同一个频道,可以群聊。使用不同 App ID 的应用程序是不能互通的。如果已在通话中,用户必须调用 leaveChannel() 退出当前通话,才能进入下一个频道。
channelId:
uid:
int ret = BMediaKit_getInstance(MAPLE_APP_ID)->joinChannel(“123”,“abc”);
virtual int leaveChannel();
该方法为用户离开频道,即挂断或退出通话。通过调用 joinChannel 加入频道后,必须调用 leaveChannel() 以结束通话,否则不能进行下一次通话。 不管当前是否在通话中,都可以调用 leaveChannel(),没有副作用。leaveChannel() 会把会话相关的所有资源释放掉。
无
int ret = BMediaKit_getInstance(MAPLE_APP_ID)->leaveChannel();
virtual int muteLocalAudioStream(bool mute);
静音/取消静音。调用该方法后,在同一频道内的其他用户将无法听到你的声音;
mute:
int ret = BMediaKit_getInstance(MAPLE_APP_ID)->muteLocalAudioStream(true);
virtual int muteRemoteAudioStream(const char* uid, bool mute);
该方法用于允许/禁止播放远端指定用户的音频流。没有被禁止用户的音频流接受和播放正常;
uid:
mute:
int ret = BMediaKit_getInstance(MAPLE_APP_ID)->muteRemoteAudioStream(“abc”,true);
virtual int setEnableSpeakerphone(bool enabled);
该方法用于打开/关闭外放扬声器模式,即听筒和扬声器播放的切换;
enabled:
int ret = BMediaKit_getInstance(MAPLE_APP_ID)->setEnableSpeakerphone(true);
virtual int adjustPlaybackSignalVolume(int volume);
该方法用于调节播放信号音量;软件调节播放信号音量,默认值为100(原始音量),最大调整为200(即原始音量的2倍),如果为小于等于0,即软件级静音,无法听到任何远端音频流;
volume:
int ret = BMediaKit_getInstance(MAPLE_APP_ID)->adjustPlaybackSignalVolume(50);
virtual int adjustRecordingSignalVolume(int volume);
该方法用于调节录音信号音量;软件调节录音信号音量,默认值为100(原始音量),最大调整为400(即原始音量的4倍);如果为小于等于0,即软件级静音,对方将听不到你说话声音;
volume:
int ret = BMediaKit_getInstance(MAPLE_APP_ID)-> adjustRecordingSignalVolume(50);
virtual int enableAudioVolumeIndication(int interval);
该方法允许 SDK 定期向应用程序反馈当前自己说话状态以及自己的音量。
interval:
int ret = BMediaKit_getInstance(MAPLE_APP_ID)->enableAudioVolumeIndication(500);
必须在加入频道前调用void setEventHandler(IBMediaEventHandler* handler)方法来使能回调产生。
virtual void onJoinChannelSuccess(const char* channelId, const char* uid);
表示客户端登入服务器成功,且创建和分配了频道 ID 和用户 ID。频道 ID 的分配是根据 join() API 中指定的频道名称。如果调用 join() 时并未指定用户 ID,服务器就会随机分配一个。
channelId:
uid:
virtual void onJoinChannelFailed(int reason);
表示客户端登入服务器失败。
reason:
virtual void onLeaveChannel(int reason);
用程序调用 leaveChannel() 方法时,SDK提示应用程序离开频道成功或者失败。参数reason表示具体原因状态码。
reason:
virtual void onForceKickOutChannel(int reason);
由于某种原因,自己强行被系统踢下线。参数reason表示具体原因状态码。
reason:
virtual void onUserJoinedNotice(const char* uids);
提示有用户加入了频道。如果该客户端加入频道时已经有人在频道中,SDK也会向应用程序上报这些已在频道中的全部用户。
uids:
virtual void onUserOfflineNotice(const char* uids);
提示有用户离开了频道(或掉线)。
uids:
virtual void onWarning(int warn);
该回调方法表示 SDK 运行时出现了(网络或媒体相关的)警告。 通常情况下,SDK上报的警告信息应用程序可以忽略,SDK 会自动恢复。
reason:
virtual void onError(int err);
表示 SDK 运行时出现了(网络或媒体相关的)错误。 通常情况下,SDK 上报的错误意味着 SDK 无法自动恢复,需要 APP 干预或提示用户。
reason:
virtual void onAudioVolumeIndication(int volume);
该方法允许 SDK 定期向应用程序反馈当前谁在输入声音的音量。该提示默认为关闭状态,如有需要,调用 enableAudioVolumeIndication() 方法触发该提示。
volume:
virtual void onConnectionLost();
连接丢失监听事件;sdk 和服务器失去了网络连接,并且尝试自动重连一段事件(15s左右)后仍未连上。回调该事件后,sdk将不会再次自动重连,需要用户手动调用leaveChannel,后再次尝试加入频道;
无
状态码 | 值 | 描述 |
---|---|---|
KC_StatusOk | 200 | 状态正常 |
KC_JoinChannelFailed | 4000 | 加入频道失败 |
KC_LoginSignalServerFailed | 4001 | 登录信令服务器失败 |
KC_ConnectMediaServerFailed | 4003 | 连接媒体服务器失败 |
KC_AppIdInvalid | 4005 | 无效的AppId |
KC_HttpRequestFailed | 4006 | http请求失败 |
KC_LeaveChannelFailed | 4100 | 离开频道失败 |
KC_KickedOutReLogin | 4200 | 相同userId用户登录,服务器强行踢出当前用户 |
KC_KickedOutTimeOut | 4201 | 客户端长时间未通知服务器状态,服务器强行踢出当前用户 |