基于嵌入式Linux的車載多媒體廣告機(jī)設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
引言
隨著科學(xué)技術(shù)的發(fā)展,越來(lái)越多的多媒體廣告機(jī)出現(xiàn)在出租車中。現(xiàn)有的出租車廣告機(jī)大多采用移動(dòng)數(shù)字電視和數(shù)字存儲(chǔ)播放兩種方式。移動(dòng)數(shù)字電視只能應(yīng)用在存在數(shù)字電視信號(hào)的地區(qū),在無(wú)信號(hào)或信號(hào)較弱的地區(qū)則無(wú)法播放,對(duì)于廣告的播出時(shí)段、播出內(nèi)容需要和廣電系統(tǒng)合作協(xié)商,導(dǎo)致效率低、成本高,而且播出的節(jié)目不能點(diǎn)播;數(shù)字存儲(chǔ)播放的方式需要將節(jié)目?jī)?nèi)容先期進(jìn)行制作,然后將節(jié)目?jī)?nèi)容刻錄成光盤或者存儲(chǔ)于播放設(shè)備的存儲(chǔ)器中,這種方式目前存在的缺點(diǎn)是節(jié)目更新較為困難、時(shí)效性較差,而且存在軟硬件成本較高的問(wèn)題%
針對(duì)現(xiàn)有的車載廣告機(jī)存在的不足,本文提出了一種新型的車載多媒體廣告機(jī)的設(shè)計(jì)方案。采用嵌入式Linux系統(tǒng)和ARM處理器S3C6410分別構(gòu)建多媒體廣告機(jī)的軟硬件平臺(tái),在此基礎(chǔ)上采用開放源代碼的圖形界面庫(kù)Qt/E設(shè)計(jì)廣告機(jī)的程序界面,在Qt設(shè)計(jì)的界面上顯示多媒體播放器MPlayer播放的視頻,結(jié)合FrameBuffer在視頻的上方和下方分別顯示Log。和字幕,最終完成應(yīng)用程序的開發(fā)。
1系統(tǒng)總體設(shè)計(jì)
車載廣告機(jī)的基本設(shè)計(jì)思想是在基于ARM的嵌入式平臺(tái)上完成多媒體文件的存儲(chǔ)、解析和處理,控制LCD模塊和音頻模塊完成多媒體廣告的播放,并采用Wi-Fi無(wú)線網(wǎng)絡(luò)完成多媒體廣告機(jī)系統(tǒng)中視頻文件的智能下載更新?;谇度胧杰洝⒂布h(huán)境,車載廣告機(jī)系統(tǒng)的整體結(jié)構(gòu)如圖1所示:
2系統(tǒng)硬件設(shè)計(jì)
車載廣告機(jī)系統(tǒng)的硬件結(jié)構(gòu)圖如圖2所示。系統(tǒng)的核心處理器采用基于ARM1176JZF-S核的S3C6410芯片,其主頻最高可達(dá)到667MHz,內(nèi)部集成了強(qiáng)大的多媒體處理單元,帶有3D圖形硬件加速器,并支持2D圖形圖像的平滑縮放等操作,有利于為用戶提供高靈敏度的汽車狀態(tài)動(dòng)態(tài)顯示;外接16GB的SD卡和2GBNANDFLASH,為多媒體文件的本地存儲(chǔ)提供了充足的硬件環(huán)境;顯示接口采用8寸TFT液晶顯示屏,處理器內(nèi)部集成的LCD控制器信號(hào)線經(jīng)過(guò)驅(qū)動(dòng)電路后即可連接LCD模塊,為多媒體廣告的顯示提供了硬件平臺(tái);外接觸摸屏,用戶可根據(jù)需要自主選擇喜愛(ài)的節(jié)目;外接音頻編解碼芯片CS42L50,為多媒體播放提供音頻支持;外接基于Marvell8686芯片的SDWi-Fi模塊,使廣告機(jī)終端能夠接入無(wú)線網(wǎng)絡(luò),連接到遠(yuǎn)端服務(wù)器,完成系統(tǒng)所需多媒體文件的智能下載更新。
3系統(tǒng)軟件設(shè)計(jì)
車載廣告機(jī)的軟件設(shè)計(jì)主要是開發(fā)基于嵌入式Linux系統(tǒng)的客戶端應(yīng)用程序。本系統(tǒng)采用嵌入式Linux作為操作系統(tǒng),在Linux平臺(tái)下編寫廣告機(jī)的驅(qū)動(dòng)程序;利用Qt/Embedded作為圖形界面解決方案實(shí)現(xiàn)廣告機(jī)的圖形界面,在此界面上顯示Mplayer播放器播放的視頻。
該系統(tǒng)軟件的開發(fā)主要有4個(gè)內(nèi)容:開發(fā)平臺(tái)的搭建、編譯Qt/Embedded庫(kù)、視頻播放器MPlayer的移植和廣告機(jī)應(yīng)用程序的實(shí)現(xiàn)。
3.1嵌入式Linux系統(tǒng)開發(fā)平臺(tái)的搭建
為了開發(fā)滿足要求的應(yīng)用程序,本文采用的軟件開發(fā)環(huán)境是VmwareWorkstation7虛擬機(jī)和Fedora9操作系統(tǒng),在此環(huán)境中安裝交叉編譯器ARM-linux-gcc4.3.2,用來(lái)完成包含相關(guān)驅(qū)動(dòng)程序的虛擬儀表系統(tǒng)內(nèi)核、QT庫(kù)和應(yīng)用程序的編譯;在Fedora9系統(tǒng)中安裝QtCreator軟件,用于完成虛擬儀表系統(tǒng)應(yīng)用程序的開發(fā);移植嵌入式設(shè)備的系統(tǒng)引導(dǎo)程序U-boot;編寫硬件平臺(tái)中音頻模塊、Wi-Fi模塊和SD卡等設(shè)備的驅(qū)動(dòng),然后裁剪編譯Linux2.6.29內(nèi)核并在其中加載已編譯的相關(guān)驅(qū)動(dòng)[5],制作硬件平臺(tái)需要的根文件系統(tǒng)。
3.2編譯Qt/Embedded庫(kù)
Qt是一個(gè)跨平臺(tái)的C++圖形用戶界面應(yīng)用程序框架,其對(duì)象容易擴(kuò)展,可移植性較好,支持多個(gè)GUI平臺(tái)的交互開發(fā)。Qt/EmbeddedLinux是為嵌入式Linux優(yōu)化過(guò)的Qt版本,被廣泛應(yīng)用于各種嵌入式產(chǎn)品和設(shè)備當(dāng)中,其實(shí)現(xiàn)結(jié)構(gòu)如圖3所示。為了減少系統(tǒng)內(nèi)存占用量、提高系統(tǒng)性能,可以對(duì)Qt/EmbeddedLinux進(jìn)行重新裁剪編譯,去掉不需要的特性。
下載tslib1.4.tar.gz,在搭建好的開發(fā)平臺(tái)內(nèi)解壓后執(zhí)行配置、編譯和安裝命令,編譯安裝Tslib庫(kù),添加觸摸屏支持。然后通過(guò)./configure裁剪、配置Qt/Embedded庫(kù)。配置完成后采用make命令編譯,用makeinstall命令安裝Qt/EmbeddedLinux到指定的位置。
3.3移植視頻播放器MPlayer
MPlayer是一款開源的多媒體播放器,遵循GPL規(guī)范。該播放器可以在多種操作系統(tǒng)上運(yùn)行。MPlayer自帶的音頻、視頻解碼器可以支持許多流行的音頻和視頻格式。相對(duì)于其他播放器,MPlayer運(yùn)行過(guò)程中資源占用非常少,對(duì)系統(tǒng)硬件的配置要求比較低,故本系統(tǒng)采用MPlayer作為多媒體播放器。直接使用MPlayer作為播放器還可以節(jié)約開發(fā)成本,同時(shí)也增加了系統(tǒng)的可靠性[6]。
下載libmad后解壓,使用./configure配置libmad,然后分別使用make命令和makeinstall命令安裝libmad。下載解壓MPlayer源文件,使用./configure命令進(jìn)行配置,注意一定要添加一target=arm-linux,標(biāo)明為ARM平臺(tái)配置,然后使用make命令進(jìn)行編譯,使用makeinstall命令安裝至當(dāng)前目錄。生成的可執(zhí)行文件Mplayer即為MPlayer播放器,將其拷貝至開發(fā)板/bin目錄下,完成MPlayer的移植。
3.4設(shè)計(jì)廣告機(jī)應(yīng)用程序
3.4.1廣告機(jī)界面的實(shí)現(xiàn)
廣告機(jī)界面的實(shí)現(xiàn)較為簡(jiǎn)單,只需要在屏幕的右側(cè)顯示一排可以點(diǎn)擊的圖形按鈕,左側(cè)用于廣告視頻的顯示。對(duì)于圖形按鈕的設(shè)計(jì),需要首先準(zhǔn)備好每一個(gè)按鈕未點(diǎn)擊和點(diǎn)擊后的圖片素材并將他們添加到程序的資源文件advertise.qrc中,程序運(yùn)行時(shí)會(huì)加載這些圖片到內(nèi)存中,然后在窗口的paintEvent()函數(shù)中進(jìn)行按鈕的繪制,在用戶點(diǎn)擊圖形按鈕時(shí),在mousePressEvent()函數(shù)中處理按鈕的點(diǎn)擊事件;視頻采用全屏顯示,需要在main函數(shù)中,用showFullScreen()函數(shù)顯示窗口即可實(shí)現(xiàn)全屏;為了在視頻播放的同時(shí)顯示Log。和字幕,應(yīng)用程序使用了4個(gè)FrameBuffer,分別用于顯示Qt程序界面、MPlayer視頻圖像、Log。和字幕,實(shí)現(xiàn)四者的疊加顯示。
3.4.2實(shí)現(xiàn)視頻的播放
要實(shí)現(xiàn)廣告視頻文件在Qt窗口上播放,需要使用戶界面通過(guò)QProcess類啟動(dòng)一個(gè)新程序來(lái)實(shí)現(xiàn)對(duì)MPlayer的控制,如圖4所示。QProcess類使應(yīng)用程序在Qt程序中調(diào)用另外一個(gè)進(jìn)程。其實(shí)現(xiàn)代碼如下:
mplayerProcess=newQProcess(this);//創(chuàng)建一個(gè)QProcess對(duì)象
connect(mplayerProcess,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(mplayerEnded(int,QProcess::ExitStatus)));//finished信號(hào)在MPlayer程序結(jié)束時(shí)發(fā)射,標(biāo)志著一個(gè)視頻已播放完成,用此信號(hào)可通知程序自動(dòng)播放下一個(gè)視頻,實(shí)現(xiàn)視頻的循環(huán)播放
3.4.3界面與MPlayer的交互
MPlayer與Qt4程序之間使用管道方式進(jìn)行通信,QProcess類隱藏了具體的通信細(xì)節(jié),將新建立的進(jìn)程當(dāng)做主程序的一個(gè)I/O設(shè)備,因此需要使用QProcess類提供的read()/write()函數(shù)來(lái)調(diào)用這個(gè)進(jìn)程的標(biāo)準(zhǔn)輸入/輸出[7],如下所示:
mplayerProcess->write(“quit\nv);//通知MPlayer退出
當(dāng)QProcess啟動(dòng)MPlayer后,應(yīng)用程序可以將控制命令寫入MPlayer的標(biāo)準(zhǔn)輸入,MPlayer從標(biāo)準(zhǔn)輸入讀到數(shù)據(jù)后會(huì)執(zhí)行相應(yīng)的功能。其實(shí)現(xiàn)代碼如下:
QStringListargs;
args<<v-framebuffer-indexv<<”1”;//MPlayer不支持將視頻顯示在Qt/E的串口上,而是直接顯示在FrameBuffer上,在這里結(jié)合多FrameBuffer特性,以及screenrect參數(shù),將視頻定位到Qt繪制的窗口的劃定區(qū)域上面
QStringscreenRect=QString("%1,%2,%3,%4").arg(m_videoWindowRect.left()).arg(m_videoWindowRect.top()).arg(m_videoWindowRect.width()).arg(m_videoWindowRect.height。);//計(jì)算顯示視頻的區(qū)域
args<<screenRect;//位置傳遞
args<<"-slave";//使用MPlayer的slave模式,在此模式下,MPlayer在運(yùn)行過(guò)程中能夠接收用戶的輸入命令。
m_mplayerProcess->start(MPLAYER_PATH,args);//寫入命令
3.4.4視頻文件的更新
應(yīng)用程序通過(guò)廣告機(jī)內(nèi)置的無(wú)線網(wǎng)卡訪問(wèn)遠(yuǎn)程服務(wù)器即可實(shí)現(xiàn)廣告視頻文件的更新。廣告機(jī)終端在系統(tǒng)開機(jī)運(yùn)行時(shí)通過(guò)QThread類新建一個(gè)線程,通過(guò)無(wú)線網(wǎng)卡定期向遠(yuǎn)程服務(wù)器查詢是否需要更新視頻文件,在廣告機(jī)準(zhǔn)備好更新時(shí),服務(wù)器通過(guò)無(wú)線網(wǎng)可將封裝后的視頻發(fā)送到無(wú)線局域網(wǎng)中去。接收端系統(tǒng)通過(guò)驅(qū)動(dòng)程序接收數(shù)據(jù)包,進(jìn)行解封裝得到需要更新的視頻目錄和視頻數(shù)據(jù),終端則根據(jù)更新目錄進(jìn)行視頻文件的刪除或下載等操作。其實(shí)現(xiàn)代碼如下:
classDownLoad:publicQThread
{Q_OBJECTprotected:voidrun();//開機(jī)即開啟一個(gè)QTimer定時(shí)器,定時(shí)向遠(yuǎn)程服務(wù)器查詢是否需要更新視頻文件。
signals:voidupDates();//在需要進(jìn)行視頻更新時(shí),以信號(hào)與槽(signals/slot)的方式,通知主程序進(jìn)行視頻文件的更新。
3.4.5畫面閃爍問(wèn)題的解決
畫面的動(dòng)態(tài)刷新顯示,會(huì)使屏幕出現(xiàn)閃爍。本設(shè)計(jì)釆用雙緩沖機(jī)制解決畫面閃爍的問(wèn)題,將整個(gè)窗口部件在屏幕外的像素映射中繪制,然后把這個(gè)像素映射復(fù)制到顯示窗口中叫其實(shí)現(xiàn)代碼如下:
voidMainwidow::paintEvent(QPaintEvent*event)
{??????
QsizenewSize=rect.size().expandedTo(pixmap.size());//創(chuàng)建至少和所繪區(qū)域一樣大的繪圖緩沖
QPainterpainter(&pixmap,this);//創(chuàng)建操作像素映射的QPainter
Painter.translate.(-rect.x(),-rect.y());//對(duì)像素映射中繪制矩形的畫筆進(jìn)行坐標(biāo)轉(zhuǎn)換
bitBlt(this,rect.x(),rect.y(),&pixmap,0,0,rect.width(),rect.height());//利用bitBlt()把像素映射復(fù)制到顯示窗口部件上}
4運(yùn)行發(fā)布程序
將裁剪、編譯過(guò)的內(nèi)核與制作的帶QT庫(kù)的文件系統(tǒng)燒寫到開發(fā)板。在開發(fā)環(huán)境內(nèi)交叉編譯編寫的應(yīng)用程序,得到可執(zhí)行二進(jìn)制文件,將此文件移植到開發(fā)板,即可實(shí)現(xiàn)應(yīng)用程序的發(fā)布。重新開機(jī),運(yùn)行應(yīng)用程序即可啟動(dòng)廣告機(jī),其啟動(dòng)后的畫面如圖5所示。
5結(jié)語(yǔ)
本文提出了一種新型的車載多媒體廣告機(jī)的設(shè)計(jì)方案,以ARM和嵌入式Linux為基礎(chǔ)平臺(tái),通過(guò)定制移植QT和MPlayer并設(shè)計(jì)應(yīng)用程序?qū)崿F(xiàn)多媒體廣告機(jī)系統(tǒng)的設(shè)計(jì)。通過(guò)本設(shè)計(jì)方案設(shè)計(jì)的廣告機(jī),采用開放源代碼軟件設(shè)計(jì),使系統(tǒng)的成本降低,同時(shí)采用雙緩沖技術(shù)消除頁(yè)面閃爍,使其更具有市場(chǎng)競(jìng)爭(zhēng)力;采用Qt插件的方式設(shè)計(jì)系統(tǒng)的各個(gè)模塊,增強(qiáng)了系統(tǒng)的可擴(kuò)展性和可定制性;通過(guò)Wi-Fi與服務(wù)器交互實(shí)現(xiàn)視頻文件的更新,解決了大批量設(shè)備同時(shí)進(jìn)行大容量視頻數(shù)據(jù)更新的問(wèn)題,提高了更新速度。經(jīng)實(shí)驗(yàn)測(cè)試,該系統(tǒng)所有功能模塊都能正常運(yùn)行,達(dá)到了預(yù)期的效果,隨著信息化的發(fā)展,有著廣闊的前景。
20211120_6197d6ce9384e__基于嵌入式Linux的車載多媒體廣告機(jī)設(shè)計(jì)