基于环信视频语音通话功能

这段时间写基于环信的视频语音通话功能,看环信官方给的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;

然后在各个回调中调用适当的方法 通话基本上就完成了
有时间再继续完善

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~轻舟~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值