[教程] 實現視訊對話應用 HouseParty教程(二)—— 開始聊天|附 iOS 原始碼

姜家志發表於2019-02-07

系列教程:

  1. [教程] 使用 Agora SDK 實現視訊對話應用 HouseParty
  2. [教程] 實現視訊對話應用 HouseParty教程(二)—— 開始聊天
  3. [教程] 實現視訊對話應用 HouseParty教程(三)—— 多人聊天

在上一篇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;複製程式碼

通過該例子可以實現一對一的視訊聊天,下一篇文章將介紹下如果進行多人視訊聊天。

原始碼地址:github.com/jjz/agora-s…
參考文件:docs.agora.io/cn/user_gui…

相關文章