IOS-RT SDK
1 概述
众多客户希望在使用我公司的直播服务的同时,能拥有更多的app定制能力,特别是对于拥有开发人员资源的公司,他们希望拥有自己风格的app。为此,特提供iOS RtSDK,以便客户可以针对自己的业务场景设计最符合自己业务场景的客户端。
2 SDK 使用准备
2.1温馨提示
欢迎客户公司开发人员随时和我们沟通,在相互理解的基础上,共同配合完成开发任务。但是为了提高开发效率,恳请客户公司开发人员在开发之前和开发过程中仔细阅读开发文档和查看Demo代码。如果发现文档中有难以理解或者文档中没有记载的问题,请随时找相关负责人沟通。
Demo中的代码用以示范SDK中的接口调用。不保证最符合客户的需求。请勿照抄Demo中的代码,请在理解SDK机制的基础上修改。如果发现任何疑似bug的现象,欢迎及时与相关负责任沟通。
如果在Demo中发现了bug或者发现了SDK的bug,在告知我公司开发人员时,请将系统版本,硬件版本,产生bug的操作流程一并告知我公司开发人员,必要时需要提供日志。
2.2工程设置
2.2.1build settings
- 请将工程中的AppDelegate.m改成AppDelegate.mm或者在other linker 里新增-lc++
- 支持系统ios6+ ,若使用视频硬件加速编解码则支持ios8+
- other linker 设置加上 –ObjC
- 目前RtSDK 可支持真机编译 和 不完美支持模拟器编译(目前在模拟上声音失效)
- 不支持bitcode
2.2.2系统库
- AVFoundation.framework
- OpenGLES.framework
- AudioToolbox.framework
- CoreMedia.framework
- GLKit.framework
- libz.tbd
- libiconv.tbd
- libicucore.tbd
2.2.3直播库
RtSDK.framework
2.2.4其他资源
需要添加RtSDK.bundle到工程中, 里面包含所有的资源文件,比如表情图片等
3 SDK快速入门
考虑到很多用户在看文档时不知道从何开始,现在在这里写一个快速搭建直播的教程。
第一步:新建一个工程, 取名为iOSDemo
第二步: 按照文档中使用准备章节中所述,把所有的库和资源添加到工程, 并将AppDelegate.m 改为AppleDelegate.mm或者在other linker flag 中加入-lc++
第三步:创建直播实例,加入直播
1. 在viewDidLoad 方法中创建GSBroadcastManager的单实例,将直播代理(broadcastRoomDelegate)设置成该ViewController,用来接受直播信息的回调。如图,红色框内为添加的代码。
2.实例创建好之后就要开始连接直播了,注意,这里所谓的连接直播,是指和直播建立了联系,并不是加入到直播中,这是两个概念(后面会涉及到加入操作)。
这里新建了一个GSConnectInfo对象,这个对象封装了一些连接直播所需要的参数:
1.) domain即域名,不能为空;
2.) serviceType为服务类型,如果你的站点是webcast那么就要设置为GSBroadcastServiceTypeWebcast,如果是training,则设置为GSBroadcastServiceTypeTraining。如果没有设置,则默认为GSBroadcastServiceTypeWebcast;
3.) roomNumber即房间号,还有一个webcastID(直播ID),这两个只需要填写一个即可,假如两个都写了,将优先使用webcastID,如果都没有写,则会产生错误
4.) nickName 为显示的昵称,可以自行设置
5.) watchPassword 即观看密码
这些参数都可以在类似于下图这样的页面中找到
webcast:
training:
3. 创建好了GSBroadcastManager对象,发出了连接直播的请求,然后就要在收到直播连接结果的时候做相应处理,大致上的逻辑就是,如果连接成功了,那就要加入直播,如果连接失败,则做相应的报错。下面开看代码。
上图中有两个代理方法,这两个方法都是GSBroadcastRoomDelegate协议中的,第一个就是反馈连接直播结果的。正常情况下,在正确设置了代理之后调用了connectBroadcastWithConnectInfo:方法后就会触发这个代理,返回连接结果,在连接成功后就要尝试调用join方法加入到直播中。连接失败了有各种错误说明,如果你觉得不需要这么详细,可以在最后的case里做笼统的报错。第二个代理方法是相对与join方法的,反馈的是加入直播的结果。如果joinResult等于GSBroadcastJoinResultSuccess,就表示加入成功, userID 就是自己的用户ID ,rebooted参数表示这次连接是否是因为根服务器重启导致的(服务器上会记录直播中的某些状态,根服务器重启这些状态将会丢失,所以建议在本地记录自己的状态,比如自己的麦克风是否被打等,然后在重连成功的时候主动恢复)。这时,你如果查看PC的直播客户端,就会发现你已经是在直播中的用户了。
第四步:添加自己需要的代理,处理自己感兴趣的数据
在完成了第三步之后,你会发现虽然你已经加入了直播,但是什么也干不了,什么也看不了,这里我们以音频为例,介绍如何与直播端进行交互。
首先,我们需要设置音频相关的代理audioDelegate,在GSBroadcastManager中,不同的模块都有对应的代理,只有设置之后,才会收到相关模块的数据回调。
然后在相关回调中做相应的处理。
每个模块代理中都有一个返回模块初始化结果的代理。这里我们想要听到从直播客户端传来的声音,只需要在确认模块正确初始化后,打开喇叭就可以了。下面设置AVAudioSession的代码是为了让声音从扩音器中传播出来,默认是从听筒中传出。其他模块的处理方式也很类似,详见附带的Demo和文档。
第五步:退出直播
如果想要退出直播,主要的方法有两个。
调用 leaveAndShouldTerminateBroadcast:方法后,用户就会离开直播。当然之后你还可以调用join方法再进直播,布尔值参数的意思是,在离开直播后是否结束整个直播,如果你是直播的组织者,在组织者离开直播后可以结束整个直播,但是一般的直播参加者离开直播后不应该关闭整个直播。
这里还有一个invalidate方法,如果调用了这个方法,那将会断开与直播的连接,清理相应的资源,在调用了invalidate方法后再也无法靠调用join方法进入直播了,要重新从connect方法开始。
注意:sdk中除了invalidate方法,绝大部分GSBroadcastManager的方法都是有回调的,比如leaveAndShoudTermindateBroadcast:方法,会产生如下回调,最正确的做法是在方法的回调里去释放直播资源。
4 代码示例
参见RtSDKDemo,RtSDKDemo只是示范SDK中接口的使用方式,并不保证使用方式最符合用户的需求,请用户在充分理解SDK机制的前提下,根据自己的情况处理数据。对照搬RtSDKDemo代码引起的性能问题和其他非SDK bug,不负任何责任。
5 SDK功能详解
5.1 GSBroadcastManager直播管理类
5.1.1 初始化+(instancetype)sharedBroadcastManager
5.1.2 连接直播- (BOOL)connectBroadcastWithConnectInfo:(nonnull GSConnectInfo*)connectInfo;
5.1.3 加入直播- (BOOL)join;
5.1.4 离开直播- (BOOL)leaveAndShouldTerminateBroadcast:(BOOL)bTerminated;
5.1.5 设置直播状态
5.1.6 设置是否开启录制- (BOOL)setRecordingStatus:(GSBroadcastStatus)status;
5.1.7 获取直播运行时间- (unsigned int)broadcastRunningTime;
5.1.8 打开麦克风- (BOOL)activateUserMicrophone:(long long)userID;
5.1.9 关闭麦克风- (BOOL)inactivateUserMicrophone:(long long)userID;
5.1.10 打开指定用户摄像头- (BOOL)activateUserCamera:(long long)userID;
5.1.11 关闭指定用户摄像头- (BOOL)inactivateUserCamera:(long long)userID;
5.1.12 踢出用户- (BOOL)ejectUser:(long long)userID blockIP:(BOOL)block;
5.1.13 邀请web用户打开摄像头- (BOOL)inviteWebUser:(long long)userID toActivateMicrophone:(BOOL)bOn;
5.1.14 开始点名倒计时- (BOOL)checkinCountDownFrom:(int)number;
5.1.15 回应点名- (BOOL)checkin;
5.1.16 发送广播消息- (BOOL)publishRoomNotifyBroadcastMsg:(nonnull NSString*)msg;
5.1.17 举手- (BOOL)handUp:(nullable NSString*)extraData;
5.1.18 手放下- (BOOL)handDown;
5.1.19 获取可选网路- (nullable NSArray*)getIDCArray;
5.1.20 获取当前的网路- (nullable NSString*)currentIDC;
5.1.21 设置当前网路- (void)setCurrentIDC:(nonnull NSString*)ID;
5.1.22 重命名某个用户- (BOOL)renameUser:(long long)userID newName:(nonnull NSString*)newName;
5.1.23 停止插播- (BOOL)stopLod:(nonnull NSString*)lodID;
5.1.24 开始插播- (BOOL)startLod:(nonnull NSString*)lodID time:(unsigned int)time playTimes:(int)times;
5.1.25 选择插播播放时间- (BOOL)skipLod:(nonnull NSString*)lodID time:(unsigned int)time;
5.1.26 暂停插播- (BOOL)pauseLod:(nonnull NSString*)lodID;
5.1.27 添加插播- (BOOL)addLod:(nonnull NSString*)name url:(nonnull NSString*)url ;
5.1.28 移除插播- (BOOL)removeLod:(nonnull NSString*)lodID;
5.1.29 人数统计发送给web- (BOOL)pushUserQuantity2Web:(BOOL) bPush;
5.1.30 打电话- (BOOL)callPhone:(nonnull NSString *)phoneNumber;
5.1.31 取消打电话- (BOOL)cancelCalling:(nonnull NSString*)phoneNumber;
5.1.32 打开麦克风- (BOOL)activateMicrophone;
5.1.33 关闭麦克风- (BOOL)inactivateMicrophone;
5.1.34 打开Speaker- (BOOL)activateSpeaker;
5.1.35 关闭Speaker- (BOOL)inactivateSpeaker;
5.1.36 静音Speaker- (BOOL)muteSpeaker:(BOOL)bMute;
5.1.37 静音麦克风- (BOOL)muteMicrophone:(BOOL)bMute;
5.1.38 打开自己的摄像头- (BOOL)activateCamera:(BOOL)backCamera landscape:(BOOL)landscape;
5.1.39 关闭摄像头- (BOOL)inactivateCamera;
5.1.40 前后切换摄像头- (void)rotateCamera;
5.1.41 订阅视频- (BOOL)displayVideo:(long long)userID;
5.1.42 取消订阅- (BOOL)undisplayVideo:(long long)userID;
5.1.43 激活一路视频- (BOOL)setVideo:(long long)userID active:(BOOL)active;
5.1.44 设置水印- (void)setWatermarkImage:(UIImageView*_Nullable)imageview;
5.1.45 关闭桌面共享- (BOOL)closeDesktopShare;
5.1.46 打开文档-(unsigned int)publishDocOpen:(nullable NSString*)docFileName;
5.1.47 打开服务端文档-(BOOL) publishDocRemoteOpen:(nullable NSString*)docFileName description:(nullable NSString *)description;
5.1.48 新建白板-(BOOL)publishDocNewWhiteboard:(NSString*)docFileName createOnce:(BOOL)createOnce;
5.1.49 跳转指定页-(BOOL) publishDocGotoPage:(unsigned int)docId pageId:(unsigned int)pageId sync2other:(BOOL)sync2other;
5.1.50 文档动画-(BOOL)publishDocGotoAnimation:(unsigned int)docId pageId:(unsigned int)pageId step:(int)step sync2other:(BOOL)sync2other;
5.1.51 上传文档到服务器-(BOOL)publishDocSaveToServer:(unsigned int)docId;
5.1.52 文档关闭-(BOOL)publishDocClose:(unsigned int)docId serverDocClose:(BOOL)serverDocClose;
5.1.53 开始上出文档-(BOOL)publishDocTranslateBegin:(unsigned int )fileHandle;
5.1.54 上传文档-(BOOL)publishDocTranslataData:(unsigned int )fileHandle pageHandle:(unsigned int )pageHandle pageWidth:(unsigned int )pageWidth pageHeight:(unsigned int )pageHeight bitCounts:(int)bitCounts titleText:(nullable NSString*)titleText fullText:(nullable NSString*)fullText aniCfg:(nullable NSString*)aniCfg pageComment:(nullable NSString*)pageComment data:(nullable NSData*)data;
5.1.55 上传文档结束-(BOOL)publishDocTranslateEnd:(unsigned int )fileHandle bSuccess:(BOOL)bSuccess;
5.1.56 获取当前文档-(nullable GSDocument*)publishDocGetCurrentDoc;
5.1.57 发送私聊- (BOOL)sendMessage:(nonnull GSChatMessage*)msg toUser:(long long)userID;
5.1.58 发送聊天给嘉宾- (BOOL)sendMessageToPanelist:(nonnull GSChatMessage*)msg;
5.1.59 发送公聊- (BOOL)sendMessageToPublic:(nonnull GSChatMessage*)msg;
5.1.60 设置聊天权限- (BOOL)setUser:(long long)userID chatEnabled:(BOOL)enabled;
5.1.61 删除用户的聊天- (BOOL)ChatSendCensorMsgWithUserID:(long long)userID ;
5.1.62 删除某条消息- (BOOL)ChatSendCensorMsgWithMsgID:(NSString*)msgID;
5.1.63 提问- (BOOL)askQuestion:(nonnull NSString*)questionContent;
5.1.64 回答问题- (BOOL)answerQuestion:(nonnull NSString*)questionID answer:(nonnull NSString*)answerContent;
5.1.65 发布问题- (BOOL)setQuestion:(nonnull NSString*)questionID publish:(BOOL)isPublished;
5.1.66 设置自动发布- (BOOL)qaSetState:(BOOL)isbAutoPushQuestion bAutoPublishQuestion:(BOOL)isbAutoPublishQuestion bQAEnable:(BOOL)isbQAEnable;
5.1.67 推送问题给嘉宾- (BOOL)qaPush2Panelist:(nonnull NSString*)questionID ;
5.1.68 推送问题给某个嘉宾- (BOOL)qaAssign2Panelist:(nonnull NSString*)questionID userID:(long long)userID;
5.1.69 设置语音回复- (BOOL)qaSetReplyByVoice:(nonnull NSString*)questionID replyByVoice:(BOOL)bReplyByVoice;
5.1.70 正在语音回复- (BOOL)qaNowReplyingByVoice:(nonnull NSString*)questionID bNowReplying:(BOOL)bNowReplying ;
5.1.71 提交投票(问卷)- (BOOL)submitInvestigation:(nonnull NSString*)investigationID answers:(nonnull NSArray*)answersArray;
5.1.72 发布问卷- (BOOL)publishInvestigation:(nonnull NSString*)invesID forceAnswer:(BOOL)bForce;
5.1.73 添加问卷- (BOOL)addInvestigation:(nonnull GSInvestigation*)inves;
5.1.74 删除问卷- (BOOL)deleteInvestigation:(nonnull NSString*)investigationID;
5.1.75 发布问卷- (BOOL)publishInvestigationResult:(nonnull NSString*)investigationID;
5.1.76 设置问卷截止事件- (BOOL)InvesDeadLine:(nonnull NSString *)invesID;
5.1.77 提交答题卡- (BOOL)cardSubmit:(nonnull NSArray*)itemIdArray;
5.1.78 答题卡结束- (BOOL)cardEnd;
5.1.79 发布答题卡答案- (BOOL)cardPublishResult:(nonnull NSArray*)rightItemArray;
5.1.80 发布答题卡- (BOOL)cardPublish:(int)type item:(nonnull NSArray*)item timeout:(int)timeout;
5.1.81 获取主讲人权限-(BOOL)roomGrantPresentor:(long long)userId;
5.1.82 创建随机红包- (nonnull NSString*)createHongbaoRandom:(unsigned)money count:(unsigned)count timeLimit:(unsigned)timeLimit fixed:(BOOL)fixed comment:(nullable NSString*)comment;
5.1.83 创建定向红包- (nonnull NSString*)createHongbaoForSomeBody:(unsigned)money timeLimit:(unsigned)timeLimit receiveUserID:(long long)receiveUserID receiveUserName:(nullable NSString*)receiveUserName comment:(nullable NSString*)comment;
5.1.84 抓红包- (BOOL)grabHongbao:(nonnull NSString*)hongbaoID;
5.1.85 查询哪些人获取了红包- (BOOL)queryHongbaoGrabList:(nonnull NSString*)hongbaoID;
5.1.86 查询本次会议发过的红包- (BOOL)queryHonbaoList;
5.1.87 查询我抢到过的红包- (BOOL)queryMyHongbaoGrabList;
5.1.88 查询红包余额- (BOOL)queryHonbaoBalance;
5.1.89 查询打赏总金额- (BOOL)tipQueryTotalAmount;
5.1.90 查询打赏列表- (BOOL)tipQueryTopList:(int)maxUserCount;
5.1.91 打赏- (void)rewardMoney:(unsigned)money comment:(NSString*)comment payType:(GSPayType)payType expireTime:(NSUInteger)expireTime extra:(NSString*)extra;
5.1.92 文件下载-(BOOL)ftDownloadFile:(unsigned int )fileId filePath:(NSString*)filePath ;
5.1.93 文件上传-(BOOL) ftUploadFile:(NSString*)filePath;
5.1.94 文件取消下载-(BOOL)ftCancelDownload:(unsigned int) fileId;
5.1.95 文件取消上传-(BOOL)ftCancelDownload:(unsigned int) fileId;
5.1.96 移除文件-(BOOL)ftRemoveFile:(unsigned int) fileId;
5.1.97 发布抢答- (BOOL)viesAnswerStart:(int)duration delaySec:(int)sec;
5.1.98 抢答结束- (BOOL)viesAnswerEnd;
5.1.99 抢答提交- (BOOL)viesAnswerSubmit;
5.1.100 查询用户- (nullable GSUserInfo*) queryUserInfoByID:(long long) userID;
5.1.101 查询自己的信息- (nullable GSUserInfo*) queryMyUserInfo;
5.1.102 设置接受问答模式@property (nonatomic, assign)GSQAHistoryMode qaHistoryMode;
5.1.103 文档视图@property (nullable, nonatomic, weak) GSDocView *documentView;
5.1.104 摄像头预览视图@property (nullable, nonatomic, weak) GSVideoView *videoView;
5.1.105 直播代理@property (nullable, nonatomic, weak)id<GSBroadcastRoomDelegate> broadcastRoomDelegate;
5.1.106 桌面共享代理@property (nullable, nonatomic, weak)id<GSBroadcastDesktopShareDelegate> desktopShareDelegate;
5.1.107 音频代理@property (nullable, nonatomic, weak)id<GSBroadcastAudioDelegate> audioDelegate;
5.1.108 视频代理@property (nullable, nonatomic, weak)id<GSBroadcastVideoDelegate> videoDelegate;
5.1.109 文档代理@property (nullable, nonatomic, weak)id<GSBroadcastDocumentDelegate> documentDelegate;
5.1.110 聊天代理@property (nullable, nonatomic, weak)id<GSBroadcastChatDelegate> chatDelegate;
5.1.111 问答代理@property (nullable, nonatomic, weak)id<GSBroadcastQaDelegate> qaDelegate;
5.1.112 投票(问卷)代理@property (nullable, nonatomic, weak)id<GSBroadcastInvestigationDelegate> investigationDelegate;
5.1.113 插播代理@property (nullable, nonatomic, weak)id<GSBroadcastLodDelegate> lodDelegate;
5.1.114 红包代理@property (nullable, nonatomic, weak)id<GSBroadcastHongbaoDelegate> hongbaoDelegate;
5.1.115 文件上传下载代理@property (nullable, nonatomic, weak)id<GSBroadcastFtDelegate> ftDelegate;
5.1.116 是否使用后置摄像头@property (nonatomic, assign) BOOL usingBackCamera;
5.1.117 是否横向采集@property (nonatomic, assign) BOOL cameraLandScape;
5.1.118 设置视频裁剪@property (nonatomic, assign) GSCropMode publishVideoCropMode;
5.1.119 设置硬编@property (nonatomic, assign) BOOL hardwareAccelerateEncodeSupport;
5.1.120 设置硬解@property (nonatomic, assign) BOOL hardwareAccelerateVideoDecodeSupport;
5.1.121 设置美颜@property (nonatomic, assign) BOOL beautifyFace;
5.1.122 设置强制使用HTTP请求@property (nonatomic, assign) BOOL httpAPIEnabled;
5.2 GSBroadcastRoomDelegate直播间事件回调
5.2.1 直播连接代理- (void)broadcastManager:(GSBroadcastManager*)manager didReceiveBroadcastConnectResult:(GSBroadcastConnectResult)connectResult;
触发此代理的GSBroadcastManager对象
connectResult ,表示直播连接结果
5.2.2 加入直播代理- (void)broadcastManager:(GSBroadcastManager*)manager didReceiveBroadcastJoinResult:(GSBroadcastJoinResult)joinResult selfUserID:(long long)userID rootSeverRebooted:(BOOL)rebooted;
joinResult表示加入直播结果
selfUserID 自己的用户ID
rebooted rebooted为YES,表示这次连接行为的产生是由于根服务器重启而导致的重连
5.2.3 自己离开直播代理- (void)broadcastManager:(GSBroadcastManager*)manager didSelfLeaveBroadcastFor:(GSBroadcastLeaveReason)leaveReason;
leaveReason 枚举值,表示离开直播的原因
5.2.4 直播重连代理- (void)broadcastManagerWillStartReconnect:(GSBroadcastManager*)manager;
5.2.5 锁住/解锁 房间代理- (void)broadcastManager:(GSBroadcastManager*)manager didSetLocked:(BOOL)locked;
locked 若值为YES,则房间被锁住,若值为NO,房间被解锁
5.2.6 - (void)broadcastManager:(GSBroadcastManager*)manager didSetStatus:(GSBroadcastStatus)status;
/**
* 直播状态改变代理,比如暂停或者恢复;如果是直播结束,将从
*
5.2.7 房间开启录制代理- (void)broadcastManager:(GSBroadcastManager*)manager didSetRecordingStatus:(GSBroadcastStatus)status;
5.2.8 获取房间信息代理- (void)broadcastManager:(GSBroadcastManager*)manager didReceiveBroadcastInfoKey:(NSString*)key value:(long long)value;
5.2.9 其他用户加入房间代理- (void)broadcastManager:(GSBroadcastManager*)manager didReceiveOtherUser:(GSUserInfo*)userInfo;
5.2.10 其他用户离开房间- (void)broadcastManager:(GSBroadcastManager*)manager didLoseOtherUser:(long long)userID;
5.2.11 用户信息更新代理- (void)broadcastManager:(GSBroadcastManager*)manager didUpdateUserInfo:(GSUserInfo*)userInfo updateFlag:(GSUserInfoUpdate)flag;
5.2.12 广播消息代理- (void)broadcastManager:(GSBroadcastManager*)manager broadcastMessage:(NSString *)message;
5.2.13 点名倒计时代理- (void)broadcastManager:(GSBroadcastManager*)manager checkinRequestCountingDownFrom:(NSInteger)number;
5.2.14 收到用户回应点名代理- (void)broadcastManager:(GSBroadcastManager*)manager checkinRequestResponsedUser:(long long)userID;
5.2.15 举手代理- (void)broadcastManager:(GSBroadcastManager*)manager handUpUser:(long long)userID extraData:(NSString*)data;
5.2.16 取消举手- (void)broadcastManager:(GSBroadcastManager*)manager handDownUser:(long long)userID;
5.2.17 索取直播设置信息代理- (BOOL)broadcastManager:(GSBroadcastManager*)manager querySettingsInfoKey:(NSString*)key strValue:(NSString**)value;
5.2.18 索取直播设置信息代理- (BOOL)broadcastManager:(GSBroadcastManager*)manager querySettingsInfoKey:(NSString*)key numberValue:(int*)value;
5.2.19 直播简介 信息代理-(BOOL)broadcastManager:(GSBroadcastManager*)manager saveLiveIntroduceInfoDic:(NSDictionary*)liveIntroduceInfoDic;
5.2.20 保存直播设置信息代理- (BOOL)broadcastManager:(GSBroadcastManager*)manager saveSettingsInfoKey:(NSString*)key strValue:(NSString*)value;
5.2.21 保存直播设置信息代理- (BOOL)broadcastManager:(GSBroadcastManager*)manager saveSettingsInfoKey:(NSString*)key numberValue:(int)value;
5.2.22 程序升级提示代理- (void)broadcastManager:(GSBroadcastManager*)manager upgradedAppDownLoadUrl:(NSString*)urlStr;
5.2.23 网络状态报告代理- (void)broadcastManager:(GSBroadcastManager*)manager networkStatus:(Byte)level;
最好的状态为100, 最差的状态为0(接近断网), 小于50都为较差;
5.2.24 中奖代理- (void)broadcastManager:(GSBroadcastManager*)manager lotteryActionType:(GSLotteryActionType)type userNames:(NSString*)usernames;
5.2.25 设置采集比特率- (void)broadcastManager:(GSBroadcastManager *)manager didSetupCustomBitRate:(VTCompressionSessionRef)session;
5.2.26 编码失败- (void)broadcastManagerEncodeError:(GSBroadcastManager *)manager;
5.2.27 直播间是否有接入电话的功能- (void)broadcastManager:(GSBroadcastManager*)manager phoneServiceStatus:(BOOL)enabled;
5.2.28 拨打电话结果- (void)broadcastManager:(GSBroadcastManager*)manager phoneNumber:(NSString*)phoneNumber reason: (int) reason status:(int)status;
phoneNumber 呼叫的号码
reason的值为3 表示呼叫成功
status 在reason的值不等于3的情况下,status表示呼叫失败的具体原因: 0-其他原因;1-被主持人挂断;2-参会人主动挂断; 3-电话未接通;
4-占线; 7-会议人数已满;8-会议室已上锁;9-不允许外呼
5.3 GSBroadcastVideoDelegate视频事件回调
5.3.1 视频模块初始化反馈代理- (void)broadcastManager:(GSBroadcastManager*)manager didReceiveVideoModuleInitResult:(BOOL)result;
5.3.2 摄像头或插播视频每一帧的数据代理- (void)OnVideoData4Render:(long long) userId width: (int) nWidth nHeight:(int) nHeight frameFormat:( unsigned int) dwFrameFormat displayRatio: (float) fDisplayRatio data:( void*) pData len:(int) iLen;
5.3.3 某个用户加入视频- (void)broadcastManager:(GSBroadcastManager*)manager didUserJoinVideo:(GSUserInfo*)userInfo;
5.3.4 某个用户退出视频- (void)broadcastManager:(GSBroadcastManager*)manager didUserQuitVideo:(long long)userID;
5.3.5 摄像头是否可用代理- (void)broadcastManager:(GSBroadcastManager*)manager isCameraAvailable:(BOOL)isAvailable;
5.3.6 摄像头打开代理- (void)broadcastManagerDidActivateCamera:(GSBroadcastManager*)manager;
5.3.7 摄像头关闭代理- (void)broadcastManagerDidInactivateCamera:(GSBroadcastManager*)manager;
5.3.8 摄像头或插播视频播放代理- (void)broadcastManager:(GSBroadcastManager*)manager didDisplayVideo:(GSUserInfo*)userInfo;
5.3.9 摄像头或插播视频关闭播放代理- (void)broadcastManager:(GSBroadcastManager*)manager didUndisplayVideo:(long long)userID;
5.3.10 某一路摄像头或插播视频的激活状态代理- (void)broadcastManager:(GSBroadcastManager*)manager didSetVideo:(GSUserInfo*)userInfo active:(BOOL)active;
5.3.11 手机摄像头开始采集数据- (BOOL)broadcastManagerDidStartCaptureVideo:(GSBroadcastManager*)manager;
5.3.12 手机摄像头停止采集数据- (void)broadcastManagerDidStopCaptureVideo:(GSBroadcastManager*)manager;
5.4 GSBroadcastChatDelegate聊天回调
5.4.1 聊天模块连接代理- (void)broadcastManager:(GSBroadcastManager*)broadcastManager didReceiveChatModuleInitResult:(BOOL)result;
5.4.2 收到私人聊天代理- (void)broadcastManager:(GSBroadcastManager*)broadcastManager didReceivePrivateMessage:(GSChatMessage*)msg fromUser:(GSUserInfo*)user;
5.4.3 收到公共聊天代理- (void)broadcastManager:(GSBroadcastManager*)broadcastManager didReceivePublicMessage:(GSChatMessage*)msg fromUser:(GSUserInfo*)user;
5.4.4 收到嘉宾聊天代理- (void)broadcastManager:(GSBroadcastManager*)broadcastManager didReceivePanelistMessage:(GSChatMessage*)msg fromUser:(GSUserInfo*)user;
5.4.5 禁止或允许聊天/问答 状态改变代理- (void)broadcastManager:(GSBroadcastManager*)broadcastManager didSetChattingEnabled:(BOOL)enabled;
5.4.6 聊天审核- (void)broadcastManager:(GSBroadcastManager*)broadcastManager didChatCensorByUserID:(long long)userId;
聊天审核以后,根据用户id删除聊天消息
5.4.7 聊天审核以 (void)broadcastManager:(GSBroadcastManager*)broadcastManager didChatCensorByMsgID:(NSString*)msgID;
根据聊天的消息id删除聊天消息
5.5 GSBroadcastQaDelegate问答回调
5.5.1 问答模块初始化代理- (void)broadcastManager:(GSBroadcastManager*)broadcastManager didReceiveQaModuleInitResult:(BOOL)result;
5.5.2 问答设置状态改变代理- (void)broadcastManager:(GSBroadcastManager*)broadcastManager didSetQaEnabled:(BOOL)enabled QuestionAutoDispatch:(BOOL)autoDispatch QuestionAutoPublish:(BOOL)autoPublish;
5.5.3 问题的状态改变代理- (void)broadcastManager:(GSBroadcastManager*)broadcastManager question:(GSQuestion*)question updatesOnStatus:(GSQaStatus)status;
5.6 GSBroadcastInvestigationDelegate问答回调
5.6.1 问卷调查模块初始化结果- (void)broadcastManager:(GSBroadcastManager*)broadcastManager didReceiveInvestigationModuleInitResult:(BOOL)result;
5.6.2 添加问卷调查代理- (void)broadcastManager:(GSBroadcastManager*)broadcastManager didAddNewInvestigation:(GSInvestigation*)investigation;
5.6.3 删除一项问卷调查- (void)broadcastManager:(GSBroadcastManager*)broadcastManager didRemoveInvestigation:(GSInvestigation*)investigation;
5.6.4 发布一项问卷调查- (void)broadcastManager:(GSBroadcastManager*)broadcastManager didPublishInvestigation:(GSInvestigation*)investigation;
5.6.5 公布一项问卷调查的结果- (void)broadcastManager:(GSBroadcastManager*)broadcastManager didPublishInvestigationResult:(GSInvestigation*)investigation;
5.6.6 提交一项问卷调查- (void)broadcastManager:(GSBroadcastManager*)broadcastManager didSubmitInvestigation:(GSInvestigation*)investigation;
5.6.7 问卷调查截止- (void)broadcastManager:(GSBroadcastManager *)broadcastManager didTerminateInvestigation:(GSInvestigation *)investigation;
5.6.8 发送问卷调查链接- (void)broadcastManager:(GSBroadcastManager *)broadcastManager didPostInvestigationURL:(NSString *)investigationURL;
5.6.9 发布答题卡- (void)broadcastManager:(GSBroadcastManager *)broadcastManager didOnCardPublish:(NSDictionary *)options type:(GSCardQuestionType)questionType;
5.6.10 答题卡结果发布- (void)broadcastManager:(GSBroadcastManager *)broadcastManager didOnCardResultPublish:(NSMutableArray *)options type:(GSCardQuestionType)questionType totalSubmitted:(int)totalSubmitted;
5.6.11 答题卡提交- (void)broadcastManager:(GSBroadcastManager *)broadcastManager didOnCardSubmit:(NSArray *)itemIds userId:(long long)userId;
5.6.12 答题卡结束- (void)broadcastManager_didOnCardEnd:(GSBroadcastManager *)broadcastManager ;
5.6.13 抢答开始- (void)broadcastManager:(GSBroadcastManager *)broadcastManager OnVieToAnswerFirstStart:(int)nDurationSec delaySec:(int)nDelaySec;
5.6.14 抢答结束- (void)broadcastManagerOnVieToAnswerFirstEnd:(GSBroadcastManager *)broadcastManager;
5.6.15 抢答结果- (void)broadcastManager:(GSBroadcastManager *)broadcastManager OnVieToAnswerFirstSubmit:(long long)userID userName:(NSString*)strUserName;
5.7 GSBroadcastDesktopShareDelegate桌面共享回调
5.7.1 桌面共享模块初始化反馈代理- (void)broadcastManager:(GSBroadcastManager*)manager didReceiveDesktopShareModuleInitResult:(BOOL)result;
5.7.2 桌面共享每一帧的数据- (void)broadcastManager:(GSBroadcastManager*)manager renderDesktopShareFrame:(UIImage*)videoFrame;
5.7.3 开启桌面共享代理- (void)broadcastManager:(GSBroadcastManager*)manager didActivateDesktopShare:(long long)userID;
5.7.4 桌面共享关闭代理-(void)broadcastManagerDidInactivateDesktopShare:(GSBroadcastManager*)manager;
5.8 GSBroadcastHongbaoDelegate红包回调
5.8.1 创建红包结果回调- (void)broadcastManager:(GSBroadcastManager*) broadcastManager onHongbaoCreate:(GSHongbaoCreateResult)result strId:(NSString*)strid;
5.8.2 抢红包结果回调- (void)broadcastManager:(GSBroadcastManager*) broadcastManager onHongbaoGrabHongbao:(GSHongbaoGrabResult)result strId:(NSString*)strid money:(unsigned)money;
* @param result 抢红包结果
* @param strid 红包ID
* @param money 抢到的金额
5.8.3 查询会议里所有的红包列表- (void)broadcastManager:(GSBroadcastManager*)broadcastManager onHongbaoQueryHongbaoList:(NSArray*)hongbaoArray;
5.8.4 查询抢了这个红包的所有人- (void)broadcastManager:(GSBroadcastManager*) broadcastManager onHongbaoQueryHongbaoGrabList:(NSArray*)grabs strId:(NSString*)strid;
5.8.5 查询自己抢的所有红包- (void)broadcastManager:(GSBroadcastManager*) broadcastManager onHongbaoQuerySelfGrabList:(NSArray*)grabs;
5.8.6 查询余额- (void)broadcastManager:(GSBroadcastManager*) broadcastManager onHongbaoQueryBalance:(unsigned)balance ok:(BOOL)ok;
5.8.7 出现红包回调- (void)broadcastManager:(GSBroadcastManager*) broadcastManager onHongbaoComingNotify:(GSHongbaoInfo*)hongbaoInfo;
5.8.8 红包被抢回调- (void)broadcastManager:(GSBroadcastManager*) broadcastManager onHongbaoGrabbedNotify:(NSString*)strid grabInfo:(GSGrabInfo*)grabInfo type:(int)hongbaoType;
5.8.9 - (void)broadcastManager:(GSBroadcastManager*) broadcastManager onTipQueryTotalAmount:(unsigned int)dwAmount result:(int)result;
5.8.10 - (void)broadcastManager:(GSBroadcastManager*) broadcastManager onTipQueryTopList:(NSArray*)TipInfo result:(int)result;
//打赏回调接口 返回打赏类 GSTipInfo or GSTipInfoEx
5.8.11 打赏回调接口 - (void)broadcastManager:(GSBroadcastManager*) broadcastManager onTipComingNotify:(GSTipInfo*) tip totalAmount:(int)totalAmount;
5.8.12 - (void)broadcastManager:(GSBroadcastManager*) broadcastManager onTipComingNotifyEx:(GSTipInfoEx*) tip totalAmount:(int)totalAmount;
/**
打赏返回的参数,用于使用支付宝或者微信支付的sdk
@param playerManager 调用该代理的直播管理实例
@param rewardDic 使用支付宝或者微信支付所需的参数
*/
5.8.13 - (void)broadcastManager:(GSBroadcastManager*) broadcastManager didReceiveRewardDic:(NSDictionary*)rewardDic error:(NSError*)error;
5.9 GSBroadcastLodDelegate插播回调
5.9.1 插播初始化- (void) OnLodJoinConfirm:(BOOL) bRet;
5.9.2 插播失败- (void) OnLodFailed:(NSString*)strid;
5.9.3 插播开始- (void) OnLodStart:(GSLodItem*) pLiveodItem;
5.9.4 插播快进- (void) OnLodSkip:(GSLodItem*) pLiveodItem;
5.9.5 插播暂停- (void) OnLodPause:(GSLodItem*) pLiveodItem;
5.9.6 插播停止- (void) OnLodStop:(GSLodItem*) pLiveodItem;
5.9.7 插播正在播放- (void) OnLodPlaying:(GSLodItem*) pLiveodItem;
5.9.8 插播添加- (void) OnLodResourceAdd:(GSLodItem*) lodData;
5.9.9 插播移除- (void) OnLodResourceRemove:( NSString* ) strid;
5.10 GSConnectInfo直播参数
5.10.1 域名(必填)@property(copy, nonatomic)NSString *domain;
5.10.2 WebcastID (必填)@property(copy, nonatomic)NSString *webcastID;
WebcastID 和 RoomNumber只需要填写一个,如果都写了,将优先使用WebcastID
5.10.3 房间号@property(strong, nonatomic)NSString *roomNumber;
WebcastID 和 RoomNumber只需要填写一个,如果都写了,将优先使用WebcastID
5.10.4 服务类型(必填)@property(assign, nonatomic)GSBroadcastServiceType serviceType;
5.10.5 直播中的昵称(必填)@property(copy, nonatomic)NSString *nickName;
5.10.6 加入直播的密码(必填)@property(copy, nonatomic)NSString *watchPassword;
5.10.7 登录网站用户名@property(copy, nonatomic)NSString *loginName;
如果直播后台设置为必须登录才能观看,登录名和登录密码才会起作用
5.10.8 登录网站的密码@property(copy, nonatomic)NSString *loginPassword;
如果直播后台设置为必须登录才能观看,登录名和登录密码才会起作用
5.10.9 自定义用户ID@property(assign, nonatomic)long long customUserID;
自定义userID; userID系统会分配,若无特殊需求,一般不需要设置此参数,自定义userID 大于1000000000(十亿)才生效,若小于十亿,将仍然使用系统分配ID
5.10.10 允许何种身份进入直播@property(assign, nonatomic)GSBroadcastPermission joinPermission;
5.10.11 是否是用老接口@property (nonatomic, assign) BOOL oldVersion;
5.10.12 第三方验证K值@property (nonatomic, copy) NSString *thirdToken;
5.10.13 用户额外数据@property (nonatomic, copy) NSString *userData;
6 常见的问题
6.1 我该如何填写参数,使Demo正确运行?
请开发人员联系负责和我公司交接直播端(网页入口,启动的PC客户端)的同事,让他提供对应的参数信息或者用websdk 从服务器获取带有参数的json数据。
6.2 为什么视频全屏之后不会充满整个屏幕,为什么视频边上有留白?
由于视频原数据有一定的宽高比,而且该宽高比在绝大多数情况下和手机屏幕的宽高比不相等,为了保证视频在显示的时候不被拉伸而导致画面扭曲,一般会根据视频原数据本身的宽高比进行计算,得出最大的并且具有正确宽高比的视频显示区域。
假如,一个视频数据的宽是320,高为240, 你创建的用于渲染该视频的videoView的宽为320,高为300,那么显然,用这样的videoView去渲染视频,在视频的上下两边会有留白。如果强行实现所谓的全屏,那就会产生下面两种结果中的一种:
- 画面部分会被截取,在这个例子中,显然是视频的横向两边会被截掉
- 画面没有被截取,但是会被拉伸。
如果想实现全屏应该怎么办?
- 尽量保证视频的宽高比和videoView的宽高比一致
- 终端设备种类多,宽高比有很多种的情况下,要考虑适当允许视频被截取
6.3 如何设置在放视频的时候不自动锁屏?
这个需要在上层处理,和SDK并无关系。
请参考:http://stackoverflow.com/questions/9904306/disable-automatic-screen-lock-in-ios-5-1
6.4 如果统计直播中的人数
自己定一个变量,在收到一次 didReceiveOtherUser的时候 增1,在收到didLoseOtherUser的时候减1就是当前直播里的总人数
6.5 如果获取直播的状态,比如,直播暂停,直播结束
加入直播时,默认的状态都要设置为直播未开始,然后根据此接口返回的状态修改,直播结束的状态不会从这里来,因为直播结束自己会被踢出直播间,所以会从
这个接口返回,reason为直播结束。
6.6 如果获取直播时间
自己起一个定时器,可以每秒钟执行一次获取直播时间
6.7RtSDK和第三方库的冲突
因为RtSDK会用到一些经典的音视频开源库(比如ffmpeg,webrtc),以及Objective-C的语言特性, 如果你的工程中包含两个以上音视频相关的第三方sdk 很可能会产生冲突,这些冲突展现出来的形式有一下几种:
- 编译不过,报错
- 运行时崩溃
这些冲突需要提供sdk的双方配合解决,不排除有解决不了的或者解决代价太大的冲突,所以请尽量不要在同一个工程里使用两个音视频相关的sdk。
6.8如何设置发布视频的分辨率 和 码率
分辨率在收到如下代理时设置
key 的值分别为save.video.width 和 save.video.height
当前分辨率支持352 X 288, 640 X 480, 1280 X 720,注意设置分辨率的时候,手机采集时的状态,横屏采集和竖屏采集宽高刚好相反。
码率:
在收到此代理时设置,可自行调节,码率大视频更清晰,但更占带宽,自行取舍。
6.9如何发送聊天,发送表情,显示聊天表情
聊天对象的结构比较简单
- richText为
<SPAN style="FONT-SIZE: 10pt; FONT-WEIGHT: normal; COLOR: #000000; FONT-STYLE: normal"><IMG src="emotionemotion.smile.gif" custom="false">大家好!</SPAN>
richtext中消息内容前后要用固定的标签包括:
<SPAN style="FONT-SIZE: 10pt; FONT-WEIGHT: normal; COLOR: #000000; FONT-STYLE: normal">消息内容</SPAN>
<IMG src="emotionemotion.smile.gif" custom="false"> 为微笑的表情,每个表情都有不同的src字段,这个对应关系可以在RtSDK.bundle 的plist文件资源中找到。
- text 为
<span>【你好】大家好!</span>
text的聊天内容前后要加上<span></span>,你好的表情对应【你好】,对应关系从RtSDK.bundle 的plist文件资源中找到。
text字段是为了兼容老版本的web端
接收显示表情也是按照这个规则去解析,然后用图文混排的方式显示,幸运的是可以找到很多第三方库,比如YYText。