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

系列教程:javascript

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

在上一篇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用來實現AgoraRtcEngineDelegateapi

再實現了委託以後就能夠實例化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…

相關文章
相關標籤/搜索