这段时间写基于环信的视频语音通话功能,看环信官方给的demo发现不怎么好写,然后通过各种查资料,又结合文档,终于还是在借助别人的 demo下完成了这个功能。汗颜!!!
首先当我们点击视频通话时—>发起实时通话
可以直接调用:
- (void)startCall:(EMCallType)aType
remoteName:(NSString *)aRemoteName
ext:(NSString *)aExt
completion:(void (^)(EMCallSession *aCallSession, EMError *aError))aCompletionBlock;
在
void (^completionBlock)(EMCallSession *, EMError *) = ^(EMCallSession *aCallSession, EMError *aError){
//创建通话实例是否成功
//TODO: code
};
中直接写跳转页面到你自己设置的视频界面例如:
[[EMClient sharedClient].callManager startCall:callType remoteName:remote ext:nil completion:^(EMCallSession *aCallSession, EMError *aError) {
if (!aError) {
weakSelf.currentSession = aCallSession;
weakSelf.callController = [[QZCallViewController alloc] initWithCallSession:weakSelf.currentSession];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:weakSelf.callController animated:YES completion:nil];
} else {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"呼叫失败" message:aError.errorDescription delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[alertView show];
}
}];
为了使用方便我们将有关视频通话的方法放在一个类中:QZHelper
那么在.h中我们需要的方法有:
1、类的初始化
2、发出视频通话
3、挂断通话
4、被叫方同意实时通话
初始化的时候我们可以采用单例的形式
+ (instancetype)shareHelper
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
helper = [[QZHelper alloc] init];
});
return helper;
}
再在init方法中配置音视频属性
- (instancetype)init
{
self = [super init];
if (self) {
[self _unRegisterCallNotifications];
[self _registerCallNotifications];
EMCallOptions *options = [[EMClient sharedClient].callManager getCallOptions];
//当对方不在线时,是否给对方发送离线消息和推送,并等待对方回应
options.isSendPushIfOffline = YES;
//设置视频分辨率:自适应分辨率、352 * 288、640 * 480、1280 * 720
options.videoResolution = EMCallVideoResolution640_480;
//最大视频码率,范围 50 < videoKbps < 5000, 默认0, 0为自适应,建议设置为0
options.maxVideoKbps = 0;
//最小视频码率
options.minVideoKbps = 0;
//是否固定视频分辨率,默认为NO
options.isFixedVideoResolution = NO;
[[EMClient sharedClient].callManager setCallOptions:options];
}
return self;
}
- (void)_unRegisterCallNotifications
{
[[EMClient sharedClient] removeDelegate:self];
[[EMClient sharedClient].callManager removeDelegate:self];
}
- (void)_registerCallNotifications
{
[[EMClient sharedClient] addDelegate:self delegateQueue:dispatch_get_main_queue()];
[[EMClient sharedClient].callManager addDelegate:self delegateQueue:dispatch_get_main_queue()];
}
发出通话:(如觉得不太方便可重写一个方法将原方法嵌套)
[[EMClient sharedClient].callManager startCall:callType remoteName:remote ext:nil completion:^(EMCallSession *aCallSession, EMError *aError) {
if (!aError) {
weakSelf.currentSession = aCallSession;
weakSelf.callController = [[QZCallViewController alloc] initWithCallSession:weakSelf.currentSession];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:weakSelf.callController animated:YES completion:nil];
} else {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"呼叫失败" message:aError.errorDescription delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[alertView show];
}
}];
发出通话请求后,被叫方会接受信息执行方法:
/*!
* 用户A拨打用户B,用户B会收到这个回调
*
* @param aSession 会话实例
*/
- (void)callDidReceive:(EMCallSession *)aSession;
其中QZViewController为视频链接界面 可自行设计只需将当前session传去即可。
当被叫方同意实时通话时 被叫方会走这个方法:
/*!
* 接收方同意通话请求
*
* @param aCallId 通话ID
*
* @result 错误信息
*/
- (EMError *)answerIncomingCall:(NSString *)aCallId;
//调用:
//EMError *error = nil;
//error = [[EMClient sharedClient].callManager answerIncomingCall:@"sessionId"];
这时主叫方和被叫方都会接受回调 :
/*!
* 通话通道建立完成,用户A和用户B都会收到这个回调
*
* @param aSession 会话实例
*/
- (void)callDidConnect:(EMCallSession *)aSession;
当被叫方同意后主叫方也会受到回调
/*!
* 用户B同意用户A拨打的通话后,用户A会收到这个回调
*
* @param aSession 会话实例
*/
- (void)callDidAccept:(EMCallSession *)aSession;
然后在各个回调中调用适当的方法 通话基本上就完成了
有时间再继续完善