“兩行”程式碼,幫你快速實現FaceTime的新多人視訊通話效果

聲網Agora發表於2018-06-06

一年一度的 WWDC 開幕了。我們看了來自各個勤勞媒體的回顧與解讀。在這些新功能中,最吸引我們的還是最新更新的 FaceTime。

這次 FaceTime 不僅開始支援群組視訊通話,還可以在視訊通話時,判斷誰在說,並自動放大他的視訊視窗。乍看上去,很是驚豔。不過如果是基於聲網視訊通話SDK來實現,並不複雜,只需呼叫幾個介面即可實現。

其實,在近些年的各種大型活動上,有不少與視訊通話相關的“驚豔”功能,都成為當時的熱門話題。我們今天來分享幾個往年的“熱門話題”,並講解基於聲網SDK如何來實現。

FaceTime 視訊視窗自動調節

FaceTime 這次更新後新增多人群組視訊通話。在通話過程中,如果你正在說話,那麼你的視訊視窗就會自動放大。( 點選這裡觀看視訊

“兩行”程式碼,幫你快速實現FaceTime的新多人視訊通話效果

其實這個功能通過聲網 SDK 很容易實現,開發者不需要懂得如何玩轉AI,只需要使用幾個介面即可。我們在 SDK 中首先要實現多人視訊通話功能,然後利用介面回撥使用者uid,瞭解是哪位使用者正在說話,然後調整UI,讓該使用者視窗變為最大。具體呼叫的介面如下:

- (int)enableAudioVolumeIndication:(NSInteger)interval
                            smooth:(NSInteger)smooth;//啟用說話者音量提示
- (void)rtcEngine:(AgoraRtcEngineKit * _Nonnull)engine
      activeSpeaker:(NSUInteger)speakerUid;//返回正在說話的使用者uid
FaceTime:視訊預覽
複製程式碼

從 FaceTime 誕生起就有一個功能,在發起視訊通話後,即便通話未被接聽,使用者也能在自己手機上看到自己的視訊畫面。

從實現角度來講,我們只需要在開始傳送音訊、視訊流之前,將視訊資料渲染至介面上就可以達到這個效果。具體的介面呼叫如下:

setupLocalVideo()//設定預覽檢視
startPreview()//啟動視訊預覽
複製程式碼

Google Duo:Knock Knock

在2016年的 Google I/O 上,Google 釋出了一款即時通訊工具 Allo,以及一款視訊通話應用 Google Duo。兩年過去了,Allo 專案已經被暫停,而主打視訊通話的 Duo 卻有著令人欣喜的使用者增長。

在 Duo 中,有一個“Knock Knock”功能,在視訊通話接通之前,被呼叫的一方能看到對方的實時視訊畫面,而呼叫的一方則看不到。就好像,有人敲了你的門,你湊近門眼,看到門外是朋友還是家人。

“兩行”程式碼,幫你快速實現FaceTime的新多人視訊通話效果

如果基於聲網 SDK 來實現,我們只需要利用 API 控制好對音訊、視訊流的傳送邏輯即可。在視訊通話被接聽之前,呼叫方與被呼叫方需要呼叫的介面如下。

呼叫方:

muteLocalAudioStream(true)//禁止傳送音訊
muteLocalVideoStream(false)//傳送視訊
joinChannel()//進入頻道
複製程式碼

被呼叫方:

muteLocalAudioStream(true)//禁止傳送音訊
muteLocalVideoStream(true)//禁止傳送視訊
setupRemoteVideo()//繫結主叫方檢視
joinChannel()//進入頻道
複製程式碼

在通話被接聽後,我們需要將此前的部分介面引數進行修改,具體如下。

呼叫方:

muteLocalAudioStream(false)//傳送音訊
setupRemoteVideo//設定遠端視訊顯示屬性
複製程式碼

被呼叫方:

muteLocalAudioStream(false)//傳送音訊
muteLocalVideoStream(false)//傳送視訊
複製程式碼

Snapchat:實時貼紙

在視訊通話中,給自己新增各種貼紙和特效,現在已經不算非常新奇了。而最初,Snapchat 在直播中加入該功能時,確實豔驚四座,隨即便成為了一種趨勢。再回望昨晚的 WWDC,蘋果不也給 FaceTime 增加了同類功能麼?

首先,開發者可以通過自研的美顏庫,或第三方庫來對視訊進行前處理,然後通過聲網 SDK 進行渲染和傳輸。在這裡,開發者可以通過以下兩種方式來呼叫SDK的介面。

方式一:利用自採集 API

   setExternalVideoSource(true, useTexture: true, pushMode: true)
   pushExternalVideoFrame()
複製程式碼

方式二:自定義視訊源(視訊通話 SDK 2.1及以上版本支援)

步驟 1:實現 AgoraVideoSourceProtocol 的介面,構建自定義的 Video source 類

  • 在獲取 Buffer 型別 (bufferType) 的實現中指定視訊採集使用的 Buffer 型別

  • 在初始化視訊源 (shouldInitialize) 中準備好系統環境,進行初始化引數等設定

  • 在啟動視訊源 (shouldStart) 中開始採集視訊資料

  • 將採集到的資料通過AgoraVideoFrameConsumer Protocol 定義的介面傳給 Media Engine

  • 在停止視訊源 (shouldStop) 中停止採集視訊資料

  • 在釋放視訊源 (shouldDispose) 中釋放硬體等系統資源

步驟 2:建立自定義的視訊源物件

步驟 3:通過 Media Engine 的設定視訊源 (setVideoSource) 方法把自定義的視訊源物件設定給 Media Engine

步驟 4:Media Engine 會在適當的實際呼叫自定義視訊源中實現的AgoraVideoSourceProtocol 的方法

以上,我們僅以 iOS 為例,列出了其中的介面呼叫邏輯。當然對於其他作業系統,比如 macOS、Android 等系統,我們只需要少做調整也可以實現。詳細的介面與引數,請訪問開發文件閱讀。想自己實現 FaceTime?自己動手嘗試一下吧。

如果你基於聲網SDK嘗試實現了其它效果,並寫在自己的部落格中,歡迎在本文評論中分享給更多人。

相關文章