maple-rtc 为蓝蘑云推出的实时音视频会议系统,包括了实时音频,视频,变声,美颜等功能,适用于娱乐,游戏,教育等实时音视频场景中;
maple-rtc iOS sdk 目录结构如下:
演示的iOS 音视频maple-rtc-iOS-1v1-sample源码;
iOS SDK 主要基于object-c 语言调用,包括以下类:
BMediaKit | 包含所有由应用程序调用的主要方法 |
---|---|
BMediaDelegate | 采用 delegate 方法用于向应用程序发送回调通知 |
音频调用接口流程图:
视频调用接口流程图:
注:调用 BMediaKit 的接口最好在同一个线程进行,不建议在不同的线程同时调用。
+ (instancetype)sharedEngineWithAppId:(NSString * _Nonnull)appId
delegate:(id<BMediaDelegate> _Nullable)delegate;
appId:
delegate:
self.mBMediaKit = [BMediaKit sharedEngineWithAppId:"6638******fdd2" delegate:self];
- (void) setParameter:(NSString * _Nonnull)key withValue:(NSString * _Nonnull)value;
该方法用于设置SDK特殊的参数;
key:
value:
无
[self.mBMediaKit setParameter:@"abc" withValue:@"abc"];
- (int) setChannelProfile:(NSInteger)profile;
profile:
int ret = [self.mBMediaKit setChannelProfile:CHANNEL_PROFILE_VOICE_VIDEO];
- (int) setVideoConferenceProfile:(NSInteger)profile;
profile:
int ret = [self.mBMediaKit setVideoConferenceProfile:VIDEO_CONFERENCE_PROFILE_MCU];
- (int) setMediaProfile:(NSInteger)audioProfile withVideo:(NSInteger)videoProfile;
audioProfile:
videoProfile:
int ret = [self.mBMediaKit setMediaProfile:AUDIO_PROFILE_VOICE_STANDARD withVideo: VIDEO_PROFILE_480P];
- (int) setJoinChannelUserId:(NSString * _Nonnull)uid;
uid:
int ret = [self.mBMediaKit setJoinChannelUserId:@"123"];
+ (NSUInteger)getSdkVersion;
该方法返回SDK版本号。
无
NSUInteger version = [BMediaKit getSdkVersion];
- (int)joinChannel:(NSString * _Nonnull)channelId;
该方法允许用户加入频道。如果频道尚未建立,调用该方法可以自动创建频道。 同一个频道内的用户可以互相通话,多个用户加入同一个频道,可以群聊。使用不同 App ID 的应用程序是不能互通的。如果已在通话中,用户必须调用 leaveChannel 退出当前通话,才能进入下一个频道。
channelId:
int ret = [self.mBMediaKit joinChannel:@"123"];
- (int)joinChannel:(NSString * _Nonnull)channelId
uid:(NSString * _Nonnull)uid;
该方法允许用户加入频道。如果频道尚未建立,调用该方法可以自动创建频道。 同一个频道内的用户可以互相通话,多个用户加入同一个频道,可以群聊。使用不同 App ID 的应用程序是不能互通的。如果已在通话中,用户必须调用 leaveChannel 退出当前通话,才能进入下一个频道。
channelId:
uid:
int ret = [self.mBMediaKit joinChannel:@"123" uid:@"nick"];
- (int)leaveChannel;
该方法为用户离开频道,即挂断或退出通话。通过调用 joinChannel 加入频道后,必须调用 leaveChannel 以结束通话,否则不能进行下一次通话。 不管当前是否在通话中,都可以调用 leaveChannel,没有副作用。leaveChannel 会把会话相关的所有资源释放掉。
无
int ret = [self.mBMediaKit leaveChannel];
- (int) startLocalAudio;
开启本地音频的采集和上行。调用该方法后,打开录音设备,在同一频道内的其他用户听到你的声音;
无
int ret = [self.mBMediaKit startLocalAudio];
- (int) stopLocalAudio;
开启本地音频的采集和上行。调用该方法后,关闭录音设备,在同一频道内的其他用户将无法听到你的声音,;
无
int ret = [self.mBMediaKit stopLocalAudio];
- (int)muteLocalAudioStream:(BOOL)muted;
静音/取消静音。调用该方法后,在同一频道内的其他用户将无法听到你的声音;
muted:
int ret = [self.mBMediaKit muteLocalAudioStream:YES];
- (int)muteRemoteAudioStream:(NSString * _Nonnull)uid mute:(BOOL)muted;
该方法用于允许/禁止播放远端指定用户的音频流。没有被禁止用户的音频流接受和播放正常;
uid:
muted:
[self.mBMediaKit muteRemoteAudioStream:@"nick" mute:YES];
- (int)setEnableSpeakerphone:(BOOL)enableSpeaker;
该方法用于打开/关闭外放扬声器模式,即听筒和扬声器播放的切换;
enableSpeaker:
int ret = [self.mBMediaKit setEnableSpeakerphone:YES]
- (int)adjustPlaybackSignalVolume:(NSUInteger)volume;
该方法用于调节播放信号音量;软件调节播放信号音量,默认值为100(原始音量),最大调整为200(即原始音量的2倍),如果为小于等于0,即软件级静音,无法听到任何远端音频流;
volume:
int ret = [self.mBMediaKit adjustPlaybackSignalVolume:50]
- (int)adjustRecordingSignalVolume:(NSUInteger)volume;
该方法用于调节录音信号音量;软件调节录音信号音量,默认值为100(原始音量),最大调整为400(即原始音量的4倍);如果为小于等于0,即软件级静音,对方将听不到你说话声音;
volume:
int ret = [self.mBMediaKit adjustRecordingSignalVolume:50];
- (int)enableAudioVolumeIndication:(NSInteger)interval;
该方法允许 SDK 定期向应用程序反馈当房间里所有用户说话的音量。
interval:
int ret = [self.mBMediaKit enableAudioVolumeIndication:500]
- (int)setupLocalVideo:(BMVideoCanvas* _Nullable)local;
该方法设置本地视频显示信息。应用程序通过调用此接口绑定本地视频流的显示视窗(view),并设置视频显示模式。
local:
Class BMVideoCanvas 描述 * view: 视频显示视窗, * renderMode: 视频显示模式, RENDERMODEHIDDEN (1): 如果视频尺寸与显示视窗尺寸不一致,则视频流会按照显示视窗的比例进行周边裁剪或图像拉伸后填满视窗。RENDERMODEFIT(2): 如果视频尺寸与显示视窗尺寸不一致,在保持视频长宽比的前提下,将视频进行缩放后填满视窗。 * uid: 本地用户 ID,与 joinChannel 方法中的 uid 保持一致
int ret = [self.mBMediaKit setupLocalVideo:[[BMVideoCanvas alloc] init:self.localVideo withMode:RENDER_MODE_HIDDEN withUid:@"nick"]];
- (int)setupRemoteVideo:(BMVideoCanvas* _Nullable)remote;
该方法绑定远程用户和显示视图,即设定 uid 指定的用户用哪个视图显示。调用该接口时需要指定远程视频的 uid;
remote:
Class BMVideoCanvas 描述 * view: 视频显示视窗, * renderMode: 视频显示模式, RENDERMODEHIDDEN (1): 如果视频尺寸与显示视窗尺寸不一致,则视频流会按照显示视窗的比例进行周边裁剪或图像拉伸后填满视窗。RENDERMODEFIT(2): 如果视频尺寸与显示视窗尺寸不一致,在保持视频长宽比的前提下,将视频进行缩放后填满视窗。 * uid: 远端用户 ID,在 onUserJoinedNotice 事件中获取;
int ret = [self.mBMediaKit setupRemoteVideo:[[BMVideoCanvas alloc] init:self.remoteVideo withMode:RENDER_MODE_HIDDEN withUid:@"nick"]];
- (int)startPreview;
该方法用于启动本地视频预览。
无
int ret = [self.mBMediaKit startPreview];
- (int)stopPreview;
无
int ret = [self.mBMediaKit stopPreview];
- (int)switchCamera;
该方法用于在前置/后置摄像头间切换。
无
int ret = [self.mBMediaKit switchCamera];
- (int)enableCameraTorchOn:(BOOL)enabled;
该方法用于开关摄像头闪光灯。
enabled:
int ret = [self.mBMediaKit enableCameraTorchOn:YES];;
- (int)muteLocalVideoStream:(BOOL)muted;
muted:
int ret = [self.mBMediaKit muteLocalVideoStream:YES];
- (int)muteRemoteVideoStream:(NSString * _Nonnull)uid mute:(BOOL)muted;
uid:
muted:
int ret = [self.mBMediaKit muteRemoteVideoStream:uid mute:NO];
- (int)muteRemoteVideoStream2:(NSString * _Nonnull)uid mute:(BOOL)muted;
uid:
muted:
int ret = [self.mBMediaKit muteRemoteVideoStream2:uid mute:NO];
- (void)enableBeautify:(BOOL)enabled;
enabled:
int ret = [self.mBMediaKit enableBeautify:YES];
- (int)setBeautifyLevel:(float)value;
value:
int ret = [self.mBMediaKit setBeautifyLevel:0.5];
SDK 会通过代理方法 BMediaDelegate 向应用程序上报一些运行时事件。
必须在加入频道前调用 (instancetype)sharedEngineWithAppId:(NSString * _Nonnull)appId delegate:(id
- (void)rtcEngine:(BMediaKit * _Nonnull)engine onJoinChannelSuccess:(NSString* _Nonnull)channelId withUid:(NSString* _Nonnull)uid;
表示客户端登入服务器成功,且创建和分配了频道 ID 和用户 ID。频道 ID 的分配是根据 joinChanel API 中指定的频道名称。如果调用 joinChannel 时并未指定用户 ID,服务器就会随机分配一个。
channelId:
uid:
- (void)rtcEngine:(BMediaKit * _Nonnull)engine onJoinChannelFailed:(MapleRtcJoinChannelFailedReason)reason;
表示客户端登入服务器失败。
reason:
- (void)rtcEngine:(BMediaKit * _Nonnull)engine onLeaveChannel:(MapleRtcLeaveChannelReason)reason;
用程序调用 leaveChannel() 方法时,SDK提示应用程序离开频道成功或者失败。参数reason表示具体原因状态码。
reason:
- (void)rtcEngine:(BMediaKit * _Nonnull)engine onForceKickOutChannel:(MapleRtcKickedOutReason)reason;
由于某种原因,自己强行被系统踢下线。参数reason表示具体原因状态码。
reason:
- (void)rtcEngine:(BMediaKit * _Nonnull)engine onUserJoinedNotice:(NSArray * _Nonnull)uids;
提示有用户加入了频道。如果该客户端加入频道时已经有人在频道中,SDK也会向应用程序上报这些已在频道中的全部用户。
uids:
- (void)rtcEngine:(BMediaKit * _Nonnull)engine onUserOfflineNotice:(NSArray * _Nonnull)uids;
提示有用户离开了频道(或掉线)。
uids:
- (void)rtcEngine:(BMediaKit * _Nonnull)engine onWarning:(MapleRtcWarningCode)warningCode;
该回调方法表示 SDK 运行时出现了(网络或媒体相关的)警告。 通常情况下,SDK上报的警告信息应用程序可以忽略,SDK 会自动恢复。
reason:
- (void)rtcEngine:(BMediaKit * _Nonnull)engine onError:(MapleRtcErrorCode)errorCode;
表示 SDK 运行时出现了(网络或媒体相关的)错误。 通常情况下,SDK 上报的错误意味着 SDK 无法自动恢复,需要 APP 干预或提示用户。
reason:
- (void)rtcEngine:(BMediaKit * _Nonnull)engine onAudioVolumeIndication:(NSInteger)volume;
该方法允许 SDK 定期向应用程序反馈当前房间里谁在输入声音的音量。该提示默认为关闭状态,如有需要,调用 enableAudioVolumeIndication 方法触发该提示。
volume:
volumeInfo * 类型:NSDictionary * 默认值:无 * 描述:说话者音量信息(0~255);
- (void)rtcEngine:(BMediaKit * _Nonnull)engine onConnectionLost:(MapleRtcWarningCode)warningCode;
连接丢失监听事件;sdk 和服务器失去了网络连接,并且尝试自动重连一段事件(15s左右)后仍未连上。回调该事件后,sdk将不会再次自动重连,需要用户手动调用leaveChannel,后再次尝试加入频道;
无
- (void)rtcEngine:(BMediaKit * _Nonnull)engine onFirstRemoteVideoFrameSizeChanged:(NSString* _Nonnull)uid size:(CGSize)size;
该方法允许 SDK 向应用程序反馈远端第一帧视频解码成功的回调。当调用muteRemoteVideoStream2或者muteRemoteVideoStream后,该回调会产生;
size:
uid:
状态码 | 值 | 描述 |
---|---|---|
KC_StatusOk | 200 | 状态正常 |
KC_JoinChannelFailed | 4000 | 加入频道失败 |
KC_LoginSignalServerFailed | 4001 | 登录信令服务器失败 |
KC_ConnectMediaServerFailed | 4003 | 连接媒体服务器失败 |
KC_AppIdInvalid | 4005 | 无效的AppId |
KC_HttpRequestFailed | 4006 | 加入频道失败 |
KC_LeaveChannelFailed | 4100 | 离开频道失败 |
KC_KickedOutReLogin | 4200 | 相同userId用户登录,服务器强行踢出当前用户 |
KC_KickedOutTimeOut | 4201 | 客户端长时间未通知服务器状态,服务器强行踢出当前用户 |