系列教程:javascript
在上一篇Agora iOS SDK-快速入门中聊了若是配置Agora iOS SDK,这一篇将看下如何使用Agora如何进行聊天。html
Agora封装了视频聊天的大多数经常使用功能,直接调用Agora API便可直接开始聊天。这篇文章的主要目标是结合文档完成一对一视频聊天的Demo。java
AgoraRtcEngineKit
是Agora SDK的入口,经过它就能够完成聊天的基本设置。好比设置远程视频、本地视频的配置、声音控制、以及设置摄像头等。ios
首先,新建一个ChatViewController
用来实现聊天功能,在ChatViewController
中声明一个AgoraRtcEngineKit的变量:git
var agoraKit : AgoraRtcEngineKit!复制代码
初始化该变量须要实现委托:AgoraRtcEngineDelegate
,它是AgoraRtcEngineKit的回调,在出现错误、离开频道....等状况出现的时候能够在该回调中获得通知。github
它的其中一个方法- (void)rtcEngine:(AgoraRtcEngineKit *)engine firstRemoteVideoDecodedOfUid:(NSUInteger)uid size:(CGSize)size elapsed:(NSInteger)elapsed;
的意思是在第一个用户准备好视频通讯的状况下会触发该方法,这个时候就能够配置该用户的显示界面了,AgoraRtcEngineDelegate
实现:swift
extension ChatViewController:AgoraRtcEngineDelegate{
func rtcEngine(_ engine: AgoraRtcEngineKit!, firstRemoteVideoDecodedOfUid uid: UInt, size: CGSize, elapsed: Int) {
}
func rtcEngine(_ engine: AgoraRtcEngineKit!, didLeaveChannelWith stats: AgoraRtcStats!) {
}
}复制代码
这里使用了extension
扩展了ChatViewController用来实现AgoraRtcEngineDelegate
。api
再实现了委托以后就能够实例化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须要设置下下面几个参数:
配置好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
}
}复制代码
下面简单说下各个参数的含义:
经过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;复制代码
经过该例子能够实现一对一的视频聊天,下一篇文章将介绍下若是进行多人视频聊天。
源代码地址:github.com/jjz/agora-s…
参考文档:docs.agora.io/cn/user_gui…