实时通话


环信实时通话分为视频通话和语音通话,SDK 提供简单的 API,方便开发者简单的接入实时通话功能。

实时通话的数据流量

实时语音和实时视频通话的数据流量如下:

  • 实时语音:双向 170k bytes/minute
  • 实时视频:双向 2.5M~3M bytes/minute

配置工程

需要使用包含实时音视频的库 libHyphenateFullSDK.a,包含头文件 #import “EMSDKFull.h”。

调用:

[EMClient sharedClient].callManager

具体实现可以参考 Demo: CallViewController

发起实时通话

用户可以调用发起语音或者视频 API 向在线用户发起实时通话。

/*!
 *  发起实时会话
 *
 *  @param aType            通话类型
 *  @param aRemoteName      被呼叫的用户(不能与自己通话)
 *  @param aExt             通话扩展信息,会传给被呼叫方
 *  @param aCompletionBlock 完成的回调
 */
- (void)startCall:(EMCallType)aType
       remoteName:(NSString *)aRemoteName
              ext:(NSString *)aExt
       completion:(void (^)(EMCallSession *aCallSession, EMError *aError))aCompletionBlock;

//调用:
[[EMClient sharedClient].callManager startCall:EMCallTypeVideo remoteName:aUsername ext:nil completion:^(EMCallSession *aCallSession, EMError *aError) {

}];

被叫方同意实时通话

接收到通话时调用此 API 同意实时通话。

/*!
 *  接收方同意通话请求
 *
 *  @param  aCallId     通话ID
 *
 *  @result 错误信息
 */
- (EMError *)answerIncomingCall:(NSString *)aCallId;

//调用:
//EMError *error = nil;
//error = [[EMClient sharedClient].callManager answerIncomingCall:@"sessionId"];                           

结束实时通话

根据不同场景可以选择结束会话的原因。

例如:拒接选择 EMCallEndReasonDecline,主动挂断选择 EMCallEndReasonHangup。

typedef enum{
    EMCallEndReasonHangup   = 0,    /*! 对方挂断 */
    EMCallEndReasonNoResponse,      /*! 对方没有响应 */
    EMCallEndReasonDecline,         /*! 对方拒接 */
    EMCallEndReasonBusy,            /*! 对方占线 */
    EMCallEndReasonFailed,          /*! 失败 */
    EMCallEndReasonUnsupported,     /*! 功能不支持 */
}EMCallEndReason;


/*!
 *  结束通话
 *
 *  @param aCallId     通话的ID
 *  @param aReason     结束原因
 *
 *  @result 错误
 */
- (EMError *)endCall:(NSString *)aCallId
              reason:(EMCallEndReason)aReason;
//调用:
//[[EMClient sharedClient].callManager endCall:@"sessionId" reason:aReason];

实时通话实例

/*!
 *  会话标识符
 */
@property (nonatomic, strong, readonly) NSString *callId;

/*!
 *  通话本地的username
 */
@property (nonatomic, strong, readonly) NSString *localName;

/*!
 *  通话的类型
 */
@property (nonatomic, readonly) EMCallType type;

/*!
 *  主叫还是被叫
 */
@property (nonatomic, readonly) BOOL isCaller;

/*!
 *  对方的username
 */
@property (nonatomic, strong, readonly) NSString *remoteName;

/*!
 *  通话的状态
 */
@property (nonatomic, readonly) EMCallSessionStatus status;

/*!
 *  视频通话时自己的图像显示区域
 */
@property (nonatomic, strong) EMCallLocalView *localVideoView;

/*!
 *  视频通话时对方的图像显示区域
 */
@property (nonatomic, strong) EMCallRemoteView *remoteVideoView;

#pragma mark - Statistics Property

/*!
 *  连接类型
 */
@property (nonatomic, readonly) EMCallConnectType connectType;

/*!
 *  视频的延迟时间,单位是毫秒,实时变化
 *  未获取到返回-1
 */
@property (nonatomic, readonly) int videoLatency;

/*!
 *  本地视频的帧率,实时变化
 *  未获取到返回-1
 */
@property (nonatomic, readonly) int localVideoFrameRate;

