張士宏 馮沖
摘要:本文對Android原生camera系統(tǒng)實時視頻流處理方案進行深入研究的基礎上,結合現(xiàn)在車載camera設備特點,提出一種新的實時視頻流傳輸策略,很好地滿足了車載定制化需求,非常適合智能座艙系統(tǒng)對各種車載camera設備的應用場景。
Abstract: Based on the in-depth study of the real-time video stream processing solution of the Android native camera system, this article proposes a new real-time video stream transmission strategy based on the characteristics of the current vehicle camera equipment, which satisfies the needs of vehicle customization and is very suitable The application scenarios of the smart cockpit system to various on-board camera equipment.
關鍵詞:Android;camera;智能座艙
中圖分類號:TP311.52? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?文獻標識碼:A? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 文章編號:1674-957X(2021)01-0211-02
1? 車載娛樂系統(tǒng)中camera的廣泛使用
車載信息娛樂系統(tǒng)(In-Vehicle Infotainment,簡稱IVI)是一類基于車身總線系統(tǒng)和網絡服務的獨立綜合信息處理系統(tǒng),通常要支持實時路況、三維導航、輔助駕駛、故障檢測、車輛信息、車身控制、移動辦公、無線通訊、基于在線的娛樂功能及TSP服務等一系列車載應用。IVI系統(tǒng)極大的提升的車輛電子化、網絡化和智能化水平,是未來汽車智能化發(fā)展中智能座艙的重要組成部分[1]。
攝像頭設備(camera)在汽車電子領域尤其在IVI系統(tǒng)和ADAS系統(tǒng)中有著廣泛的使用。車載camera捕捉實時視頻圖像,為汽車提供了感知周圍環(huán)境和車內情況的第一手視覺信息,IVI系統(tǒng)和ADAS系統(tǒng)中的相機系統(tǒng)、視頻會議系統(tǒng)、360環(huán)視系統(tǒng)、倒車影像系統(tǒng)、流媒體后視鏡系統(tǒng)、行車記錄儀系統(tǒng)、車道偏離檢測系統(tǒng)、防碰撞預警系統(tǒng)、交通標志識別系統(tǒng)、車輛周圍盲點監(jiān)控系統(tǒng)、駕駛人注意力監(jiān)控系統(tǒng)、遠程視頻監(jiān)控系統(tǒng)等功能都需要借助車載camera來實現(xiàn)。車載camera主要包括前視攝像頭、后視攝像頭、側視攝像頭、環(huán)視攝像頭、內視攝像頭等。以特斯拉Autopilot 2.0 L2級系統(tǒng)為例,該車擁有三個前視攝像頭、三個后視攝像頭、兩個側視攝像頭,八個攝像頭協(xié)同工作是特斯拉能夠實現(xiàn)自動駕駛的基礎之一[2]。除了傳統(tǒng)的有線傳輸型設備外,車載camera目前普遍采用的另一類設備是網絡camera。網絡camera是傳統(tǒng)攝像頭技術、數據信號處理技術與網絡技術結合的產物。
2? Android原生camera系統(tǒng)實時視頻流傳輸策略分析
Android原生camera系統(tǒng)是Android內部最重要也是最為復雜的子系統(tǒng)之一,在Android 8.0之后camera系統(tǒng)的架構已演進到FW+HAL+Kernel這種經典構成,camera詳細架構如圖1所示。
從新的camera子系統(tǒng)架構可知,它完全符合Treble框架,同時FW層服務和HAL層分別在兩個獨立的服務進程中。重新設計的Camera API大幅提升了應用對于 Android 設備上的camera子系統(tǒng)的控制能力,同時極大地提高了camera子系統(tǒng)效率和可維護性。
camera子系統(tǒng)FW層可分為服務層和native層,它通過一個承上啟下的服務進程CameraService統(tǒng)一管理這FW內部的流程和通信。在FW中,CameraManager通過CameraManagerGlobal訪問CameraServiceNative服務,并注冊CamreaServiceNative的回調監(jiān)聽,CameraServiceNative持有CameraServiceListener列表,并將回調結果給CameraManager。CameraServiceNative服務會實例化一個了CameraDeviceClient,CameraDeviceClient會去創(chuàng)建Camera3Device。CameraDeviceClient包含了camera子系統(tǒng)大部分基礎業(yè)務功能,包括發(fā)起預覽(preview)及預覽數據流處理、拍照及錄像數據流處理等[3]。Camera3Device負責native中所有stream相關的創(chuàng)建和管理工作,在Camera3Device主要存在Camera3OutputStream和Camera3InputStream兩種stream,前者主要作為HAL層的輸出,是請求HAL層填充數據的output流,后者是由Framework將Stream進行填充。無論是Preview、record還是capture均是從HAL層獲取數據,故都會以output流的形式存在。
camera子系統(tǒng)Hal層可分為服務層和設備so庫,服務層通過動態(tài)加載的方式去調用設備庫so庫中的各個接口。Camera Hal服務層主要由CameraProvider、CameraDevice和CameraDeviceSession三個模塊以及對應HIDL接口組成。CameraProvider主要用于枚舉單個設備并管理各個設備狀態(tài),是Camera Hal服務層的核心。CameraProvider不直接調用camera設備so庫,而是通過CameraDevice去操作。在進行拍照/錄像的流程中,活躍的相機設備會話由CameraDeviceSession管理和實現(xiàn)。camera設備so庫會通過ioctrl去調用v4l2驅動,以實現(xiàn)對camera物理設備的各種操作。v4l2驅動是Linux內核中針對video設備的一套完整的驅動框架,可實現(xiàn)豐富的功能。
應用層在發(fā)起視頻采集請求時,會根據應用場景不同分成預覽、拍照、錄像、快拍等類型圖像幀數據request,F(xiàn)W層會先根據camera系統(tǒng)記錄的設備信息判斷是否可以滿足應用層的需求。FW層確認可以滿足會把圖像幀數據request轉化到FW native層,Camera3Device將request打包封裝并通過CameraProviderManager的HIDL接口發(fā)送到Hal服務層。Hal層的CameraDevice會將request放到CameraDeviceSession中去判斷并執(zhí)行,CameraDeviceSession循環(huán)調用camera設備so庫中接口通過v4l2驅動從camera物理設備中獲取實時視頻數據楨并通過callback回調的方式把result反饋給FW native層,最終反饋給應用層[3]。
Android原生的這套camera子系統(tǒng)架構是完全根據傳統(tǒng)有線連接的物理camera設備的特點和Linux v4l2驅動的流程去設計實現(xiàn)的,但是目前采用Android的車機IVI系統(tǒng)中很少采用傳統(tǒng)有線連接物理camera設備而是更多的采用網絡camera設備去承擔實時視頻數據的采集功能,顯然需要對camera子系統(tǒng)架構的原生視頻流傳輸策略進行重新設計和優(yōu)化才能滿足車載camera系統(tǒng)的豐富需求。
3? Android原生camera系統(tǒng)實時視頻流傳輸策略改進
梳理車載camera實時視頻流傳輸特點可知,camera物理設備類型豐富但普遍采用網絡camera,這些網絡camera大多支持一種或多種適用于流媒體數據傳輸的網絡應用協(xié)議(包括但不限于RTSP、RTMP、HLS等),網絡傳輸的流媒體數據采用諸如H.264/AVC等編碼格式的視頻流數據[4][5]。從前文深度分析的Android原生camera子系統(tǒng)架構可知,camera子系統(tǒng)的設計是一種類似于管道的方式,從內核中采集并傳遞給Hal層后數據經過層層封裝和轉發(fā)會通過FW層直接傳遞給應用層,這期間視頻流數據是封裝在“管道”中不對外暴露的。內核是視頻流數據的生產者,Hal層和FW層是視頻流數據的傳輸者,應用層是視頻流數據的消費者。由于網絡camera改變了生產者產生數據的模式,結合網絡camera和Android camera子系統(tǒng)的特點,提出以下實時視頻流傳輸改進策略,如圖2所示。
改進后的傳輸策略引入了Linux系統(tǒng)中虛擬camera的理念,將原生v4l2驅動更換為v4l2loopback,這樣在不大量修改Android中camera FW層和Hal層的結構就可以直接從v4l2loopback獲取camera實時視頻流數據。需要注意的是由于v4l2loopback并不支持v4l2的所有功能,需要在camera Hal層做少量的配套開發(fā)工作來適配v4l2loopback的一些特性,包括camera設備的開關以及camera參數的獲取和設置。需要在Hal層設計一個網絡中間件,負責操控網絡camera并與它進行通信,同時網絡中間件一個重要工作是把獲取的流媒體數據轉換為v4l2loopback需要的yuv、jpeg等格式的圖像幀數據。網絡中間件可以是一個獨立的系統(tǒng)服務進程,camera Hal通過IPC方式與該服務進程進行通信并可對其進行操作,進而間接操作網絡camera。
4? 總結
為了適應IVI系統(tǒng)對不同類型camera設備的需求,本文在對Android原生camera系統(tǒng)實時視頻流處理方案進行深入研究的基礎上,結合現(xiàn)在車載camera設備特點以及流媒體傳輸的特點,提出一種新的實時視頻流傳輸策略,開發(fā)難度小且靈活性極強,很好地滿足了車載定制化需求,非常適合未來智能座艙系統(tǒng)對各種車載camera設備的應用場景。
參考文獻:
[1]張曉聰.汽車智能座艙發(fā)展現(xiàn)狀及未來趨勢[J].汽車縱橫,2019(8):42-45.
[2]王鵬.視覺傳感器在智能汽車上的應用[J].汽車實用技術,2019(23):41-43.
[3]李韋鵬,王小雪.基于Android平臺相機開發(fā)技術的研究[J].電腦知識與技術,2017,13(9):63-64,94.
[4]姜海嵐,程琳.Android平臺下實時視頻傳輸的關鍵技術及研究[J].電腦知識與技術,2018,14(34):27,29.
[5]何俊林.Android音視頻開發(fā)[M].北京:電子工業(yè)出版社,2018.11.