背景
以下內容基于Android P code。
主要差異
視頻通話比語音通話主要是多了判斷是否為視頻通話,及視頻的顯示和傳輸。如下:
界面通過IVideoProvider控制camera的顯示并設置TextureView等,Ims service通過IVideoCallback來通知一些media的更新。如下
判斷是否為視頻通話
視頻通話同ims語音通話邏輯幾乎相同,不一樣的地方在于他們的video state不同,因為應用通過video state來判斷是否為視頻通話。
設置video state及通過video state更新界面的流程如下:
1. 撥號時,撥號盤調用TelecomManager#placeCall()的參數中帶有video state,Telecom將這個video state傳給Telephony,并放入Phone的參數中,CallTracker在撥號時會把這個video state轉換成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更新,以此觸發界面更新。
視頻顯示及傳輸
視頻顯示其實就是在通話界面加兩塊TextureView,一塊用來顯示本機camera拍下的視頻畫面即preview TextureView,一塊用來顯示對端camera拍下來并傳輸過來的視頻畫面即remote TextureView。其具體顯示流程如下:
視頻與語音通話互切
語音通話切視頻通話
如圖:
視頻彩鈴
視頻彩鈴和視頻通話的不同點在于:
1. 視頻彩鈴僅在alerting狀態顯示,而視頻通話各個狀態都可以。
2. 視頻彩鈴顯示網絡端在本端投放的視頻,而視頻通話顯示本端和對端相機拍攝的畫面。
因此,判斷視頻彩鈴的依據為:
1. call state為alerting。
2. video state僅有RX,沒有TX。
原創內容歡迎轉載,但請注明出處,謝謝!