周賢軍,楊恢東
(暨南大學(xué) 電子工程系,廣東 廣州 510632)
隨著計(jì)算機(jī)和芯片技術(shù)的快速發(fā)展,便攜式電子終端設(shè)備已經(jīng)普及人們的生活,其嵌入式產(chǎn)品已滲入各個(gè)行業(yè),像常見到的智能手機(jī)、PDA、機(jī)頂盒、高清電視、路由器、汽車電子、數(shù)碼相機(jī)、醫(yī)療儀器、航天航空設(shè)備等,都是典型的嵌入式系統(tǒng)[1-2]。
本文中設(shè)計(jì)的嵌入式視頻點(diǎn)播(VOD)系統(tǒng)采用友堅(jiān)Idea6410開發(fā)平臺(tái),支持在視頻媒體編解碼,2D/3D硬件圖形加速,顯示處理和縮放等方面的功能,具有很好的穩(wěn)定性和實(shí)時(shí)性,能滿足網(wǎng)絡(luò)實(shí)時(shí)性的要求。而傳統(tǒng)的多媒體在網(wǎng)絡(luò)上播放時(shí),客戶端必須把多媒體文檔全部下載到本地完畢后,才開始在客戶端播放。本系統(tǒng)采用流媒體技術(shù)[3]將流媒體以流的形式進(jìn)行數(shù)字媒體的傳送,通過Linux系統(tǒng)之間的網(wǎng)絡(luò)(IPC)機(jī)制使得網(wǎng)絡(luò)上的不同計(jì)算機(jī)相互通信,視頻服務(wù)器通過其以太網(wǎng)接口與多個(gè)多媒體播放終端進(jìn)行點(diǎn)對(duì)點(diǎn)的網(wǎng)絡(luò)連接,客戶端通過其以太網(wǎng)接口向視頻服務(wù)器發(fā)送連接請(qǐng)求,視頻服務(wù)器響應(yīng)請(qǐng)求后,播放終端對(duì)服務(wù)器發(fā)送過來的流媒體數(shù)據(jù)保存至本地的一個(gè)臨時(shí)文件,再進(jìn)行解碼和播放,從而實(shí)現(xiàn)邊下載邊觀賞媒體節(jié)目。
系統(tǒng)的服務(wù)器端主要提供影片信息、允許連接的客戶端數(shù)、影片實(shí)際地址的轉(zhuǎn)換等功能。播放器終端則運(yùn)行在嵌入式操作系統(tǒng)中,采用QT圖形界面,用來顯示服務(wù)器上的影片列表、影片信息,取得各影片的實(shí)際地址,通過網(wǎng)絡(luò)套接字(socket)接收從以太網(wǎng)傳輸過來的音視頻數(shù)據(jù)流,對(duì)音視頻數(shù)據(jù)流進(jìn)行MPEG-4/H.264解碼,輸出視頻數(shù)據(jù)和AC97格式的音頻數(shù)據(jù),完成播放影片功能。
嵌入式硬件部分[4]主要包括微處理器模塊、音頻播放模塊、視頻播放模塊和網(wǎng)絡(luò)通信傳輸模塊4個(gè)模塊,并集成觸摸屏/鍵盤輸入、USB主控、I2C總線接口、JTAG、時(shí)鐘等功能。圖1介紹系統(tǒng)硬件體系結(jié)構(gòu)設(shè)計(jì)方案及各功能模塊。
S3C6410處理器基于ARM-11架構(gòu)平臺(tái),支持TCPMP播放器完美硬件解碼,內(nèi)置MPGE-4/H.264/H.263/VC-1的視頻編解碼,Camera回顯,MediaPlayer視頻硬件解碼,配備2D/3D硬件圖形加速、V輸出功能,提供WiFi、藍(lán)牙、3G、GPS的模塊接口,內(nèi)置I2C控制器,通過I2C總線音頻控制信號(hào)。所以音頻模塊可由I2C音頻總線接口和AC97音頻編碼解碼器兩部分組成,系統(tǒng)網(wǎng)絡(luò)模塊利用DM9000接收從以太網(wǎng)傳輸過來的音視頻數(shù)據(jù)流,以便進(jìn)行遠(yuǎn)程通信和網(wǎng)絡(luò)傳輸。利用S3C6410提供的32通道DMA控制器,采用DMA傳輸及緩存分段技術(shù),以提高對(duì)音頻數(shù)據(jù)的實(shí)時(shí)性處理。視頻模塊采用Innolux公司的4.3 in TFT真彩LCD(AT043TN24 V.1),采用LED背光。根據(jù)視頻的主要性能指標(biāo)分辨力(直觀的圖畫像素,大?。?shí)現(xiàn)圖形用戶界面(GUI)顯示視頻輸出,觸摸屏用來選擇要播放的視頻文件。
系統(tǒng)的主要流程包括Linux實(shí)驗(yàn)平臺(tái)的搭建、應(yīng)用軟件的移植以及視頻格式的硬件解碼。
Linux系統(tǒng)的主要構(gòu)成包括BootLoader、Kernel和根文件系統(tǒng)。首先進(jìn)行實(shí)驗(yàn)平臺(tái)的搭建,燒寫B(tài)ootLoader到Nand Flash的0x0地址。BootLoader啟動(dòng),完成硬件設(shè)備的初始化并且固化內(nèi)核和文件系統(tǒng)。將重新裁剪和配置好的內(nèi)核燒寫到Nand Flash的0x100000地址,建立文件系統(tǒng),文件系統(tǒng)驅(qū)動(dòng)模塊支持ext2、JAFFS等文件系統(tǒng)。其具體步驟如下:
1)交叉編譯器的安裝。首先把交叉編譯器源碼包拷貝到Linux的根目錄下,解包tar zxvf arm-none-linuxgnueabi-arm-2008q3-72-for-linux.tar-C/。然后修改配置文件/etc/profile或/root/.bashrc,在文件中添加path?munge/usr/local/arm/4.3.2/bin,PATH=/usr/local/arm/4.3.2/arm-none-linux-gnueabi-/bin:$PATHi。最后,重啟 shell,使交叉工具生效。
2)Bootloader移植。Bootloader在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序,主要用于初始化硬件設(shè)備、建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。本系統(tǒng)主要對(duì)U-boot-1.1.6進(jìn)行配置,增加了對(duì)DM9000、Nand Flash以及SD卡的支持,然后編譯生成u-boot.bin的二進(jìn)制文件,燒入到Nand Flash上。
3)編譯內(nèi)核(Linux2.6.28-v1.0)及安裝模塊。首先,修改內(nèi)核頂層Makefile,指定體系結(jié)構(gòu)為ARCH=arm,交叉編譯工具CROSS_COMPILE=arm-none-linux-gnuea?bi-。其次,設(shè)置Nand Flash引導(dǎo),加載DM9000網(wǎng)卡驅(qū)動(dòng)程序,配置編譯內(nèi)核。最后,將編譯生成的zImage鏡像文件用mkimage工具生成uImage,燒寫進(jìn)Nand Flash 0x100000地址處。
4)移植根文件系統(tǒng)。此系統(tǒng)是Linux啟動(dòng)的第1個(gè)文件系統(tǒng),沒有根文件系統(tǒng)Linux無法正常啟動(dòng)。首先進(jìn)入busybox目錄,配置busybox選項(xiàng),通過交叉編譯安裝busybox,同時(shí)把根文件系統(tǒng)制作成yaffs文件系統(tǒng)。讓做好的文件系統(tǒng)燒入Nand Flash的0x400000地址,啟動(dòng)內(nèi)核執(zhí)行mount-t yaffs/dev/mtdblock3/mnt,完成文件系統(tǒng)的制作。
通過在Linux x86上交叉編譯MPlayer,使得MPlayer能在ARM架構(gòu)的平臺(tái)上運(yùn)行,實(shí)現(xiàn)嵌入式平臺(tái)的流媒體播放,優(yōu)化并改善傳輸性能和質(zhì)量[5]。
由于MPlayer中默認(rèn)的MP3解碼器是mp3lib,使用的是浮點(diǎn)數(shù)運(yùn)算,相當(dāng)占用CPU資源,故在編譯的時(shí)候可以使用libmad進(jìn)行音頻輸出,使用之前需要自己手動(dòng)編libmad,保證交叉編譯器能夠找到libmad庫以及頭文件,編譯時(shí)增加--enable-mad就可以了。利用mad解碼MP3文件,可以看到CPU占用率降低到了20%左右。移植的主要流程如下:
1)安裝好解碼庫到/usr/local/arm/4.3.2/lib,解包tar xvf libmad-0.15.1.tar.gz,解開解碼包使用以下配置項(xiàng)。配置選項(xiàng)./configure--enable-fpm=arm--host=armnone-linux-gnueabi--disable-shared--enable-fbdevenable-static--disable-debugging--prefix=/usr/local/arm/4.3.2/lib。
運(yùn)行make以及make install,就可以看到在/usr/local/arm/4.3.2/lib目錄下多了include和lib目錄,解碼包lib?mad和流媒體支持livx、H.264、MPEG-4等眾多流媒體格式。
2)解壓源碼包mplayer-new.tar.gz,完成交叉編譯時(shí)的關(guān)鍵配置,包括交叉工具--cc=arm-none-linux-gccgnueabi-,--target=arm-armv4l-linux。該參數(shù)arm指明架構(gòu),armv4l指具體的版本,linux是系統(tǒng)平臺(tái)。使用--enable-static設(shè)定靜態(tài)連接,不需要?jiǎng)討B(tài)庫。因?yàn)樵谇度胧较到y(tǒng)中沒有類似PC平臺(tái)下的高性能顯卡系統(tǒng),因此使用--enable-fbdev驅(qū)動(dòng)Frame buffer顯示圖像。然后交叉編譯MPlayer,生成ARM平臺(tái)下的可執(zhí)行文件。
3)移植執(zhí)行文件至MPlayer開發(fā)板的根文件系統(tǒng)usr/bin目錄下,完成MPlayer的移植。
H.264最大的優(yōu)勢是具有很高的數(shù)據(jù)壓縮比率,在網(wǎng)絡(luò)傳輸過程中所需要的帶寬更少,適合于網(wǎng)絡(luò)上的流媒體傳播和資源十分有限的嵌入式設(shè)備[6]。
Idea6410本身支持H.264的硬件編解碼,先初始化MFC硬件驅(qū)動(dòng),將從網(wǎng)絡(luò)傳輸來的要解碼的媒體流數(shù)據(jù)存儲(chǔ)在指定的Frame buffer。初始化幀提取器,設(shè)置pp_param參數(shù)類型,從內(nèi)存指定區(qū)域?qū)⑿枰獯a的視頻流讀取一幀下來,調(diào)用解碼函數(shù),通知MFC開始解碼,解碼完后的幀數(shù)據(jù)暫存在視頻緩沖區(qū),將輸出緩沖區(qū)的地址傳遞給pp的配置結(jié)構(gòu)體pp_param,調(diào)用函數(shù)ioctl設(shè)置pp,然后處理并顯示,等待下一幀的解碼,再寫入Frame buffer播放幀數(shù)據(jù)。而每當(dāng)寫完一幀數(shù)據(jù)到Frame buf?fer,S3C6410就將幀緩沖區(qū)所存儲(chǔ)的這幀空間更新,開始等待下一幀的解碼。如此,就完成了整個(gè)硬件解碼器。
Qt/Embedded是著名的圖形庫Qt開發(fā)商Trolltech專門面向嵌入式系統(tǒng)開發(fā)的Qt版本。它是一種C++圖形用戶界面應(yīng)用程序構(gòu)架,可為開發(fā)者提供其所需的在嵌入式環(huán)境中的功能全面的圖形界面開發(fā)工具。Qt主要特點(diǎn)是性能穩(wěn)定,可移植性較好,并且可剪裁。許多基于Linux開發(fā)的Qt應(yīng)用程序可以非常方便地移植到相應(yīng)的嵌入式系統(tǒng)上去。
圖形用戶界面(GUI)模塊主要負(fù)責(zé)用戶和系統(tǒng)的交互,本系統(tǒng)中GUI模塊的開發(fā)主要由Qt/Embedded工具完成[7]。
用QtCreator編寫用戶操作界面。首先建立一個(gè)Qt C++工程,創(chuàng)建Qt GUI的widget.ui界面,QWidget類負(fù)責(zé)圖像用戶面應(yīng)用程序的控制流和主設(shè)置,用于播放窗口界面的設(shè)計(jì)與控制,它是MainWindow的繼承類,提供了豐富的應(yīng)用程序的主窗口及工具。圖形用戶界面需要實(shí)現(xiàn)的功能包含播放、快進(jìn)、快退、暫停、停止和音量大小控制。播放窗口按鍵通信通過signal和slot來接收信號(hào),signal和slot機(jī)制真正實(shí)現(xiàn)了封裝的概念,而signal和slot在聲明后主要通過connect()函數(shù)來進(jìn)行調(diào)用。slot的定義如下:
在播放器的編寫過程中用到兩個(gè)非常重要的類,Qproces和Qthread,其在播放器相應(yīng)的功能操作都是通過進(jìn)程或線程間的通信完成的,播放部分詳解為:
Linux提供了豐富的網(wǎng)絡(luò)工具來完成信息的傳輸,在流媒體網(wǎng)絡(luò)傳輸過程中通過網(wǎng)絡(luò)套接字socket來建立網(wǎng)絡(luò)中的兩臺(tái)主機(jī)連接進(jìn)行數(shù)據(jù)通信,并且在提供媒流體的源服務(wù)器端,bind()函數(shù)會(huì)綁定一個(gè)IP地址和一個(gè)特定的端口號(hào)。在bind()函數(shù)成功調(diào)用后,源服務(wù)端就不停地監(jiān)聽客戶端的連接,并為該socket建立一個(gè)輸入數(shù)據(jù)隊(duì)列,將達(dá)到的服務(wù)請(qǐng)求保存到此隊(duì)列中,等待程序的響應(yīng)。網(wǎng)絡(luò)通信流程圖見圖2。
該系統(tǒng)可以同時(shí)運(yùn)行多個(gè)進(jìn)程,并且在一個(gè)進(jìn)程里開辟多個(gè)線程并發(fā)的執(zhí)行,使用QThread類創(chuàng)建多個(gè)線程。服務(wù)端視頻發(fā)送程序?qū)崿F(xiàn)部分為:
在面向連接的客戶端程序使用connect()函數(shù)來配置socket并與遠(yuǎn)端服務(wù)器建立一個(gè)TCP連接,并接收源服務(wù)器端發(fā)送的數(shù)據(jù)保存到臨時(shí)緩沖文件/tmp/myplay?file中,其客戶端接收部分的程序?yàn)椋?/p>
將設(shè)計(jì)好的視頻終端播放器移植到ARM平臺(tái)嵌入式系統(tǒng)中,啟動(dòng)播放終端界面如圖3所示。該播放器首先通過ARM開發(fā)板觸摸屏點(diǎn)擊右下角connect按鍵連接到多媒體服務(wù)器端,在建立好連接后,客戶端與服務(wù)端就可以進(jìn)行點(diǎn)對(duì)點(diǎn)的數(shù)據(jù)傳輸,播放列表里就會(huì)接收到服務(wù)端的視頻資源列表,選擇列表文件進(jìn)行在線視頻播放。點(diǎn)擊左下角的LocalFile可以打開本地視頻文件播放,該播放器同時(shí)支持播放、暫停、快進(jìn)、快退、音量控制等功能,由于該客戶端采用了MPlayer的視頻解碼及S3C6410內(nèi)置的硬件編解碼器,因此能支持目前主流的視頻格式,能為用戶提供良好的服務(wù)。
設(shè)計(jì)了基于S3C6410的嵌入式多媒體播放系統(tǒng)。該系統(tǒng)采用具有優(yōu)秀流水線和多媒體處理功能的ARM11處理器,開發(fā)了引導(dǎo)加載程序,移植Linux內(nèi)核及創(chuàng)建文件系統(tǒng)。并設(shè)計(jì)了ARM平臺(tái)的終端播放器。因嵌入式系統(tǒng)并沒有顯卡系統(tǒng),本系統(tǒng)采用的是直接操作Frame buffer,并成功實(shí)現(xiàn)了硬件解碼H.264等目前主流的視頻格式的播放,達(dá)到了很好的顯示效果,為進(jìn)一步開發(fā)嵌入式多媒體終端提供了有效的實(shí)踐應(yīng)用。隨著當(dāng)今便攜式終端設(shè)備的高速發(fā)展,該系統(tǒng)的應(yīng)用范圍和前景非常廣闊。
[1]胡春華.基于Linux的多媒體網(wǎng)絡(luò)播放系統(tǒng)的設(shè)計(jì)[D].哈爾濱:哈爾濱理工大學(xué),2007.
[2]王恒,王中訓(xùn),杜思良,等.基于ARM9的USB攝像頭圖像采集壓縮及無線傳輸[J].電視技術(shù),2011,35(3):29-31.
[3]陳學(xué)凱,陳耀武,汪樂宇.基于流媒體的網(wǎng)絡(luò)化嵌入式多媒體播放系統(tǒng)[J].現(xiàn)代機(jī)械,2005(4):75-76.
[4]朱長水.基于ARM網(wǎng)絡(luò)音視頻播放系統(tǒng)的硬件設(shè)計(jì)[J].硅谷,2009(12):9.
[5]吳文相,邵時(shí).基于ARM的嵌入式AVS視頻播放器的設(shè)計(jì)[J].計(jì)算機(jī)應(yīng)用與軟件,2010(1):247-249.
[6]皇甫澤毅.H.264解碼在嵌入式Linux上的優(yōu)化實(shí)踐[D].武漢:華中科技大學(xué),2006.
[7]張娟,張雪蘭.基于嵌入式Linux的GUI應(yīng)用程序的實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用,2003(23):116-117.