段錄平,李 銳,李 倫
(株洲南車時(shí)代電氣股份有限公司技術(shù)中心,株洲412001)
車載多媒體應(yīng)用非常廣泛,例如車載導(dǎo)航系統(tǒng)、車載閉路電視等,都涉及到音頻、視頻的處理。雖然應(yīng)用較多,但是基于流媒體技術(shù)的車載應(yīng)用案例卻不多見(jiàn),原因在于實(shí)現(xiàn)流媒體技術(shù)的難度相對(duì)較大。但基于流媒體技術(shù)的播放系統(tǒng)有很多優(yōu)點(diǎn),如實(shí)時(shí)、可交互、易擴(kuò)展等。為此,本文設(shè)計(jì)了一種適合車載的嵌入式流媒體播放解決方案。
1996年,由民間自發(fā)成立的互聯(lián)網(wǎng)工程任務(wù)組(IETF)在RFC1889文檔中制定并公布了一個(gè)網(wǎng)絡(luò)實(shí)時(shí)傳輸協(xié)議RTP(Real-time Transport Pro-tocol)。它是專門為交互式音頻、視頻、仿真數(shù)據(jù)等實(shí)時(shí)媒體應(yīng)用而設(shè)計(jì)的協(xié)議,已廣泛應(yīng)用于各種多媒體流傳輸系統(tǒng)中[1]。
RTP協(xié)議是進(jìn)行實(shí)時(shí)流媒體傳輸?shù)臉?biāo)準(zhǔn)協(xié)議和關(guān)鍵技術(shù)。它位于UDP之上,是應(yīng)用層的網(wǎng)絡(luò)傳輸協(xié)議,適合通過(guò)組播和點(diǎn)播傳送實(shí)時(shí)數(shù)據(jù)。但RTP本身不能提供任何傳輸可靠性的保證和流量的擁塞控制機(jī)制,這些服務(wù)需要依靠RTCP(RTP Control Protocol)來(lái)提供。
實(shí)時(shí)流傳輸模型由流媒體服務(wù)器和解碼終端構(gòu)成,如圖1。服務(wù)器端負(fù)責(zé)媒體文件的RTP打包、發(fā)送,實(shí)現(xiàn)媒體數(shù)據(jù)的流傳輸。解碼終端負(fù)責(zé)RTP數(shù)據(jù)包接收和處理,并分析RTCP數(shù)據(jù)包得到當(dāng)前網(wǎng)絡(luò)狀態(tài),并向服務(wù)器端反饋接收質(zhì)量。
實(shí)現(xiàn)流傳輸可以利用一些開(kāi)源免費(fèi)的RTP庫(kù)來(lái)實(shí)現(xiàn),如JRTPLIB、LIBRTP、LiveMedia等。JRTPLIB是一個(gè)用C++語(yǔ)言實(shí)現(xiàn)的開(kāi)源免費(fèi)的RTP開(kāi)發(fā)庫(kù),可運(yùn)行在多個(gè)操作系統(tǒng)上。使用該庫(kù)編程時(shí)可以不用關(guān)心RTCP數(shù)據(jù)包發(fā)送和接收的細(xì)節(jié),這些都由JRTPLIB自動(dòng)完成,因此可簡(jiǎn)化編程。
圖1 RTP實(shí)時(shí)流傳輸模型
1.3.1 發(fā)送端
初始化會(huì)話:使用RTPSession類的構(gòu)造函數(shù)創(chuàng)建一個(gè)會(huì)話對(duì)象實(shí)例,而后調(diào)用該類的Create()方法來(lái)該對(duì)象實(shí)例進(jìn)行初始化。Create()方法有2個(gè)參數(shù):(1)RTPSessionParams類型的參數(shù),用于設(shè)置時(shí)間戳單元,其為必須設(shè)置的參數(shù),不然創(chuàng)建會(huì)話對(duì)象失?。唬?)設(shè)定傳輸規(guī)則的參數(shù),默認(rèn)情況下為UDPIPV4傳輸協(xié)議。
設(shè)置會(huì)話參數(shù):RTP會(huì)話被成功創(chuàng)建后,首先需要設(shè)置數(shù)據(jù)發(fā)送的目標(biāo)地址和目標(biāo)端口。通過(guò)調(diào)用RTPSession類的AddDestination()方法為該會(huì)話加入一個(gè)目標(biāo)地址和端口,允許同一會(huì)話存在多個(gè)目標(biāo)參與者。調(diào)用DeleteDestination()和ClearDestination()方法來(lái)刪除會(huì)話參與者。對(duì)于同一個(gè)RTP會(huì)話,負(fù)載類型、標(biāo)識(shí)和時(shí)間戳增量通常都是相同的,可調(diào)用SetDefaultPayloadType()、SetDefaultMark()和SetDefaultTimeStamp-Increment()方法來(lái)設(shè)置這些默認(rèn)參數(shù)。
發(fā)送數(shù)據(jù):設(shè)置完會(huì)話參數(shù)后,調(diào)用RTPSession類的SendPacket()方法發(fā)送數(shù)據(jù)。若SendPacket()方法被成功調(diào)用,RTCP數(shù)據(jù)報(bào)將自動(dòng)被發(fā)送。
結(jié)束會(huì)話:數(shù)據(jù)傳輸結(jié)束后,必須調(diào)用BYEDestroy()函數(shù)結(jié)束RTP會(huì)話過(guò)程。
1.3.2 接收端
初始化:初始化過(guò)程與發(fā)送端相似,不同的是不需要設(shè)定目標(biāo)地址和目標(biāo)端口。
遍歷數(shù)據(jù)源:首先需要調(diào)用RTPSession類的PollData()方法接收所有源發(fā)送過(guò)來(lái)的RTP/RTCP數(shù)據(jù)報(bào),再調(diào)用RTPSession類的GotoFirst-SourceWithData()和GotoNextSource-WithData()方法來(lái)遍歷那些帶有數(shù)據(jù)的源。
抽取數(shù)據(jù):檢測(cè)出有效的數(shù)據(jù)源之后,調(diào)用RTPSession類的GetNextPacket()方法返回一個(gè)RTPPacket類型的指針。通過(guò)這個(gè)指針調(diào)用Get-PayloadData()方法獲取實(shí)際需要的數(shù)據(jù)。還有其他相關(guān)函數(shù)可從數(shù)據(jù)報(bào)中提取出SSRC、時(shí)間戳、CSRC以及負(fù)載類型等信息。數(shù)據(jù)提取完成之后必須調(diào)用DeletePacket()來(lái)釋放RTPPacket內(nèi)存。
Au1250有以下幾個(gè)顯著的優(yōu)點(diǎn):
(1)處理器工作頻率較高。最高可達(dá)700 MHz。其自帶的DDR SDRAM控制器最高支持DDR400和DDR2 533,為高速數(shù)據(jù)處理提供支持。(2)功耗低。提供2種休眠模式,降低了系統(tǒng)功耗,減少發(fā)熱量。(3)集成多媒體加速引擎(MAE)。不需要外部DSP電路就能實(shí)現(xiàn)視頻的硬件解碼播放,可減少外部視頻處理的復(fù)雜度。硬件上支持MPEG2、MPEG4、H.263、WMV9等多種視頻解碼。(4)集成的靜態(tài)總線控制器,支持NorFlash、NandFlash、IDE、CF/PCMCIA等多種存儲(chǔ)外設(shè)。只需要很少的外部器件即可方便擴(kuò)展系統(tǒng)存儲(chǔ)。(5)外圍接口豐富。包括GPIO、USB、UART、VGA、LCD、Audio、SD以及攝像頭等接口。
Au1250的主電路由處理器、電源、存儲(chǔ)器、外設(shè)接口等組成。
(1)處理器:采用Alchemy Au1250,這是一款MIPS架構(gòu)的低功耗、高性能處理器,支持Win CE,Linux等操作系統(tǒng),主頻可達(dá)700MHz功耗低于400 mw,集成媒體加速引擎MAE,支持多種媒體格式。
(2)電源:解碼板使用4種電壓,5 V,3.3 V,1.8 V和1.2 V。5 V是解碼板的輸入電壓,采用3顆TPS62040開(kāi)關(guān)電源芯片將5V轉(zhuǎn)為3.3 V,1.8 V和1.2 V,最大輸出電流為1.2 A。
(3)存儲(chǔ)器:主要是內(nèi)存儲(chǔ)器。內(nèi)存由Flash和DDR2共同組成,主要功能是存儲(chǔ)并運(yùn)行BootLoader、驅(qū)動(dòng)程序以及應(yīng)用程序等。
(4)外設(shè)接口:采用的接口有RS232串口、10/100M、VGA,Audio以及USB口。串口主要用于底層程序調(diào)試和下載等。
整個(gè)軟件開(kāi)發(fā)是基于Linux操作系統(tǒng)。RTP傳輸層實(shí)現(xiàn)采用第三方開(kāi)源庫(kù)JrtpLib v3.4.0,它完全遵循RFC標(biāo)準(zhǔn)設(shè)計(jì),支持Linux、Windows等多個(gè)操作系統(tǒng)平臺(tái)。播放應(yīng)用軟件開(kāi)發(fā)需要 RMI官方提供的MAI Engine SDK支持,它為音頻、視頻軟硬件解碼提供接口支持。
Au1250芯片集成了硬件解碼單元MAE,視頻數(shù)據(jù)經(jīng)過(guò)MAE硬解碼后被直接輸送到VGA顯示。車載應(yīng)用需借助GUI來(lái)顯示。嵌入式GUI設(shè)計(jì)有多種開(kāi)發(fā)工具可選,如Qt、MiniGUI等。
基于MAE的播放系統(tǒng)主要包括4個(gè)基礎(chǔ)模塊:File Reader模塊、Demux模塊、Decoder模塊和Render模塊。為實(shí)現(xiàn)RTP流播放,需要在原播放系統(tǒng)的基礎(chǔ)上增加一個(gè)RTP接收處理模塊。除RTP模塊外,其它模塊都以共享庫(kù)的方式加載,裝載后以線程的形式獨(dú)立運(yùn)行,而模塊與模塊之間共用一塊緩沖區(qū),通過(guò)PV操作模式進(jìn)行數(shù)據(jù)流的傳輸,由MAI Engine負(fù)責(zé)協(xié)調(diào)。
(1)RTP模塊
該模塊是利用JRTPLib庫(kù)開(kāi)發(fā),主要實(shí)現(xiàn)RTP流的接收和處理,并將處理后的數(shù)據(jù)寫入文件緩沖區(qū)供Reader模塊使用。
(2)Reader模塊
該模塊主要實(shí)現(xiàn)從文件緩沖區(qū)讀取RTP模塊處理過(guò)的數(shù)據(jù),按照Demux模塊的數(shù)據(jù)緩沖區(qū)大小要求寫入該緩沖區(qū),并對(duì)流媒體數(shù)據(jù)類型進(jìn)行檢測(cè),依據(jù)檢測(cè)結(jié)果調(diào)用相應(yīng)的庫(kù)文件進(jìn)行解復(fù)用。提供的接口主要有MAICompSetStream()設(shè)定數(shù)據(jù)源,MAICompReadBuffer()讀緩沖區(qū)和MAICompWriteBuffer()寫緩沖區(qū)。調(diào)用MAIengine_AutoConnect()引擎接口可以自動(dòng)完成Demux、Decoder和Render功能。
(3)Demux模塊
該模塊從緩存區(qū)讀到數(shù)據(jù)后根據(jù)多媒體文件的類型動(dòng)態(tài)加載相應(yīng)的Demux庫(kù)文件對(duì)數(shù)據(jù)進(jìn)行解析復(fù)用,分解后的音頻流送Audio decoder進(jìn)行解碼,視頻流則送VideoDecoder進(jìn)行解碼。支持庫(kù)包括Libmaimpeg2demux.so和Libmaimpeg4demux.so。Demux模塊內(nèi)部調(diào)用MAIDemux_GetBuffer()讀緩沖區(qū)數(shù)據(jù),并調(diào)用Demux-Thread()函數(shù)對(duì)數(shù)據(jù)進(jìn)行解復(fù)用,最后調(diào)用MAIDemux_PutBuffer()寫緩沖區(qū)。
(4)Decoder模塊
該模塊根據(jù)解碼復(fù)用后的音頻、視頻格式裝載相應(yīng)的解碼庫(kù)文件。對(duì)于音頻數(shù)據(jù)的解碼由Audio-Decoder模塊完成,音頻解碼后直接送往Audio-Render模塊驅(qū)動(dòng)硬件發(fā)出聲音。視頻數(shù)據(jù)則由Video-Decoder模塊初步解碼后送到MAE的前端進(jìn)行處理,前端處理不支持的視頻格式(如H.264)須經(jīng)軟件解碼形成YUV數(shù)據(jù),再將YUV數(shù)據(jù)輸送到MAE的后端做處理。
(5)Render模塊
該模塊主要實(shí)現(xiàn)對(duì)音頻、視頻數(shù)據(jù)進(jìn)行渲染并實(shí)現(xiàn)同步。音頻數(shù)據(jù)渲染后送到音頻輸出設(shè)備,視頻數(shù)據(jù)渲染由MAE的前端處理完成后,再送到MAE的后端進(jìn)行解碼播出。渲染操作由MAIEngine自動(dòng)完成,它沒(méi)有提供用于渲染的上層接口函數(shù)。支持渲染的庫(kù)文件有Libmaiaudrend.so和Libmaividrend.so。
本文提出了一種基于Au1250處理器的嵌入式車載流媒體播放終端設(shè)計(jì)與實(shí)現(xiàn)方案,該方案在硬件方面具有功耗低、支持硬件解碼的優(yōu)點(diǎn),不需要外圍DSP電路即可實(shí)現(xiàn)視頻數(shù)據(jù)的硬件解碼,從而簡(jiǎn)化了電路設(shè)計(jì);軟件方面,利用外部免費(fèi)開(kāi)源的JRTPLIB庫(kù)來(lái)實(shí)現(xiàn)流媒體傳輸和接收,在MAI Engine SDK支持的基礎(chǔ)上實(shí)現(xiàn)對(duì)RTP流媒體數(shù)據(jù)的解碼播放功能。
[1] 張占軍,韓承德,楊學(xué)良. 多媒體實(shí)時(shí)傳輸協(xié)議RTP[J] .計(jì)算機(jī)工程與應(yīng)用,2001(4):9-11