背景
以下內(nèi)容基于Android P code。
主要差異
視頻通話比語音通話主要是多了判斷是否為視頻通話,及視頻的顯示和傳輸。如下:

界面通過IVideoProvider控制camera的顯示并設(shè)置TextureView等,Ims service通過IVideoCallback來通知一些media的更新。如下

判斷是否為視頻通話
視頻通話同ims語音通話邏輯幾乎相同,不一樣的地方在于他們的video state不同,因為應用通過video state來判斷是否為視頻通話。
設(shè)置video state及通過video state更新界面的流程如下:

1. 撥號時,撥號盤調(diào)用TelecomManager#placeCall()的參數(shù)中帶有video state,Telecom將這個video state傳給Telephony,并放入Phone的參數(shù)中,CallTracker在撥號時會把這個video state轉(zhuǎn)換成ImsCallProfile中的call type,Ims service 撥號時從profile中拿出這個call type再判斷是否撥打視頻電話。
2. 來電時,IImsCallSession中有包含call type的ImsCallProfile,并從中拿到video state更新ImsPhoneConnection。之后通知Telephony應用來電,Telephony通話Telecom來電,在Telecom和Telephony建立連接后,從ImsPhoneConnection中拿出video state放入telecom/Connection中,并返回該Connection給Telecom/Call,Telecom/Call更新VideoState。
3. Telecom在和InCallUI建立連接后,會把Telecom/Call的信息更新到telecom/Call中,telecom/Call判斷為視頻電話后會建立VideoCall,并通知InCallUI/Call更新,以此觸發(fā)界面更新。
視頻顯示及傳輸
視頻顯示其實就是在通話界面加兩塊TextureView,一塊用來顯示本機camera拍下的視頻畫面即preview TextureView,一塊用來顯示對端camera拍下來并傳輸過來的視頻畫面即remote TextureView。其具體顯示流程如下:

視頻與語音通話互切
語音通話切視頻通話
如圖:


視頻彩鈴
視頻彩鈴和視頻通話的不同點在于:
1. 視頻彩鈴僅在alerting狀態(tài)顯示,而視頻通話各個狀態(tài)都可以。
2. 視頻彩鈴顯示網(wǎng)絡(luò)端在本端投放的視頻,而視頻通話顯示本端和對端相機拍攝的畫面。
因此,判斷視頻彩鈴的依據(jù)為:
1. call state為alerting。
2. video state僅有RX,沒有TX。
原創(chuàng)內(nèi)容歡迎轉(zhuǎn)載,但請注明出處,謝謝!