融云實時音視頻 SDK 會對市面上的各類智能硬件設(shè)備,特別是各種類型、各種版本的手機進行適配,以確保 SDK 的穩(wěn)定性。但不同于手機的適配,智能硬件的適配有很多不同之處:
1.很多智能硬件的運行內(nèi)存、CPU 性能等硬件配置普遍比手機性能低;2.部分廠商在智能硬件的攝像頭安裝方向、個數(shù)、類型和手機有較大差異。所以在適配問題上,智能硬件需要單獨進行驗證討論,下面就為大家進行詳細解析。
融云實時音視頻 SDK 攝像頭采集數(shù)據(jù)提供 Texture 和 YUV(NV21) 兩種方式,通過設(shè)置不同采集方式可以獲取到 Texture ID 或 byte 原始視頻流數(shù)據(jù)。Texture ID 用來表示圖像照片或者一系列的數(shù)據(jù),使用紋理可以使物體展現(xiàn)更多的細節(jié),YUV 則是攝像頭采集出的 NV21 格式數(shù)據(jù)。
YUV 是一種彩色編碼格式,可以將其理解為原始視頻流數(shù)據(jù),主要用在視頻、圖形處理流水線中(pipeline)。相對于 RGB 顏色空間,設(shè)計 YUV 的目的就是為了編碼、傳輸更方便,減少帶寬占用和信息出錯。
融云實時音視頻 SDK 中默認采用 Texture 方式采集,當本端使用該方式采集時,編碼器默認將使用 android.media.MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface(0x7F000789) 顏色空間進行編碼,如果對端不支持該顏色空間的情況下,可能會導致解碼花屏或者解碼失敗問題,開發(fā)者可以在加入房間之前調(diào)用 RongRTCConfig.Builder#enableVideoTexture 方法設(shè)置是否采用 texture 方式采集。
在遇見智能硬件攝像頭安裝方向、個數(shù)、類型導致的視頻采集問題時,可以通過融云實時音視頻SDK中 RongRTCConfig.Builder 類的設(shè)置方法 setCameraDisplayOrientation 和 setCustomizedCameraParameter,修改攝像機采集的角度和直接設(shè)置給 android.hardware.Camera#setParameters(Parameters params) 配置信息。
融云實時音視頻 SDK 會通過 android.hardware.Camera.getNumberOfCameras() 方法獲取到可用的攝像頭 ID,默認會打開前置攝像頭,對于需要打開魚眼鏡頭或者搭載多個攝像頭硬件設(shè)備場景中,可以使用
RongRTCCapture.getInstance().startCameraCapture 打開、切換;RongRTCCapture.getInstance().switchCamera 指定 ID 的攝像頭。當智能硬件帶有 USB 攝像頭或 USB 麥克風,并且安卓系統(tǒng)無法識別其外置設(shè)備時,調(diào)用上文方法將無法打開硬件設(shè)備(對端將無法觀看本端視頻),這種情況,推薦使用融云實時音視頻 SDK 發(fā)布自定義視頻流功能。
二、視頻編解碼適配
融云音視頻 SDK 支持 H.264 編解碼器,以高壓縮、高質(zhì)量和支持多種網(wǎng)絡(luò)的流媒體傳輸著稱,同時也是 MPEG-4 第十部分,是由ITU-T視頻編碼專家組(VCEG)和ISO/IEC動態(tài)圖像專家組(MPEG)聯(lián)合組成的聯(lián)合視頻組(JVT,Joint Video Team)提出的高度壓縮數(shù)字視頻編解碼器標準,這個標準通常被稱之為H.264/AVC。
使用融云音視頻 SDK 時,可以設(shè)置編碼器顏色空間、編碼等級、編碼幀率、編碼關(guān)鍵幀間隔時間、編碼器碼率控制模式等配置信息,以解決設(shè)備編解碼導致的問題。
融云 RTCLib SDK 中攝像頭采集數(shù)據(jù)采用的顏色格式為 NV21,它屬于 YUV420 格式,如果智能硬件廠商定制了顏色空間,會導致融云 SDK 內(nèi)部處理顏色空間邏輯和設(shè)備所支持顏色空間不符合,出現(xiàn)編碼報錯、對端解碼失敗、對端觀看花屏等現(xiàn)象。遇見此問題,開發(fā)者可以使用 RongRTCConfig.Builder#setHardWareEncodeColor 方法修改編碼顏色空間來解決。
由于視頻編碼后顯示的數(shù)據(jù)質(zhì)量偏低,為了調(diào)整質(zhì)量,就需要設(shè)置編碼等級 level、profile。融云 SDK 默認使用 android.media.MediaCodecInfo.CodecProfileLevel.AVCProfileBaseline ,開發(fā)者也可以通過 RongRTCConfig.Builder#enableHardWareEncodeHighProfile 方法將其設(shè)置為 android.media.MediaCodecInfo.CodecProfileLevel.AVCProfileHigh,AVCProfileHigh 所對應(yīng)的編碼等級為 android.media.MediaCodecInfo.CodecProfileLevel.AVCLevel3,AVCProfileHigh 相對 AVCProfileBaseline 采用了更高級的壓縮特性,這意味著對端在解碼時也需要硬件更高的性能,采用 AVCProfileBaseline 是因為其兼容性更高。安卓源碼中 7.0 版本之前默認使用 AVCProfileBaseline ,7.0 才修改了該邏輯。
安卓 6.0 源碼(android/6.0.1_r16/xref/frameworks/av/media/libstagefright/ACodec.cpp)片段如下:
安卓 7.0 源碼(android/7.0.0_r31/xref/frameworks/av/media/libstagefright/ACodec.cpp)代碼片段如下:
編碼碼率控制模式
對于需要傳輸高質(zhì)量視頻流的場景,除了設(shè)置分辨率、幀率、碼率提高視頻質(zhì)量外,還可以控制編碼碼率,融云 SDK 默認使用 CBR ,開發(fā)者可以使用音視頻 SDK 的 RongRTCConfig.Builder#setHardWareEncodeBitrateMode 方法修改模式設(shè)置。該屬性安卓 5.0 才開始支持參數(shù)設(shè)置,以下是對三種模式的介紹:
編碼關(guān)鍵幀間隔時間
H.264 標準中有 Instantaneous Decoding Refresh(IDR,即時解碼刷新,以下稱 I 幀)。H.264 圖像以序列為單位進行組織,一個序列是一段圖像編碼后的數(shù)據(jù)流,該序列以 I 幀開始,到下一個 I 幀結(jié)束。兩個 I 幀之間為多個 P 幀(Predictive-frame)或 B 幀(Bi-directional predicted frames),設(shè)置的編碼關(guān)鍵幀間隔時間就是 IDR 間隔時間。
I 幀:通常是每個 GOP(Group Of Picture) (MPEG 所使用的一種視頻壓縮技術(shù)) 的第一個幀,I 幀圖像采用幀內(nèi)編碼方式,即只利用了單幀圖像內(nèi)的空間相關(guān)性,而沒有利用時間相關(guān)性。I 幀使用幀內(nèi)壓縮,不使用運動補償,由于 I 幀不依賴其它幀,所以是隨機存取的入點,同時是解碼的基準幀。I 幀主要用于解碼器的初始化,以及節(jié)目的切換和插入,I 幀圖像的壓縮倍數(shù)相對較低,I 幀圖像是周期性出現(xiàn)在圖像序列中的,出現(xiàn)頻率可由編碼器選擇,I 幀壓縮可去掉視頻的空間冗余,而 B、P 則是為了去掉時間冗余。
P 幀:向前參考幀(第一幀之后的幀,只存在和前一幀的差異,可以提高壓縮效率和圖像質(zhì)量),壓縮時只參考前一個幀,屬于幀間編碼方式(即同時利用了空間和時間上的相關(guān)性),P 幀圖像中可以包含幀內(nèi)編碼的部分,即 P 幀中的每一個宏塊可以是前向預(yù)測,也可以是幀內(nèi)編碼;它參考前一個 B 幀或 I 幀來解碼出一張完整的圖像。
B 幀:雙向參考幀,壓縮參考前一幀和后一幀,屬于幀間壓縮技術(shù)。壓縮比高,如果網(wǎng)絡(luò)不好,對實時要求高的話會一直等待,實時互動直播一般不使用,值得注意的是,由于 B 幀圖像采用了未來幀作為參考,因此 MPEG-2 編碼碼流中圖像幀的傳輸順序和顯示順序是不同的。
因為 H.264 采用了多幀預(yù)測,所以 I 幀之后的 P幀可能會參考 I 幀之前的幀,這使得在隨機訪問的時候不能以找到 I 幀作為參考條件,因為即使找到了 I 幀,I 幀之后的數(shù)據(jù)也有可能解不出數(shù)據(jù),而IDR 幀就是一種特殊的 I 幀(這一幀之后的所有參考幀只會參考IDR,而不會參考其他前面的幀)。在解碼器中,一旦收到 IDR 幀,就會立即清理參考幀緩沖區(qū),并將 IDR 幀作為被參考幀。
融云 SDK 中關(guān)鍵幀間隔時間默認為 100 秒,開發(fā)者可以通過 RongRTCConfig.Builder#setHardWareEncodeKeyFrameInterval 方法修改間隔時間,如果該值設(shè)置過小,會加大網(wǎng)絡(luò)流量和編解碼壓力;如果過大,在網(wǎng)絡(luò)有波動情況下,圖像質(zhì)量會下降。以上就是融云在實時音視頻 SDK 對智能硬件視頻適配方面的一些經(jīng)驗,希望能對開發(fā)者朋友們理解智能硬件的適配有所幫助。
fqj
-
視頻
+關(guān)注
關(guān)注
6文章
1942瀏覽量
72885 -
智能硬件
+關(guān)注
關(guān)注
205文章
2345瀏覽量
107525
發(fā)布評論請先 登錄
相關(guān)推薦
評論