Agora iOS SDK-开始聊天

在上一篇Agora iOS SDK-快速入门中聊了如果配置Agora iOS SDK,这一篇将看下如何使用Agora如何进行聊天。
Agora封装了视频聊天的大多数常用功能,直接调用Agora API即可直接开始聊天。这篇文章的主要目标是结合文档完成一对一视频聊天的Demo。

初始化

AgoraRtcEngineKit是Agora SDK的入口,通过它就可以完成聊天的基本设置。比如设置远程视频、本地视频的配置、声音控制、以及设置摄像头等。
首先,新建一个ChatViewController用来实现聊天功能,在ChatViewController中声明一个AgoraRtcEngineKit的变量:

var agoraKit : AgoraRtcEngineKit!

初始化该变量需要实现委托:AgoraRtcEngineDelegate,它是AgoraRtcEngineKit的回调,在出现错误、离开频道....等情况出现的时候可以在该回调中得到通知。
它的其中一个方法- (void)rtcEngine:(AgoraRtcEngineKit *)engine firstRemoteVideoDecodedOfUid:(NSUInteger)uid size:(CGSize)size elapsed:(NSInteger)elapsed;的意思是在第一个用户准备好视频通信的情况下会触发该方法,这个时候就可以配置该用户的显示界面了,AgoraRtcEngineDelegate实现:

extension ChatViewController:AgoraRtcEngineDelegate{
    func rtcEngine(_ engine: AgoraRtcEngineKit!, firstRemoteVideoDecodedOfUid uid: UInt, size: CGSize, elapsed: Int) {
     
        
    }
    func rtcEngine(_ engine: AgoraRtcEngineKit!, didLeaveChannelWith stats: AgoraRtcStats!) {
        
    }

}

这里使用了extension扩展了ChatViewController用来实现AgoraRtcEngineDelegate
再实现了委托之后就可以实例化agoraKit了,实例化方法:

agoraKit=AgoraRtcEngineKit.sharedEngine(withAppId: AgoraSetting.AgoraAppId, delegate: self)

这样就完成了AgoraRtcEngineKit的初始化,初始化完成之后还需要设置视频显示,下面就先从远程视频的设置开始。

开启远程用户视频

远程视频的设置也比较简单,在AgoraRtcEngineDelegate中的方法func rtcEngine(_ engine: AgoraRtcEngineKit!, firstRemoteVideoDecodedOfUid uid: UInt, size: CGSize, elapsed: Int)被调用的时候,就可以开启该远程视频的显示,实现该方式就可以拿到该用户的信息。
在设置远程用户视频之前,还需要新建一个UIView用来显示远程视频,远程视频的显示会在该UIView内完成,新建一个UIView用来接收远程视频:

@IBOutlet weak var remoteView: UIView!

还需要一个VideoCanvas的实例,在该实例中配置远程视频的显示方式。

let videoCanvas = AgoraRtcVideoCanvas()

videoCanvas需要设置下下面几个参数:

  • uid 用来区分用户的唯一标识
  • view 用来设置显示远程视频的view
  • renderMode 视频显示模式包括三种模式:AgoraRtc_Render_Hidden、AgoraRtc_Render_Fit、AgoraRtc_Render_Adaptive

配置好videoCanvas之后,就可以在agoraKit中开启远程视频了:

agoraKit.setupRemoteVideo(videoCanvas)

使用Agora设置远程视频的播放就是如此简单,不用再关心底层的实现,减少了应用开发者在底层上的开发时间。当然本地视频的设置也是如此的简单。

本地视频

对于本地视频的配置,首先需要设置视频参数,包括分辨率、帧率、码率等,当设置的分辨率不被摄像头支持的时候,SDK会自动找到一个合适的分辨率来适配摄像头,但显示的仍然是指定的分辨率。
设置本地视频配置的方法:

setVideoProfile:(AgoraRtcVideoProfile)profile
swapWidthAndHeight:(BOOL)swapWidthAndHeight;

第一参数包含了分辨率、帧率、码率的配置,在SDK中已经有已经设置好的参数,在demo中使用的是._VideoProfile_360P,第二个参数表示是否交换宽和高,用来适应横屏和竖屏的显示。默认为false。
设置本地视频配置:

agoraKit.setVideoProfile(._VideoProfile_360P, swapWidthAndHeight: false)

和远程视频的设置一样,首先需要一个view用来接收本地视频的显示,定义一个本地显示本地视频的view:

@IBOutlet weak var localVideo: UIView!

本地视频的显示也需要实例化一个AgoraRtcVideoCanvas,还要配置AgoraRtcVideoCanvas的三个参数,然后把AgoraRtcVideoCanvas设置给agoraKit,完整代码如下:

