使用情景:算法
視頻創建之後,發送方頗有可能會隨意旋轉設備的方向,這樣其採集的數據也是旋轉過的,到了接收方後,顯示就會有問題(如,顛倒等)。爲了維護髮送方和接收方可以實時的同步視頻方向,會話須要協同它們的方向步調。tcp
若是須要支持該功能,須要在發送方invite消息的SDP協議消息中加入如下屬性:ide
a=extmap:7 urn:3gpp:video-orientation,接收方收到之後,也會在響應中加入該tag屬性,這樣就完成了該功能的協商。Tag中的7是擴展數據幀的擴展id,能夠是1-15中的任何一個,用來標識該方向數據的位置,具體參考RFC5285。更多描述參考RCC.07- 2.7.1.2.2。以上所述的視頻方向其實包含了數據的方向和發送方camera的選項(前置或者後置),爲了方便起見,一下都稱爲視頻方向數據。編碼
獲取本身的視頻方向:spa
獲取本身的視頻實時方向,須要用到Android的Display和Surface兩個類,經過他們的配合就能夠獲取出當前camera視頻的方向,最終是一個int值。值得注意的是,這兩個類獲取出來的方向的整數值不必定同樣,這須要看設備的環境,好比先後攝像頭等。視頻
獲取對方的視頻方向:同步
視頻發送方將其視頻方向進行封裝(具體方式見9.3),封裝之後,放在視頻數據幀的一個擴展位置,而後隨視頻幀一塊兒打包後經過rtp/rtcp/udp發送給接收方。接收方收到視頻幀數據後,能夠在幀的擴展位置將視頻方向獲取出來,而後,在實時的調整到surface view上面。這樣,接收方就能夠實時的根據發送方的視頻方向來調整本身的顯示方向。it
具體封裝打包,參考RFC3550。io
視頻方向格式及編解碼class
圖9-1是RCC.07- 2.7.1.2.2中定義的rtp幀中的擴展數據,該數據是用一個8位字節進行編碼的。前面四位是預留位,用於其餘未來用途,後面四位中,從高到低,第一位是視頻發送方camera的選項,可編碼出2種camera選項;後三位是視頻數據的方向,能夠編碼出8種視頻方向。
圖 9-1 視頻方向數據格式
表9-1 發送方的方向編碼
如表9-1所示爲視頻方向中的前4種旋轉編碼。
如表9-2所示爲camera的2中選項編碼。
表9-2 發送方camera選項編碼
這樣配合圖9-1,表9-1和表9-2就能夠完成一幀視頻數據的方向編解碼了,具體以下:
編碼:
將camera選項位和視頻方向位四位編碼後的數據映射成十進制數字,就是該幀方向編碼後的整數值了。好比發送方當前是後置攝像頭而且視頻順時針旋轉了90度,那麼四位編碼則是1011,轉換成十進制就是11,那麼接收方經過幀中的擴展位數據獲得的就是11。
位運算法則:total = (camera << 3) | orientation。
解碼:
接收方的到11後,對應的轉換成二進制就是1011,獲取第四位就是發送方camera的選項,獲取後三位就是視頻的方向。
位運算法則:
Camera = (total & 0x08) >> 3;
Orientation = total & 0x07;