程雷陽
(北京中電慧視科技有限公司,北京 100015)
乘客信息系統(tǒng)(Passenger Information System,PIS)是地鐵列車為乘客提供到站等廣播服務(wù)和新聞、娛樂等各種資訊的綜合性信息系統(tǒng),在火災(zāi)、緊急疏散等突發(fā)情況下,系統(tǒng)可以提供緊急通知,因此也被稱為車載多媒體信息系統(tǒng)。隨著網(wǎng)絡(luò)和數(shù)字多媒體技術(shù)的發(fā)展,車載多媒體信息系統(tǒng)也逐漸要走向高清化、數(shù)字化,同時也引入了地面數(shù)字直播視頻源來滿足乘客對實時資訊的需求[1]。基于此,本文提出了一種基于瑞芯微平臺的車載高清流媒體客戶端的設(shè)計方案,并成功進行了相關(guān)測試。播放系統(tǒng)由流傳輸設(shè)施和解碼終端組成,前端流媒體發(fā)送采用模擬視頻流服務(wù)器的形式,播放終端與媒體服務(wù)器之間通過以太網(wǎng)相連,本文主要考慮在IP層的廣泛應(yīng)用上,結(jié)合有線的數(shù)據(jù)鏈路層特點,采用RTP/RTCP流媒體協(xié)議在UDP傳輸層進行傳輸[2]。流媒體終端設(shè)備能夠充分滿足車載工作要求,系統(tǒng)功能穩(wěn)定性良好。軟件程序啟動速度快并且支持多協(xié)議,視頻播放流暢,音頻無雜音存在,音視頻同步功能較好。這款跨平臺的嵌入式流媒體播放系統(tǒng)可以很好地實現(xiàn)車載視頻播放功能。
瑞芯微公司提供的媒體處理軟件平臺(Media Process Platform,MPP)是適用于瑞芯微芯片系列的通用媒體處理軟件平臺。該平臺對應(yīng)用軟件屏蔽了芯片相關(guān)的復(fù)雜底層處理,屏蔽不同芯片的差異,為使用者提供統(tǒng)一的視頻媒體處理接口(Media Process Interface,MPI)。
MPP提供了視頻解碼功能,解碼類型涵蓋了H.265/H.264/H.263/VP9/VP8/MPEG4/MPEG2/MPEG1/VC1/MJPEG,視頻編碼功能支持H.264/VP8/MJPEG,同時也提供了多種視頻處理功能,如視頻拷貝、縮放、色彩空間轉(zhuǎn)換以及場視頻解交織等。平臺系統(tǒng)框架的層次如圖1所示.
圖1 MPP系統(tǒng)框架
硬件層是瑞芯微系列芯片平臺的視頻編解碼硬件加速模塊,包括VPU,rkvdec,rkvenc等不同類型、不同功能的硬件加速器。
內(nèi)核驅(qū)動層包含Linux內(nèi)核的編碼器硬件設(shè)備驅(qū)動以及相關(guān)的內(nèi)存管理單元、內(nèi)存、時鐘、電源管理模塊等,支持的平臺主要是Linux kernel 3.10和4.4兩個版本。MPP庫對于內(nèi)核驅(qū)動有依賴。
用戶態(tài)的MPP層屏蔽了不同操作系統(tǒng)和不同芯片平臺的差異,為上層使用者提供統(tǒng)一的MPI接口。MPP層包括MPI模塊、OSAL模塊、HAL模塊以及視頻編解碼器Video Decoder/Video Encoder和視頻處理功能模塊(Video Process)。
操作系統(tǒng)層是MPP用戶態(tài)的運行平臺,如Android以及Debian等Linux發(fā)行版。本文最終應(yīng)用的實現(xiàn)基于Debian的發(fā)行版。
MPP層通過MPI對接各種中間件軟件,可以采用的中間件軟件有OpenMax,ffmpeg和gstreamer。如果使用開源的FFmpeg庫解碼解封裝獲得流式數(shù)據(jù),基于Qt應(yīng)用程序中的OpenGL庫顯示平面視頻幀數(shù)[3]。gstreamer中的playbin2元件可以節(jié)省開發(fā)人員的精力,進一步縮短產(chǎn)品的開發(fā)周期,如所用的解碼器支持多種格式的解碼,就可以增加產(chǎn)品對多媒體類型的支持[4]。本文最終實現(xiàn)采用的中間件軟件為gstreamer。
由于視頻編解碼與視頻處理過程需要處理大量的數(shù)據(jù)交互,包括碼流數(shù)據(jù)、圖像數(shù)據(jù)以及內(nèi)存數(shù)據(jù),同時還要處理與上層應(yīng)用以及內(nèi)核驅(qū)動的交叉關(guān)系,所以MPP設(shè)計了MPI接口,用于與上層交互。MPI接口使用的主要數(shù)據(jù)結(jié)構(gòu)如圖2所示。
圖2 MPI接口數(shù)據(jù)結(jié)構(gòu)
MppPacket為一維緩存封裝,可以從MppMem和MppBuffer生成,主要用于表示碼流數(shù)據(jù)。MppFrame為二維幀數(shù)據(jù)封裝,可以從MppMem和MppBuffer生成,主要用于表示圖像數(shù)據(jù)。使用MppPacket和MppFrame,就可以簡單有效地完成一般的視頻編解碼工作。以視頻解碼為例,碼流輸入端把地址和大小賦值給MppPacket,通過put_packet接口輸入,在輸出端通過get_frame接口得到輸入圖像MppFrame,即可完成最簡單的視頻解碼過程,部分偽代碼如圖3和圖4所示。
圖4 視頻流輸出顯示
MPI(Media Process Interface)是 MPP提供給用戶的接口,用于提供硬件編解碼功能以及一些必要的相關(guān)功能。MPI通過C結(jié)構(gòu)里的函數(shù)指針方式提供給用戶。用戶可以通過MPP上下文結(jié)構(gòu)MppCtx與MPI接口結(jié)構(gòu)MppApi組合使用來實現(xiàn)解碼器與編碼器的功能。用戶可以通mpp_create接口獲取MppCtx實例以及MppApi結(jié)構(gòu)體,再通過mpp_init來初始化MppCtx的編解碼類型與格式之后通過decode_xxx/encode_xxx以及poll/dequeuer/enqueue接口進行訪問,使用結(jié)束時通過mpp_destroy接口進行銷毀,過程如圖5所示。
圖5 MPI相關(guān)函數(shù)
gstreamer是一個用于開發(fā)流媒體應(yīng)用的開源框架,采用了基于插件(plugin)和管道(pipeline)的體系結(jié)構(gòu)??蚣苤兴械墓δ苣K都被實現(xiàn)成可以插拔的組件(component),并且能很方便地安裝到任意一個管道上。rockchipmpp是瑞芯微公司開發(fā)的一個gstreamer插件,主要是為了把自己的MPP與gstreamer結(jié)合起來。使用者基于gstreamer開發(fā)一個應(yīng)用程序時,使用gst/gst.h即可訪問庫文件中的函數(shù)。除此之外,還需要初始化gstreamer library。本文使用gst_init初始化,它的主要功能如下:
(1)初始化gstreamer庫;
(2)注冊內(nèi)部Element;
(3)加載插件列表,掃描列表中及相應(yīng)路徑下的插件;
(4)解析并執(zhí)行命令行參數(shù)。
構(gòu)建了所有必需的gstreamer插件之后,需要借助gstreamer來構(gòu)建從Debian基于Qt環(huán)境的媒體播放器組件VideoView的接口,利用MPP框架提供媒體處理服務(wù)。在這些步驟中,可以使用gstreamer框架中的一些低級別元素來構(gòu)建媒體播放器,不過采用這種方法相對復(fù)雜。例如,針對一個特定的剪輯視頻,首先要分析它屬于哪種視頻容器格式,然后根據(jù)不同的視頻容器格式,使用不同的解碼元素,并且需要連接傳輸管道中所涉及的基本元素,這樣才能使得整個視頻處理步驟運行起來。由于不同的視頻剪輯對應(yīng)不同的處理元素,為了保證實用性和穩(wěn)定性,本文使用gstreamer的高級別元素“Playbin2”來啟動傳輸管道,之后,添加條總線到Playbin2,讓視頻數(shù)據(jù)和視頻處理事件流入總線,最后啟動傳輸管道和總線[5]。
RK3568是一款定位中高端的通用型系統(tǒng)級芯片,采用22 nm先進制程工藝,主要面向工業(yè)互聯(lián)網(wǎng)、HMI、NVR存儲、車載中控以及工業(yè)網(wǎng)關(guān)等領(lǐng)域。CPU采用四核64位Cortex-A55,主頻最高2.0 GHz,是一款非常優(yōu)秀的通用型SoC。同時,RK3568內(nèi)嵌高性能2D加速硬件,可支持JPEG硬解碼、雙網(wǎng)口、三屏異顯以及多PCIESATA接口,本身集成神經(jīng)網(wǎng)絡(luò)處理器(Neural-network Processing Unit,NPU),其特性在圖片處理、存儲、通信、多功能外設(shè)等應(yīng)用場景可發(fā)揮獨特的優(yōu)勢。
操作系統(tǒng)軟件平臺采用Debian 10,集成開發(fā)環(huán)境采用Qtcreator,采用Qt圖形界面的方式來實現(xiàn),Qt層面調(diào)用瑞芯微提供的gstreamer的插件rockchipmpp,前端流媒體數(shù)據(jù)發(fā)送采用使用WinSend發(fā)送UDP組播流,組播流地址為UDP://239.1.1.1:8208,如圖6所示。
圖6 測試發(fā)送UDP組播TS視頻流
首先使用WinSend模擬發(fā)送2 Mb·s-1的TS碼流,測試終端播放狀態(tài)。播放狀態(tài)如圖7所示。
圖7 2 Mb·s-1的TS流媒體解碼效果
使用WinSend模擬發(fā)送4 Mb·s-1的TS碼流,測試終端播放狀態(tài)。播放狀態(tài)如圖8所示。
圖8 4 Mb·s-1的TS流媒體解碼效果
兩種狀態(tài)均采用硬解碼實現(xiàn),CPU占用率為32%。實際測試有較多性能富余,可用于處理其他業(yè)務(wù)邏輯。實際CPU占用率如圖9所示。
圖9 硬解碼CPU占用率
本文基于瑞芯微RK3568平臺,使用平臺提供的MPP框架,同時采用gstreamer插件的形式對MPP框架視頻硬解碼接口進行實現(xiàn)和調(diào)用,實現(xiàn)了車載流媒體的硬解碼方案,實測解碼達到設(shè)計的預(yù)期效果,CPU占用率較低,可以有富余的資源處理其他業(yè)務(wù)邏輯,實測解碼顯示效果良好、穩(wěn)定,滿足軌道交通車載媒體系統(tǒng)的使用需求。