/*!
 *  对方视频的帧率,实时变化
 *  未获取到返回-1
 */
@property (nonatomic, readonly) int remoteVideoFrameRate;

/*!
 *  本地视频通话对方的比特率kbps,实时变化
 *  未获取到返回-1
 */
@property (nonatomic, readonly) int localVideoBitrate;

/*!
 *  对方视频通话对方的比特率kbps,实时变化
 *  未获取到返回-1
 */
@property (nonatomic, readonly) int remoteVideoBitrate;

/*!
 *  本地视频丢包率,实时变化
 *  未获取到返回-1
 */
@property (nonatomic, readonly) int localVideoLostRateInPercent;

/*!
 *  对方视频丢包率,实时变化
 *  未获取到返回-1
 */
@property (nonatomic, readonly) int remoteVideoLostRateInPercent;

/*!
 *  对方视频分辨率
 *  未获取到返回 (-1,-1)
 */
@property (nonatomic, readonly) CGSize remoteVideoResolution;

实时通话相关 API

暂停恢复实时通话的数据传输相关 API。

/*!
 *  暂停语音数据传输
 *
 *  @result 错误
 */
- (EMError *)pauseVoice;

/*!
 *  恢复语音数据传输
 *
 *  @result 错误
 */
- (EMError *)resumeVoice;

/*!
 *  暂停视频图像数据传输
 *
 *  @result 错误
 */
- (EMError *)pauseVideo;

/*!
 *  恢复视频图像数据传输
 *
 *  @result 错误
 */
- (EMError *)resumeVideo;

实时通话前后摄像头切换相关API

#pragma mark - Camera

/*!
 *  设置使用前置摄像头还是后置摄像头,默认使用前置摄像头
 *
 *  @param  aIsFrontCamera    是否使用前置摄像头, YES使用前置, NO使用后置
 */
- (void)switchCameraPosition:(BOOL)aIsFrontCamera;

实时通话相关的回调

注册实时通话回调

//注册实时通话回调
[[EMClient sharedClient].callManager addDelegate:self delegateQueue:nil];
//移除实时通话回调
[[EMClient sharedClient].callManager removeDelegate:self];

相关回调说明:

/*!
 *  用户A拨打用户B,用户B会收到这个回调
 *
 *  @param aSession  会话实例
 */
- (void)callDidReceive:(EMCallSession *)aSession;

/*!
 *  通话通道建立完成,用户A和用户B都会收到这个回调
 *
 *  @param aSession  会话实例
 */
- (void)callDidConnect:(EMCallSession *)aSession;

/*!
 *  用户B同意用户A拨打的通话后,用户A会收到这个回调
 *
 *  @param aSession  会话实例
 */
- (void)callDidAccept:(EMCallSession *)aSession;

/*!
 *  1. 用户A或用户B结束通话后,对方会收到该回调
 *  2. 通话出现错误,双方都会收到该回调
 *
 *  @param aSession  会话实例
 *  @param aReason   结束原因
 *  @param aError    错误
 */
- (void)callDidEnd:(EMCallSession *)aSession
            reason:(EMCallEndReason)aReason
             error:(EMError *)aError;

/*!
 *  用户A和用户B正在通话中,用户A中断或者继续数据流传输时,用户B会收到该回调
 *
 *  @param aSession  会话实例
 *  @param aType     改变类型
 */
- (void)callStateDidChange:(EMCallSession *)aSession
                      type:(EMCallStreamingStatus)aType;

弱网检测

通过回调通知应用当前实时通话网络状态。

typedef enum{
    EMCallNetworkStatusNormal = 0,  /*! 正常 */
    EMCallNetworkStatusUnstable,    /*! 不稳定 */
    EMCallNetworkStatusNoData,      /*! 没有数据 */
}EMCallNetworkStatus;

/*!
 *  用户A和用户B正在通话中,用户A的网络状态出现不稳定,用户A会收到该回调
 *
 *  @param aSession  会话实例
 *  @param aStatus   当前状态
 */
- (void)callNetworkDidChange:(EMCallSession *)aSession
                      status:(EMCallNetworkStatus)aStatus

上一页:聊天室管理

下一页:红包集成