1. SDK概述

亲加视频直播SDK是一套完整的视频直播SDK产品,含有以下五个模块:

    • GotyeLiveCore
    • 亲加视频直播SDK的基础模块(#gotyelivecore),包含了各个模块所必需的接口实现,在集成其它模块之前都需要先把GoteLiveCore集成到项目中。
    • GotyeLiveChat
    • 聊天室模块(#gotyelivechat)实现了用户在聊天室内收发消息的功能
    • GotyeLivePlayer
    • 播放器模块(#gotyeliveplayer)实现了在手机端观看视频直播的功能
    • GotyeLivePublisher
    • 直播模块(#gotyelivepublisher)实现了在手机端进行视频直播的功能
    • GotyeLivePeerConnection
    • 连麦功能模块(#GotyeLivePeerConnection)实现了主播与用户实时视频聊天直播功能

除了GotyeLiveCore模块是必须的之外,其余模块开发者可以根据实际需求进行选择。文档接下来的部分将会对各个模块的进行详细说明。

由于SDK是静态库,为方便开发者使用,我们将 armv7 i386 x86_64 arm64 平台的静态库合并成一个 Fat Library ,并且支持了bitcode,所以导致整个 SDK 比较大。但实际编译时会根据调用功能多少增加 ipa 文件大小,实测大约只会增加2-3M左右。

目前SDK最低只支持iOS 7.0

2. 集成步骤

  1. 集成基础模块(GotyeLiveCore)
  2. 集成相应模块
    集成步骤

3. GotyeLiveCore集成

GotyeLiveCore 亲加视频直播SDK的基础模块,包含了各个模块所必需的接口实现,在集成其它模块之前都需要先把GoteLiveCoreSDK集成到项目中。

3.1集成步骤

  1. libGotyeLiveCore.a以及同级目录下的include文件夹导入到工程中。
  2. 添加依赖库
    • MobileCoreServices.framework
    • SystemConfiguration.framework
    • libicucore.tbd(XCode6及以下版本后缀名为dyilb)
  3. 在 Other Linker Flags 中添加-ObjC

3.2 初始化SDK

  1. 在需要使用的地方导入头文件GLCore.h
  2. 添加SDK初始化方法

    [GLCore registerWithAppKey:@"后台账号appkey" 
                  accessSecret:@"后台账号accessSecret" 
                     companyId:@"后台账号公司唯一标示"];
    

初始化只需要在程序启动时初始化一次即可。

3.3 创建session

GLRoomSession *roomSession = [GLCore sessionWithType:GLRoomSessionTypeDefault 
                                              roomId:roomId 
                                            password:pwd 
                                            nickname:nickname 
                                         bindAccount:nil];
//也可以使用下面这种方式创建
/*
GLRoomSession *roomSession = [GLRoomSession alloc]  initWithType:GLRoomSessionTypeDefault 
                                                        roomId:roomId 
                                                      password:pwd 
                                                      nickname:nickname 
                                                   bindAccount:nil]];
*/

//创建后需要调用session的验证接口进行验证
[roomSession authOnSuccess:^(GLAuthToken *authToken) {
    //验证成功    
} failure:^(NSError *error) {
    //验证失败
}];

注:如无特别说明,回调的block都是在主线程中运行的。

3.4 销毁session

当用户退出房间时,不再需要session的时候,应该调用销毁session的接口释放资源。

[GLCore destroySession:roomSession];

3.5 查询直播详情

在SDK中,一个session是对应一个直播房间的,当验证通过后,可以通过session获取到直播房间的信息。

[_roomSession getLiveContextOnSuccess:^(GLLiveContext *liveContext) {
    //查询成功
} failure:^(NSError *error) {
    //查询失败
}];

返回的直播详情中一共有三个信息,1、当前直播间的观看人数;2、当前直播间的直播状态;3、当前直播停止状态;

@interface GLLiveContext : NSObject
/**
 *  当前直播状态。1-直播中 0-直播停止
 */
@property (nonatomic, assign) NSInteger recordingStatus;
/**
 *  当前播放视频人数
 */
@property (nonatomic, assign) NSInteger playUserCount;

  /**
    *  当前直播停止状态。0-异常停止 1-正常停止 2-重连时停止 3-手机来电 4-用户自定义停止状态
    */
  @property (nonatomic, assign) NSInteger stopType;
@end

3.6 查询H5地址

每个直播间中还配备了对应的H5地址,包括直播观看地址以及课件地址。

@interface GLClientUrl : NSObject

/**
 *  直播观看地址。可用于分享
 */
@property (nonatomic, copy) NSString * educVisitorUrl;
/**
 *  课件观看端页面地址
 */
@property (nonatomic, copy) NSString * modVisitorShareUrl;

@end

//查询H5地址
[_roomSession getClientUrlsOnSuccess:^(GLClientUrl *clientUrl) {
    //查询成功
} failure:^(NSError *error) {
    //查询失败
}];

3.7 错误码说明

错误码描述详见 GLCoreErrorCode.h

错误码 | 描述
----- | -----
401 | 验证失败,或者是没有验证成功的情况下调用了别的接口
-101 | JSON解析出错
-102 | 网络错误
-106 | 超时
-999 | 未知错误

4 聊天模块集成

GotyeLiveChat为聊天模块。实现了用户在聊天室内收发消息的功能。

4.1 集成步骤

  1. 集成基础模块(#gotyelivecore)(如已集成略过这一步)
  2. libGotyeLiveChat.a以及同级目录下的include文件夹导入到工程中。

4.2 初始化SDK

聊天室是与直播间绑定的,因此创建聊天室session对象时需要一个GLRoomSession(#roomsession)

_chatSession = [[GLChatSession alloc]initWithSession:_roomSession];
//添加回调监听
[_chatSession addObserver:self];

4.3 登录聊天室

调用

//防止retain循环导致内存不释放
__weak typeof(_chatSession) weakRef = _chatSession;
__weak typeof(self) weakSelf = self;

[_chatSession loginOnSuccess:^(NSString *account, NSString *nickname) {
    __strong typeof(self) strongSelf = weakSelf;
    if (strongSelf) {
        [strongSelf->_chatContentView addCellWithName:@"连接聊天服务器成功" comment:@""];
    }
    //这个消息发送是为了兼容亲加自己的H5观看页面,表示进入聊天室的通知。
    [weakRef sendNotify:@"enter" extra:nil success:nil failure:nil];
} failure:^(NSError *error) {
    __strong typeof(self) strongSelf = weakSelf;
    if (strongSelf) {
        [strongSelf->_chatContentView addCellWithName:@"连接聊天服务器失败"  comment:@""];
   }
}];

如果登录失败的话,SDK不会自动重连。但是如果在登录成功的情况下因为网络的问题或者其它问题导致的掉线,SDK底层会自动进行重连,直到登录成功或者开发者主动调用了 [_chatSession logout]

4.4 发送消息

SDK目前只支持纯文本内容的发送,但是消息的格式是可以自定义的,换句话说,只要使用合适的格式,开发者是很容易就能够实现红包、点赞诸如此类的功能的。

@interface GLChatMessage : NSObject

/**
 *  接收者ID。当消息是聊天室消息时,该值为空
 */
@property (nonatomic, readonly) NSString * recvId;
/**
 *  接收者昵称。当消息是聊天室消息时,该值为空
 */
@property (nonatomic, readonly) NSString * recvName;
/**
 *  消息的具体内容
 */
@property (nonatomic, copy) NSString * text;
/**
 *  发送者ID
 */
@property (nonatomic, readonly) NSString * sendId;
/**
 *  发送者昵称
 */
@property (nonatomic, readonly) NSString * sendName;
/**
 *  消息额外字段
 */
@property (nonatomic, assign) NSString * extra;
/**
 *  消息类型
 */
@property (nonatomic, assign) NSInteger type;
/**
 *  消息状态
 */
@property (nonatomic, readonly) GLChatMessageStatus status;

@end

GLChatMessage *msg = [[GLChatMessage alloc]init];
//下面的几个属性都是透传的,SDK不会做任何修改
msg.type = 1;           
msg.text = @"text";
msg.extra = @"extra";

[_chatSession sendMessage:msg success:^{
    //发送成功
} failure:^(NSError *error) {
    //发送失败
}];

如果只是简单的发送文本消息,可以调用以下接口:

[_chatSession sendText:@"发送文本" extra:nil success:^{
    //发送成功
} failure:^(NSError *error) {
    //发送失败
}];

4.5 获取聊天室人数

需要登录成功才能获取当前聊天室人数

[_chatSession getRoomMemberCountOnSuccess:^(NSInteger count) {
    //count即为当前聊天室人数
} failure:^(NSError *error) {
    //获取失败
}];

4.6 退出聊天室

只需要简单调用

[_chatSession logout];

就可以断开与服务器的连接,不再接收任何消息。

需要注意的是,调用logout之后,SDK会移除所有的观察者对象。换句话说,如果logout之后需要复用该对象,需要重新调用addObserver才能收到回调。

4.7 回调通知

登录成功后,聊天室相关的状态通知都是通过 GLChatObserver 以回调的方式通知调用者的。

@protocol GLChatObserver <NSObject>

@optional

/**
 *  收到消息时的回调
 *
 *  @param chatSession   对应的聊天session
 *  @param msg           收到消息的具体内容
 */
    - (void)chatClient:(GLChatSession *)chatSession didReceiveMessage:  (GLChatMessage *)msg;

/**
 *  与服务器失去连接时的回调
 *  @param chatSession   对应的聊天session
 *
 */
    - (void)chatClientDidDisconnected:(GLChatSession *)chatSession;

/**
 *  正在尝试重新连接服务器时的回调(当与服务器失去连接时,API会自动进行重连)。
 *  @param chatSession   对应的聊天session
 */
    - (void)chatClientReconnecting:(GLChatSession *)chatSession;

/**
 *  重新登录成功时的回调
 *  @param chatSession   对应的聊天session
 */
    - (void)chatClientReLoginSuccess:(GLChatSession *)chatSession;

/**
 *  重新登录失败时的回调(这种情况一般是由于密码错误或者token过期之类的原因,导致认证失败)。
 *
 *  @param chatSession   对应的聊天session
 *  @param error         重登失败的具体错误
 */
    - (void)chatClient:(GLChatSession *)chatSession reLoginFailed:(NSError *)error;

/**
 *  账号在别处登录,   本地被强制踢下线的回调
 *  @param chatSession   对应的聊天session
 */
    - (void)chatClientDidForceLogout:(GLChatSession *)chatSession;

@end

4.8 错误码说明

错误码描述详见 GLChatErrorCode.h

错误码 | 描述
----- | -----
300 | 失败
401 | 验证失败
403 | 无效角色,只有聊天室role可以登录
500 | 系统异常
1001 | 无操作权限
1003 | 已被禁言
1005 | 消息内容和附加字段都为空
1007 | 无效TARGET_ID
1009 | 已经被禁止登陆
-101 | 数据解析出错
-102 | 网络错误
-103 | 当前没有登录
-104 | 已经登录
-105 | 获取服务器地址失败
-106 | 超时

5. 播放器集成

GotyeLivePlayer为播放器模块。实现了在聊天室内观看当前直播视频的功能。

5.1 集成步骤

  1. 集成基础模块(#gotyelivecore)(如已集成略过这一步)
  2. 将libGotyeLivePlayer.a以及同级目录下的include文件夹导入到工程中
  3. 添加依赖库 * Accelerate.framework * AudioToolbox.framework

5.2 初始化SDK

与直播房间绑定:(直播间的创建请参考server端接口)

_player = [[GLRoomPlayer alloc]initWithRoomSession:_roomSession];
//设置回调
_player.delegate = self;

5.3 开始播放

SDK会验证当前roomSession的有效性,如果没有验证成功,播放会失败;如果当前直播间没有直播,播放也会失败,但是SDK会去定时获取直播状态,当检测到直播开始后,会自动开始播放。

[_player playWithView:_videoView];

GLPlayerKit.delegate = self;
[GLPlayerKitplayWithView:显示视频的view];

5.4 重连

不管是哪种模式,如果播放失败了或者播放过程中出现了什么问题导致播放中断,SDK都会自动进行重连(直播间结束直播了除外),直到重新播放成功或者调用了 [_player stop] 为止。

目前SDK的设定是如果当前正在播放,app切换到后台时播放会自动停止,切换回前台后自动开始重连(直播间结束直播了除外)。

5.5 选择视频清晰度

可以调用以下接口选择播放视频的清晰度

[_player playWithView:_videoView quality:GLVideoQualityHigh];

默认情况下视频播放的清晰度是 GLVideoQualityOriginal ,也就是推流端发布的是什么清晰度的视频,观看端看到的就是什么清晰度。如果当前直播间的配置没有接口希望选择的清晰度,那么会由高到底选择一个最接近的清晰度进行播放。具体播放的清晰度可以通过判断 _player.videoQuality 的值得到。

播放过程中,也可以动态选择一个清晰度进行切换。切换的规则跟上面所说的一致。

//如果当前房间没有该清晰度的视频或者希望切换的清晰度与当前清晰度相等,那么返回NO。成功切换返回YES
if ([_player switchToQuality:videoQuality]) {
    [_presetBtn setTitle:title forState:UIControlStateNormal];
    [self showIndicator];
}

5.6 切换cdn播放地址

如果直播间配置了多cdn地址,那么在当前地址播放失败时,SDK默认情况下会在重连的时候尝试使用另一个播放地址进行播放,一直循环选择地址列表中的配置直到播放成功或者调用了 [_player stop] 为止。如果希望手动进行切换,可以通过设置

_player.autoSwitchPlayUrl = NO;

来禁用自动切换。并手动调用

//如果当前播放器是停止状态或者当前房间没有配置多cdn地址,那么返回NO。切换成功返回YES
[_player switchToNextPlayUrl];

来切换播放地址。

5.7 结束播放

当不需要继续监听直播间状态或者不需要播放的时候,记得调用停止播放的接口

[_player stop];

5.8 获取播放器状态

SDK提供了获取当前播放器的连接时间、播放码率、视频缓冲队列的大小、音频缓冲队列的大小以及播放延时的接口

/**
 *  播放器连接时间。每次连接成功后都会更新该时间,单位毫秒。
 */
@property (nonatomic, readonly) NSInteger connectionTime;
/**
 *  当前视频播放的码率。视频连接成功后1秒钟更新一次,单位kbps。
 */
@property (nonatomic, readonly) NSInteger bps;
/**
 *  当前视频播放的视频缓冲大小。1秒钟更新一次
 */
@property (nonatomic, readonly) NSInteger numOfVideoBuffer;
/**
 *  当前视频播放的音频缓冲大小。1秒钟更新一次
 */
@property (nonatomic, readonly) NSInteger numOfAudioBuffer;
/**
 *  当前视频延时,单位为毫秒,1秒钟更新一次。
 *  该延时的计算方法为,视频开始播放时记录一个本地时间,然后根据本地时钟得到的时长减去视频播放的时长,即为该延时。
 *  有可能为负值
 */
@property (nonatomic, readonly) NSInteger delay;

以上的信息是1秒钟更新一次,当有更新时回调 playerStatusDidUpdate: 会被调用。

5.9 设置静音

//YES表示静音,NO表示不静音
[_player setMute:YES];

设置静音后本地将听不到直播的声音。

5.10 设置播放视图的显示模式

默认情况下,视频的显示模式是 GLPlayerViewFillModeAspectRatio ,也就是保持比例居中,视频会按照比例放大直到撑满屏幕某一边为止。开发者也可以调用以下接口切换视频显示模式,这个接口的调用是实时生效的。

/**
 *  视频的显示模式
 */
typedef NS_ENUM(NSUInteger, GLPlayerViewFillMode) {
    /**
     *  保持比例居中。视频会按照比例放大直到撑满屏幕某一边为止。视频不会被截取,但屏幕可能会留空白
     */
    GLPlayerViewFillModeAspectRatio,
    /**
     *  保持比例撑满。视频会按照比例放大直到撑满屏幕为止。屏幕不留空白,但视频可能被截 取。
     */
    GLPlayerViewFillModeAspectFill
};

//选择显示模式
_playerView.fillMode = GLPlayerViewFillModeAspectFill;

5.11 接受连麦互动邀请

    /**
     *  接受视频互动邀请
     *
     *  @param success 成功回调
     *  @param failure 失败回调
     */
    - (void)acceptInvitationWithSuccess:(void(^)())success failure:(void(^)(NSError *error))failure;

5.12 拒绝连麦互动邀请

    /**
     *  拒绝视频互动邀请
     *
     */
    - (void)denyInvitation;

5.13 结束连麦互动

    /**
     *  结束视频连麦互动
     */
    - (void)endPeerConnection;

5.14 回调通知

@protocol GLPlayerDelegate <NSObject>

@optional

/**
 *  开始播放的回调
 *
 *  @param player 对应的播放器实例
 */
 - (void)playerDidConnect:(GLPlayer *)player;

/**
 *  停止播放的回调
 *
 *  @param player 对应的播放器实例
 */
 - (void)playerDidDisconnected:(GLPlayer *)player;

/**
 *  播放出现错误时的回调
 *
 *  @param error  错误的详细信息
 *  @param player 对应的播放器实例
 */
 - (void)player:(GLPlayer *)player onError:(NSError *)error;

/**
 *  播放器正在重新尝试连接服务器时的回调
 *
 *  @param player 对应的播放器实例
 */
 - (void)playerReconnecting:(GLPlayer *)player;

/** 
 *  开始缓冲的回调。这个回调表示当前没有数据可以进行播放,需要缓冲。
 *
 *  @param player 对应的播放器实例
 */
 - (void)playerBuffering:(GLPlayer *)player;

/**
 *  缓冲结束的回调。缓冲结束,播放器自动开始播放
 *
 *  @param player 对应的播放器实例
 */
 - (void)playerBufferCompleted:(GLPlayer *)player;

/**
 *  播放器状态更新的回调,1秒钟回调1次。包括bps、numOfVideoBuffer、  numOfAudioBuffer和delay属性的更新
 *
 *  @param player 对应的播放器实例
 */
 - (void)playerStatusDidUpdate:(GLPlayer *)player;

@end

关于直播状态的回调

@protocol GLRoomPlayerDelegate <GLPlayerDelegate>
@optional
/**
 *  直播结束的回调。
 *  如果GLPlayer的autoPlay属性为YES,那么在收到这个回调的时候SDK底层会自动调用播放  视频的接口尝试播放视频。
 *  如果为NO,那么需要开发者自行调用播放视频接口
 *
 *  @param player 对应的播放器实例
 */
 - (void)onLiveStop:(GLRoomPlayer *)player;

/**
 *  直播开始的回调
 *
 *  @param player 对应的播放器实例
 */
 - (void)onLiveStart:(GLRoomPlayer *)player;

@end

5.12 错误码说明

错误码描述详见 GLPlayerErrorCode.h

错误码 | 描述
----- | -----
401 | 验证失败
-101 | 获取直播状态失败
-102 | 网络错误
-103 | 获取直播url失败
-104 | 直播未开始

6. 发布端集成

GotyeLivePublisher为视频发布模块。实现了主播账号在聊天室内直播视频推流的功能。

6.1 集成步骤

  1. 集成基础模块(#gotyelivecore)(如已集成略过这一步)
  2. 将libGotyeLivePublisher.a以及同级目录下的include文件夹导入到工程中
  3. 添加依赖库
    • VideoToolbox.framework
    • libstdc++.tbd(XCode6及以下版本后缀名为dyilb)

6.2 初始化SDK

与直播间绑定

objc
 _publisher = [[GLRoomPublisher alloc]initWithSession:_roomSession];
 //设置回调
 _publisher.delegate = self;

6.3 开启预览

在推流之前,需要打开设备的摄像头,默认情况下打开的是前置摄像头

[_publisher startPreview:_videoView success:^{
    NSLog(@"preview success");
} failure:^(NSError *error) {
    //一般情况下只有用户禁止了app的相机权限才会导致摄像头打开失败
    NSLog(@"preview failed. %@", error);
}];

如果需要打开指定的摄像头,也可以使用以下接口

//打开后置摄像头
[_publisher startPreview:_videoView withCameraState:GLCameraStateBack   success:^{
    NSLog(@"preview success");
} failure:^(NSError *error) {
    NSLog(@"preview failed. %@", error);
}];

注:摄像头的方向是与 ViewController 的方向一致的。

6.4 开始直播

在直播之前需要先登录直播间

[_publisher loginWithForce:force success:^{
    //登录成功
} failure:^(NSError *error) {
    //登录失败
}];

其中 force 参数代表如果当前已经有主播登录了该直播间,是否强制踢出当前登录的主播。
如果 force 的值是 NO ,并且当前直播间已经有主播登录了,那么登录会失败并返回相应的状态码。
如果强制踢出当前登录的主播,被踢的那一端会受到通知 publisherDidForceLogout:

如果登录成功那么直接调用下面的接口就可以开始直播了

[_publisher publish];

推流过程中如果出现了中断的情况,那么SDK底层会自动进行重连,直到重连成功或者手动调用了 [publisher unpublish] 或者 [publisher stop] 为止。

默认情况下,直播出去的视频分辨率为640x360,码率为640kbps,滤镜效果为正常模式,也就是没有使用滤镜。

6.5 停止直播

预览开启后,就可以正式开始直播了

[_publisher unpublish];

调用这个接口只会断开推流端与服务器的连接,并不会停止本地的预览。如果需要停止预览并释放资源,请调用

[_publisher stop];

调用这个接口还会退出直播间的登录。

6.6 设置视频参数

SDK中内置了几种默认的配置

typedef NS_ENUM(NSInteger, GLPublisherVideoResolution) {
    /**
     *  自定义的预设类型。该类型下可以自由更改视频分辨率,帧率以及比特率
     */
        GLPublisherVideoResolutionCustom,    
    //16:9
    /**
     *  480kbps, 20fps
     */
    GLPublisherVideoResolution480x272,
    /**
     *  640kbps, 20fps
     */
    GLPublisherVideoResolution640x360,
    /**
     *  720kbps, 20fps
     */
    GLPublisherVideoResolution854x480,

    //4:3
    /**
     *  480kbps, 20fps
     */
    GLPublisherVideoResolution320x240,
    /**
     *  640kbps, 20fps
     */
    GLPublisherVideoResolution640x480,
    /**
     *  720kbps, 20fps
     */
    GLPublisherVideoResolution768x576
};

开发者可以选择当中的一种作为视频的参数设置

_publisher.videoPreset = GLPublisherVideoResolution640x360;

也可以自己定义

GLPublisherVideoPreset *preset = [GLPublisherVideoPreset 
                                        presetWithResolution:GLPublisherVideoResolutionCustom];
preset.videoSize = CGSizeMake(320, 640);
preset.fps = 20;
preset.bps = 600;
_publisher.videoPreset = preset;

有几点需要注意:

 * 视频预览的参数是不可修改的,只能根据 ViewController 的方向旋转而已。    videoPreset 设置的只是视频编码的参数。
 * 当视频编码的分辨率与本地预览的分辨率不一致时,最终推送出去的视频将会是**预览画面保   持比例居中**。
 * 码率的设置是最大值的设置,码率过低容易导致画面模糊,特别是当画面抖动的时候。
 * 需要在直播开始前就设置,如果当前正在直播,那么设置会在下次直播才生效。
 * 预设值中,除了Custom类型可以自由设置分辨率、码率以及帧率之外,其它几个类型的只能改变默认的码率与帧率

6.7 设置滤镜

SDK目前只提供了一种滤镜效果,后续会有更多的滤镜效果逐渐开发出来的。

//设置滤镜
_publisher.filter = [GLSmoothSkinFilter new];
//关闭滤镜
_publisher.filter = nil;

该滤镜的效果是美颜磨皮,如果需要调整效果的强弱,可以通过改变  factor 的值 /** * 强度系数,取值范围为0~1。默认值为0.5 */ @property (nonatomic, assign) CGFloat factor;

对滤镜的设置是实时生效的。

6.8 切换摄像头

[_publisher toggleCamera];

当前使用的是前置摄像头时,会切换到后置摄像头。是后置摄像头则切换到前置摄像头。切换摄像头不会影响视频的编码参数。

6.9 闪光灯控制

开启摄像头后,可通过设置该 torchOn 的值来尝试打开/关闭闪光灯。摄像头开启之前设置闪光灯的状态是不起任何作用的。

[_publisher setTorchOn:YES];

当摄像头为前置摄像头时,打开闪光灯会失败, torchOn 的值将不会改变。所以当尝试打开闪光灯时,应该通过 torchOn 的值来判断闪光灯是否打开成功。

6.10 设置静音

//YES表示音频静音,NO表示不静音
[_publisher setMute:YES];

设置静音后,所有收看当前直播的观众将听不到主播的声音。

6.11 添加水印

[_publisher addWatermark:image withFrame:frame];

以下几点需要注意:

 * 水印是**添加**上去的,并不是设置,所以可以添加**多个**水印。
 * 水印的位置和大小是以视频的[**编码分辨率**](#videopreset)为参考坐标系的。比如分辨率为640x360,那么 frame 的值就是以640x360为参考坐标系。

如果需要去除水印:

[_publisher clearWatermark];

水印的设置是实时生效的。

6.12 获取推流端状态

SDK提供了获取当前推流端的连接时间、推流码率以及当前网络队列缓存大小的接口

/**
 *  推流端连接时间。每次推流成功后都会更新该时间,单位毫秒。
 */
@property (nonatomic, readonly) NSInteger connectionTime;
/**
 *  当前推流的码率。推流成功成功后1秒钟更新一次,单位kbps。
 */
@property (nonatomic, readonly) NSInteger bps;
/**
 *  当前队列中还未发送的buffer数据大小,1秒钟更新一次。单位为byte
 */
@property (nonatomic, readonly) NSInteger bufferSize;

以上的信息是1秒钟更新一次,当有更新时回调 publisherStatusDidUpdate: 会被调用。

6.13 设置直播状态

    /**
     *  设置当前直播状态
     *
     *  @param state   1-直播中 0-直播停止
     *  @param stopType   0-异常停止 1-正常停止 2-重连时停止 3-手机来电 4-用户自定义停止状态
     *  @param success 成功回调
     *  @param failure 失败回调
     */
    - (void)setLiveState:(NSInteger)state stopType:(NSInteger)stopType success:(void (^)())success failure:(void (^)(NSError *))failure;

6.14 保存直播录像

SDK还提供了保存直播录像的功能。

//将当时时间设为录像的起点。如果重复调用,那么会忽略上一次的时间点,将起点重置为当前时间。
[_publisher beginRecording];

//将当前时间设置为保存直播录像的终点,并向服务器请求保存从起点到终点时间段的视频。
//如果时长小于两分钟,直接返回失败。
//如果没有调用过beginRecording,那么直接返回成功.
[_publisher endRecording:nil];

可用通过回调判断录像是否保存成功,保存成功的录像可以在亲加管理后台中找到。

6.15 邀请连麦互动

    /**
     *  邀请用户进行音视频连麦互动
     *
     *  @param userId  被邀请的用户id
     *  @param success 成功回调。accept为YES表示接受邀请,NO表示拒绝邀请
     *  @param failure 失败回调
     */
    - (void)inviteUser:(NSString *)userId withCallback:(void(^)(GLRoomPublisherPCEvent event))callback failure:(void(^)(NSError *error))failure;

6.16 结束连麦互动

    /**
     *  结束视频连麦互动
     */
    - (void)endPeerConnection;

6.17 回调通知

@protocol GLPublisherDelegate <NSObject>
@optional
/**
 *  连接视频发布服务器成功,开始发布视频
 *
 *  @param publisher 对应的发布端实例
 */
 - (void)publisherDidConnect:(GLPublisher *)publisher;
/**
 *  视频发布客户端被断开。一般情况下是由于程序退到了后台
 *
 *  @param publisher 对应的发布端实例
 */
 - (void)publisherDidDisconnected:(GLPublisher *)publisher;
/**
 *  正在重连
 *
 *  @param publisher 对应的发布端实例
 */
 - (void)publisherReconnecting:(GLPublisher *)publisher;
/**
 *  出现错误
 *
 *  @param error        错误的详细信息
 *  @param publisher    对应的发布端实例
 */
 - (void)publisher:(GLPublisher *)publisher onError:(NSError *)error;

/**
 *  发布端状态更新的回调,1秒钟回调1次。包括bps、bufferSize属性的更新
 *
 *  @param publisher 对应的发布端实例
 */
 - (void)publisherStatusDidUpdate:(GLPublisher *)publisher;

@end

除了上面所列的回调之外,还有关于直播间登录状态的回调

@protocol GLRoomPublisherDelegate <GLPublisherDelegate>
@optional
/**
 *  当前账号在别的设备登陆,客户端被强制踢下线
 *
 *  @param publisher 对应的发布端实例
 */
 - (void)publisherDidForceLogout:(GLRoomPublisher *)publisher;
@end

6.15 错误码说明

错误码描述详见 GLPublisherErrorCode.h

错误码 | 描述
----- | -----
401 | 验证失败,或者是没有验证成功的情况下调用了别的接口
1011 | 当前账号已经有人登录了
-101 | 当前已经有人在直播了
-102 | 网络断开
-103 | 获取当前直播状态出错
-104 | 无法获取摄像头,请检查权限
-105 | 获取直播Url出错
-106 | 当前状态无效
-107 | 用户未登录
-108 | 获取登录url失败
-109 | 录制时长过短(少于两分钟)

7. 连麦功能集成

gotyelivepeerconnection为视频连麦通话模块功能。该模块主要实现场景为主播与用户的音视频互动,观看者可以实时观看交互的内容;连线的双方为主播和普通观看者,集成时需要绑定直播模块和播放器模块;

7.1 集成步骤

  1. 集成直播模块(如已集成略过这一步)
  2. libGotyeLivePeerConnection.a以及同级目录下的include文件夹导入到工程中
  3. 添加依赖库
    • GLKit.framework

7.2 SDK初始化

目前视频通话模块是需要依赖于直播模块的,如果是主播端调用,需要传入当前直播模块的一个实例:

    GLPeerClient *client = [[GLPeerClient alloc]initWithPublisher:publisher];

如果是观看端进行调用,那么传入nil即可。

7.3 连接视频通话房间

在一个appkey下,房间ID是唯一标示,进入ID相同的房间的两个人可以进行视频通话。

    [client connectToRoom:@"房间ID" withUserId:@"用户ID"];

   关于房间ID
    房间ID是可以任意填写的,至于房间ID怎么传递,不在本SDK的范围内。可以通过某种算法使得两边的客户端能获得相同的房间ID,也可以通过socket通道等方式将房间ID发送给对方。

   关于用户ID
    用户ID也是可以任意填写的,在这里只用来区分同一房间内的不同用户,服务器不做任何处理。

7.4 视频显示

    /**
     *  本地视频的显示view
     */
    @property (nonatomic, strong) GLVideoRendererView *localVideoView;

    /**
     *  对端视频的显示view
     */
    @property (nonatomic, strong) GLVideoRendererView *remoteVideoView;

只要设置好对应的视频显示的view,sdk在收到数据时会自动进行渲染。

默认情况下,视频画面会在保持长宽比的前提下进行缩放,直到撑满view的某一边为止。如果想更改缩放模式,需要显示设置GLVideoRendererViewfillMode属性:

    typedef NS_ENUM(NSUInteger, GLVideoRendererViewFillMode) {
    /**
     *  保持比例居中。视频会按照比例放大直到撑满屏幕某一边为止。视频不会被截取,但屏幕可能会留空白。
     */
    GLVideoRendererViewFillModeAspectFit,
   /**
    *  保持比例撑满。视频会按照比例放大直到撑满屏幕为止。屏幕不留空白,但视频可能被截取。
    */
   GLVideoRendererViewFillModeAspectFill
   };

   view.fillMode = GLVideoRendererViewFillModeAspectFill;

7.5 断开连接

   [client disconnect];

断开连接即结束当前视频通话,如果当前正在通话,通话的另一端会收到结束通话的通知。

7.6 回调通知

    @protocol GLPeerClientDelegate <NSObject>

    @optional
    /**
     *  成功打开本地摄像头的回调
     *
     *  @param client 当前视频通话的客户端
     */
    - (void)peerClientDidReceiveLocalVideo:(GLPeerClient *)client;

   /**
    *  成功连接视频房间的回调
    *
    *  @param client 当前视频通话的客户端
    *  @param roomId 房间ID
    */
   - (void)peerClient:(GLPeerClient *)client didConnectToRoom:(NSString *)roomId;

   /**
    *  跟远端用户连接成功的回调
    *
    *  @param client 当前视频通话的客户端
    *  @param userId 远端用户ID
    */
   - (void)peerClient:(GLPeerClient *)client didReceiveStreamFrom:(NSString *)userId;

  /**
   *  远端用户结束当前视频通话的回调
   *
   *  @param client 当前视频通话的客户端
   *  @param userId 远端用户ID
   */
  - (void)peerClient:(GLPeerClient *)client didReceiveHangUpFrom:(NSString *)userId;

 /**
  *  发生错误时的回调
  *
  *  @param client 当前视频通话的客户端
  *  @param error  错误详细信息
  */
 - (void)peerClient:(GLPeerClient *)client didOccurError:(NSError *)error;

 @end

8. 接口文档

具体的接口文档可以参考相应的接口文档

返回顶部