func setupLocalVideo(){
        agoraKit.setVideoProfile(._VideoProfile_360P, swapWidthAndHeight: false)
        let videoCanvas=AgoraRtcVideoCanvas()
        videoCanvas.uid=0
        videoCanvas.view=localVideo
        videoCanvas.renderMode = .render_Adaptive
        agoraKit.setupLocalVideo(videoCanvas)
    }

上面完成了本地视频和远程视频的设置和显示,在需要和人一起聊天之前,还要两个人都加入到一个频道中。

加入一个频道

频道:在同一个频道内的用户可以互相通话,如果多个用户加入了一个频道就可以群聊,一个用户只能加入一个频道。切换频道必须从当前频道中退出。
先看加入频道的代码:

 func joinChannel(){
        agoraKit.joinChannel(byKey: nil, channelName: "demo", info: nil, uid: 0){[weak self](sid,uid,elapsed)->Void in
            if let weakSelf = self{
                weakSelf.agoraKit.setEnableSpeakerphone(true)
                UIApplication.shared.isIdleTimerDisabled = true
            }
            
    }

下面简单说下各个参数的含义:

  • byKey 可选参数,使用nil或者App ID都可以,如果对于安全要求极高的话可以使用申请Channel Key
  • channelName 频道名称
  • info 开发可以附件信息,该信息不会给用户看到
  • uid 用户唯一标识
  • joinChannelSuccessBlock 一个加入成功的回调block,在加入频道成功之后通过设置isIdleTimerDisabled来阻止用户锁屏。

通过agoraKit.leaveChannel()可以离开频道,只有离开一个频道才能进入下一个频道,leaveChannel是异步操作,调用时并没有真正的退出频道,在真正的退出频道后,会触发didLeaveChannelWithStats回调。
在一个频道中的用户就可以正式的开始聊天了。
在聊天过程中特别是会议聊天时,有时需要禁止自己的声音,防止打扰别人说话,Agora SDK也提供了对于声音和摄像头的控制。

声音控制

聊天中对于声音的控制有很多种方式,下面介绍下几种比较常用的方式:

声音开关

muteLocalAudioStream可以设置本地声音的开关,使用方式也比较简单,通过一个Button控制本地声音的开启:

@IBAction func mute(_ sender: UIButton) {
        sender.isSelected = !sender.isSelected
        agoraKit.muteLocalAudioStream(sender.isSelected)
    }

muteAllRemoteAudioStreams的作用是禁止所有的远程视频的声音,使用方式和muteLocalAudioStream一样。
如果想禁止某一个用户的声音可以可以使用方法:

-(int)muteRemoteAudioStream:(NSUInteger)uid muted:(BOOL)muted;

其中uid是用户的唯一标识,利用uid就可以针对某一个用户开启/关闭该用户的声音。

开启扬声器

通过方法:

-(int)setEnableSpeakerphone:(BOOL)enableSpeaker;

可以设置使用扬声器或听筒,其中YES是输出声音到扬声器,NO是使用听筒。

监听声音

在多人聊天的过程中,我们还需要知道是谁在说话,这个时候就需要设置监听用户的声音状态,通过方法:

-(int)enableAudioVolumeIndication:(NSInteger)interval smooth:(NSInteger)smooth;

就可以监听远程用户的声音状态,设置该方法之后可以在AgoraRtcEngineDelegate中的reportAudioVolumeIndicationOfSpeakers中收到谁在说话以及他说话的音量。

上面是针对声音的方法,更多的设置可以参考官方的文档,下面再看下针对摄像头的方法

摄像头

对于摄像头的控制方法也有很多的方式,下面以几个比较常用方法为主简单介绍下。

开启本地预览

在demo中的频道列表中使用的背景是本地视频的预览,本地预览相关的有两个方法:

startPreview(开启预览)
stopPreview(停止预览)

注意开启视频预览之前必须先设置本地的视频显示属性以及预览的UIView,详细的设置可以参考demo。

摄像头切换

视频聊天中常常需要对前置/后置摄像头进行切换,切换摄像头的代码为:

 @IBAction func switchCamera(_ sender: UIButton) {
        agoraKit.switchCamera()
    }

使用该方法,SDK会判断当前摄像头的状态,并对摄像头进行切换。

视频开关

和声音开关类似,也可以通过API暂停发送视频,暂定发送本地视频流的方法:

-(int)muteLocalVideoStream:(BOOL)mute;

暂停所有远程视频流的方法:

-(int)muteAllRemoteVideoStreams:(BOOL)mute;

暂停某一个远程用户视频的方法:

-(int)muteRemoteVideoStream:(NSUInteger)uid mute:(BOOL)mute;

通过该例子可以实现一对一的视频聊天,下一篇文章将介绍下如果进行多人视频聊天。

源代码地址:https://github.com/jjz/agora-swift
参考文档:https://docs.agora.io/cn/user_guide/API/ios_api.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容