李飛
摘 要: 設(shè)計(jì)了一種基于嵌入式系統(tǒng)的高清晰、便攜式的車(chē)載播放系統(tǒng)。該播放系統(tǒng)的軟件設(shè)計(jì)以Mplayer為后臺(tái),實(shí)現(xiàn)對(duì)音視頻文件的解碼播放等工作,并以Qt的基礎(chǔ)類(lèi)庫(kù)為基礎(chǔ)設(shè)計(jì)了嵌入式多媒體播放器的前端控制圖形界面,通過(guò)創(chuàng)建QProcess進(jìn)程,實(shí)現(xiàn)對(duì)播放過(guò)程的控制,與后臺(tái)Mplayer進(jìn)行通信,實(shí)時(shí)獲取并顯示播放信息,并在指定窗口對(duì)音視頻碼流進(jìn)行輸出顯示。
關(guān)鍵詞: 汽車(chē)多媒體; 車(chē)載播放; 嵌入式系統(tǒng); 多媒體播放器
中圖分類(lèi)號(hào): TN919?34; TM417 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2016)09?0149?04
Abstract: A highly definite and portable vehicle?mounted broadcast system based on embedded system was designed. The software design of this broadcast system takes Mplayer as the background to realize the decoding and broadcast work of the audio and video files. The front?end control graphical interface of the embedded multimedia player was designed based on Qt foundation class library. The QProcess process was established to control the broadcast process, communicate with background Mplayer, acquire and display the broadcast information in real time, and output and display the audio and video code stream at the specified window.
Keywords: automobile multimedia; vehicle?mounted broadcast; embedded system; multimedia player
目前,國(guó)內(nèi)車(chē)載電子設(shè)備市場(chǎng)極度缺乏多媒體綜合軟件,該軟件能有效地將車(chē)載導(dǎo)航、影音圖像、倒車(chē)?yán)走_(dá)、娛樂(lè)互動(dòng)等多個(gè)功能整合,方便乘客和車(chē)主的使用[1]。將多種娛樂(lè)和使用功能整合統(tǒng)一,使得設(shè)備簡(jiǎn)潔美觀,同時(shí)降低了重復(fù)安裝的成本和投入。可以極大地減少車(chē)內(nèi)空間消耗,降低整車(chē)油耗[2]。多媒體共屏展示也能保證駕駛員的操作強(qiáng)度,保證行車(chē)安全。因此,將行車(chē)信息、娛樂(lè)互動(dòng)、交流通信、車(chē)載導(dǎo)航等功能集于一體的嵌入式綜合媒體系統(tǒng)符合市場(chǎng)和環(huán)境的發(fā)展要求[3]。
1 車(chē)載嵌入式播放器總體設(shè)計(jì)
出于應(yīng)用領(lǐng)域、自帶資源、可擴(kuò)展資源、功耗等多方面的考慮,選擇Linux 內(nèi)核為嵌入式多媒體播放器的操作系統(tǒng)核心。將多媒體技術(shù)應(yīng)用于嵌入式系統(tǒng)中面臨著諸多的技術(shù)難題,嵌入式設(shè)備的特點(diǎn)決定了其資源通常非常有限,而有限的資源意味著需要進(jìn)行多方面技術(shù)的優(yōu)化[4]。
首先,嵌入式設(shè)備采用蓄電池提供能源,所以對(duì)系統(tǒng)的功耗要求比較嚴(yán)格;第二,嵌入式設(shè)備上通常沒(méi)有實(shí)用的圖像加速器,聲卡等硬件加速設(shè)備的支持;第三,不存在DirectX,DirectShow等高層多媒體的支持?;谏鲜隹紤],有必要設(shè)計(jì)適用于嵌入式應(yīng)用的嵌入式處理器,嵌入式操作系統(tǒng)。根據(jù)嵌入式多媒體播放器的功能需求及技術(shù)特點(diǎn),通常將嵌入式多媒體播放器的體系結(jié)構(gòu)劃分為硬件層、內(nèi)核層和應(yīng)用層,具體如圖1所示。
系統(tǒng)的硬件層的硬件平臺(tái)包括嵌入式微處理器和外圍設(shè)備,通過(guò)合理選型和匹配可以完成滿意的底層硬件組合。本系統(tǒng)的嵌入式MCU使用三星公司的S3C2410高速微處理器,S3C2410高速微處理器作為整個(gè)硬件系統(tǒng)的控制核心,接收、處理相關(guān)數(shù)據(jù)并實(shí)時(shí)發(fā)出控制指令。與其配合的系統(tǒng)外圍設(shè)備是完成系統(tǒng)功能的必要組建和模塊,涉及系統(tǒng)存儲(chǔ)模塊FLASH和E2PROM,LCD輸出單元、主控外圍電路和音頻輸出模塊等。
軟件部分包含應(yīng)用層和內(nèi)核層兩個(gè)部分。應(yīng)用層包含嵌入式Linux操作系統(tǒng)和硬件驅(qū)動(dòng)程序,包括BootLoader, Linux內(nèi)核,根文件系統(tǒng)3部分。應(yīng)用層包含嵌入式用戶(hù)應(yīng)用程序、音頻解碼器和GUI。本系統(tǒng)選擇嵌入式Linux操作系統(tǒng)作為操作系統(tǒng)[5]。
2 操作系統(tǒng)平臺(tái)的構(gòu)建
內(nèi)核是整個(gè)Linux系統(tǒng)的核心,根據(jù)實(shí)際情況針對(duì)內(nèi)核的配置進(jìn)行選擇,本質(zhì)上指根據(jù)開(kāi)發(fā)系統(tǒng)的功能需求對(duì)已有的操作系統(tǒng)進(jìn)行選擇,保留開(kāi)發(fā)需求的系統(tǒng)單元,刪除不需要的模塊單元。在本系統(tǒng)中,嵌入式Linux內(nèi)核選擇ARM?Linux內(nèi)核。Linux內(nèi)核的配置系統(tǒng)由Makefile、配置文件(config.in)、配置工具組成[6]。完成內(nèi)核的數(shù)據(jù)參數(shù)配置后,不能將程序數(shù)據(jù)直接下載到嵌入式系統(tǒng)中進(jìn)行調(diào)試運(yùn)行,因?yàn)榇藭r(shí)數(shù)據(jù)仍然以源代碼的形式存在。此時(shí),為了生成最終能在嵌入式操作系統(tǒng)上運(yùn)行的可執(zhí)行代碼[7],需要進(jìn)一步對(duì)內(nèi)核進(jìn)行編譯。
過(guò)程結(jié)束后,Image和zImage兩個(gè)內(nèi)核映像文件會(huì)在arch/arm/boot目錄下生成,zImage為壓縮后的映像文件,Image為正常大小的映像文件。得到內(nèi)核映像文件后,首先在開(kāi)發(fā)板使用的宿主機(jī)(PC)上建立一個(gè)tftp服務(wù),使用DNW工具,在開(kāi)發(fā)板上電時(shí)按任意鍵進(jìn)入U(xiǎn)?Boot提示符,執(zhí)行以下命令:
在嵌入式操作系統(tǒng)正常運(yùn)行時(shí),需要使用根文件系統(tǒng)支持各種功能[8],在內(nèi)核剛啟動(dòng)運(yùn)行時(shí)根文件系統(tǒng)需要掛載起來(lái)用于支持訪問(wèn)外部設(shè)備,同時(shí)完成內(nèi)核模塊應(yīng)用程序的裝載和運(yùn)行,避免出現(xiàn)Kernelpanic的情況,防止系統(tǒng)內(nèi)核在啟動(dòng)時(shí)沒(méi)有根文件的支持。在實(shí)際應(yīng)用中,嵌入式操作系統(tǒng)使用動(dòng)態(tài)隨機(jī)存取器、同步動(dòng)態(tài)隨機(jī)存取器、FLASH存儲(chǔ)器作為存儲(chǔ)設(shè)備[9]。基于存儲(chǔ)設(shè)備,使用JFFS2,YAFFS,CRAMFS,ROMFS,RAMFS等常見(jiàn)系統(tǒng)作為存儲(chǔ)設(shè)備的嵌入式文件系統(tǒng)。在本系統(tǒng)中,選擇NANDFLASH作為硬件提案所使用的存儲(chǔ)芯片,選用NANDFLASH上使用比較廣泛的Cramfs文件系統(tǒng)作為嵌入式根文件系統(tǒng)。
嵌入式Linux 操作系統(tǒng)的啟動(dòng)流程如圖2所示。系統(tǒng)啟動(dòng)流程包括六個(gè)步驟:
(1) 系統(tǒng)復(fù)位,從地址0x00開(kāi)始執(zhí)行,進(jìn)入步驟(2);
(2) 啟動(dòng)Bootloader模塊,進(jìn)入步驟(3);
(3) 判斷系統(tǒng)是否進(jìn)入Linux,啟動(dòng)Linux內(nèi)核映像,不啟動(dòng)則進(jìn)入U(xiǎn)?boot的命令操作環(huán)境,如果啟動(dòng)內(nèi)核,進(jìn)入步驟(4);
(4) 系統(tǒng)從NANDFLASH加載內(nèi)核到內(nèi)存中,完成對(duì)硬件設(shè)備的初始化工作,進(jìn)入步驟(5);
(5) 掛載根文件系統(tǒng),執(zhí)行init進(jìn)程,并從/etc/inittab取得配置文件,進(jìn)入步驟(6);
(6) 提示執(zhí)行用戶(hù)應(yīng)用程序或用戶(hù)登錄信息。
3 視頻播放器軟件設(shè)計(jì)
3.1 基于Mplayer實(shí)現(xiàn)多媒體播放器
Mplayer是一個(gè)Linux下的電影播放器(也能運(yùn)行在許多其他的Unices和非X86的CPU上)。Mplayer的邏輯結(jié)構(gòu)可以分為四個(gè)層次,即:輸入層、分流層、解碼層和輸出層,其結(jié)構(gòu)如圖3所示。
本文選擇Mplayer作為后臺(tái)設(shè)計(jì)播放軟件。利用Qt/E為軟件平臺(tái)設(shè)計(jì)GUI圖形控制界面,對(duì)多媒體播放器的播放過(guò)程進(jìn)行控制。由于條件限制,本實(shí)驗(yàn)在宿主機(jī)上編譯并安裝了Mplayer,通過(guò)Qt設(shè)計(jì)基于X86的多媒體播放器。
3.2 軟件總體模塊設(shè)計(jì)
由于Qt/Embedded工具可以繞過(guò)X Windows System協(xié)議客戶(hù)端庫(kù),直接讀/寫(xiě)幀緩存的FrameBuffer的數(shù)據(jù)信息,因此實(shí)現(xiàn)Qt類(lèi)庫(kù)對(duì)幀緩存的直接讀/寫(xiě)操作,使用基于Qt/Embedded的應(yīng)用程序可以完成。本系統(tǒng)使用嵌入式Linux作為操作系統(tǒng),通過(guò)Qt的圖形平臺(tái)和函數(shù)庫(kù)完成嵌入式多媒體綜合播放。多媒體播放系統(tǒng)采用模塊化設(shè)計(jì)思想,其架構(gòu)如圖4所示。
嵌入式多媒體播放器包含五個(gè)主要的模塊:
(1) I/O(輸入/輸出模塊):用于多媒體文件的讀入和輸出。
(2) UI(用戶(hù)界面單元):用戶(hù)界面單元的作用是方便用戶(hù)操作嵌入式媒體播放器的各項(xiàng)功能,提供良好的人機(jī)操作互動(dòng)界面和使用體驗(yàn)。
(3) 插件接口單元:讀入多媒體數(shù)據(jù)(通過(guò)輸入插件獲取I/O模塊發(fā)送過(guò)來(lái)的數(shù)據(jù))、調(diào)用Mplayer對(duì)文件進(jìn)行解碼播放、文件總的時(shí)間長(zhǎng)度、編碼類(lèi)型、比特率等信息的獲取、暫停、快進(jìn)、快退、停止、輸出、輸入等的動(dòng)作,輸入動(dòng)作具體指將輸出插件完成解碼的數(shù)據(jù)信息傳送到系統(tǒng)輸出輸入單元的過(guò)程。
(4) Mplayer解碼單元:為了對(duì)不同類(lèi)型的多媒體文件進(jìn)行解碼操作,系統(tǒng)選擇的Mplayer解碼單元由分離器、音視頻解碼器等部分組成。
(5) GUI單元:為了方便快捷的產(chǎn)生讀/寫(xiě)FrameBuffer以及用戶(hù)界面, GUI單元通過(guò)使用Qt/E嵌入式工具作為底層圖形庫(kù)。
軟件總體模塊中各單元之間的相互連接關(guān)系是:通過(guò)輸入/輸出單元讀入音視頻信息數(shù)據(jù),用戶(hù)界面單元在接收到播放信息指令后,調(diào)用插件模塊相應(yīng)的函數(shù),產(chǎn)生相應(yīng)的信號(hào),調(diào)用Mplayer完成對(duì)多媒體文件的解碼,完成解碼之后將數(shù)據(jù)送到I/O模塊輸出。
3.3 控制流程設(shè)計(jì)
主程序設(shè)計(jì)流程如圖5所示。當(dāng)從菜單項(xiàng)打開(kāi)視頻文件時(shí)會(huì)觸發(fā)triggered()信號(hào),執(zhí)行slotopen()槽函數(shù),調(diào)用Qfiledialog的getOpenFileName()函數(shù)從對(duì)話框中選擇要播放的視頻文件。系統(tǒng)首先判斷文件格式是否為*.avi格式,如果是,則創(chuàng)建一個(gè)Qprocess進(jìn)程,通過(guò)該進(jìn)程調(diào)用Mplayer后臺(tái)對(duì)視頻文件進(jìn)行播放,并在指定區(qū)域進(jìn)行輸出顯示。
4 交互式圖形界面設(shè)計(jì)
QImage類(lèi)提供了一種與硬件訪問(wèn)無(wú)關(guān)的圖片存儲(chǔ)方式。QPainter則主要用來(lái)完成繪圖事件。QPushButton提供了圖形用戶(hù)界面最長(zhǎng)用到的命令按鈕部件。此GUI交互界面利用Qt Designer以QMainWindow類(lèi)為基礎(chǔ)設(shè)計(jì)了主框架,包括菜單欄以及狀態(tài)欄等;同時(shí),以QWidget類(lèi)為基礎(chǔ)創(chuàng)建了一個(gè)對(duì)視頻播放進(jìn)行控制的插件接口,并通過(guò)合理的布局與主窗體組合在一起。
在指定目錄打開(kāi)avi格式視頻文件,運(yùn)行效果如圖7所示。在播放過(guò)程中,通過(guò)狀態(tài)欄實(shí)時(shí)顯示當(dāng)前視頻文件的播放時(shí)間。通過(guò)界面下方的按鈕對(duì)播放器的播放過(guò)程進(jìn)行音量調(diào)節(jié)、暫停、快進(jìn)、快退、停止等控制,基本達(dá)到了預(yù)期的效果。打開(kāi)視頻文件時(shí),終端開(kāi)始輸出文件的加載路徑,開(kāi)始讀取并輸出ANS_TIME_POSITION(視頻播放時(shí)間)參數(shù)值,在Qt與Mplayer之間完成了通信。
當(dāng)在控制臺(tái)實(shí)施各種控制操作時(shí),在終端輸出執(zhí)行的操作動(dòng)作并發(fā)送該信號(hào),調(diào)用相應(yīng)的槽函數(shù)完成對(duì)視頻播放的控制動(dòng)作。
以上是在主機(jī)上運(yùn)行播放程序執(zhí)行播放控制的過(guò)程。在主機(jī)上運(yùn)行的Qt程序是基于X結(jié)構(gòu)的,而在實(shí)際的嵌入式開(kāi)發(fā)中,需要直接通過(guò)FrameBuffer進(jìn)行顯示。由于條件限制及其他因素,通過(guò)qvfb模擬程序在嵌入式開(kāi)發(fā)板中運(yùn)行的情況,如圖8所示。
從圖8中可以看出,在qvfb中運(yùn)行該程序時(shí),菜單項(xiàng)的中文顯示出現(xiàn)了方塊型的亂碼,這說(shuō)明菜單項(xiàng)已經(jīng)得到了識(shí)別,只是qtopia中缺少相應(yīng)的中文字體庫(kù),在默認(rèn)的情況下,qvfb會(huì)調(diào)用字體庫(kù)中的默認(rèn)字體,這樣在顯示中文時(shí)會(huì)出現(xiàn)如上問(wèn)題??梢栽诰W(wǎng)絡(luò)上下載相應(yīng)的中文字體庫(kù)并拷貝到Trolltech/Qtopiacore?opensource?4.3.0/lib/fonts中。
6 結(jié) 論
本文通過(guò)對(duì)車(chē)載播放系統(tǒng)的設(shè)計(jì),根據(jù)車(chē)載嵌入式多媒體播放器的功能需求和技術(shù)特點(diǎn),選擇一款合適的嵌入式處理器,在此平臺(tái)上構(gòu)建了功能完整的嵌入式Linux系統(tǒng)開(kāi)發(fā)平臺(tái)。經(jīng)過(guò)對(duì)Qt的GUI設(shè)計(jì)的研究,以Qt的基礎(chǔ)類(lèi)庫(kù)為前端設(shè)計(jì)嵌入式多媒體播放器的前端控制圖形界面。通過(guò)創(chuàng)建QProcess進(jìn)程,實(shí)現(xiàn)了對(duì)播放過(guò)程的控制,與后臺(tái)Mplayer進(jìn)行通信,實(shí)時(shí)讀取并顯示播放信息,并在指定窗口對(duì)音視頻碼流進(jìn)行輸出顯示。通過(guò)測(cè)試表明,本系統(tǒng)達(dá)到了應(yīng)用于車(chē)載音視頻播放的要求,對(duì)相關(guān)開(kāi)發(fā)具有重要參考價(jià)值。
參考文獻(xiàn)
[1] 趙丙辰.嵌入式系統(tǒng)的核心:嵌入式處理器的分類(lèi)與選型[J].新鄉(xiāng)師范高等專(zhuān)科學(xué)校學(xué)報(bào),2012(7):89?90.
[2] 吳偉清,王磊,吳朝暉.基于QTE的嵌入式Linux中文環(huán)境解決方案[J].計(jì)算機(jī)工程,2013(2):55?56.
[3] 王建民,張宏壯.基于Qt的嵌入式媒體播放器系統(tǒng)的設(shè)計(jì)[J].微計(jì)算機(jī)信息,2013(5):66?68.
[4] 李夢(mèng)亮,翁正新.Mplayer和Qtopia在嵌入式無(wú)線卡拉OK點(diǎn)播終端中的應(yīng)用[J].微計(jì)算機(jī)應(yīng)用,2013(2):10?12.
[5] 孫天澤.嵌入式Linux操作系統(tǒng)[M].北京:人民郵電出版社,2009:101?103.
[6] 許信順,智平.嵌入式Linux應(yīng)用編程[M].北京:機(jī)械工業(yè)出版社,2007:95?96.
[7] 王志誠(chéng).基于ARM9的嵌入式Linux操作系統(tǒng)的移植[J].陶瓷,2010(3):50?52.
[8] 韓合民.基于ARM平臺(tái)的嵌入式流媒體播放技術(shù)的研究和應(yīng)用[D].西安:西安電子科技大學(xué),2008:89?90.
[9] 林楓,孟超.基于CS5518的汽車(chē)多媒體的觸摸面板的設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2015,38(2):62?64.