楊功銀,付 玉,黎 珍
(湖南師范大學(xué) 工學(xué)院,湖南 長沙 410086)
計算機(jī)和電子通信技術(shù)的發(fā)展將人們帶入了嶄新的數(shù)字化音視頻世界。人們可以不再僅僅依靠易受干擾的無線電波收聽廣播和收看電視,還可以跨地域?qū)崟r地欣賞網(wǎng)絡(luò)上的電臺和電視節(jié)目,這些與流媒體技術(shù)的出現(xiàn)和發(fā)展密切相關(guān)。流媒體技術(shù)讓用戶無需將整個文件下載完而只需等待緩沖片刻就可欣賞,其余部分在后臺從服務(wù)器繼續(xù)下載。目前來看,這些都是在PC機(jī)上實現(xiàn)的,PC機(jī)處理能力強(qiáng)大,但也有笨重不便攜帶、耗電量大及需占較大空間等缺點(diǎn),有時甚至是一種資源浪費(fèi)。本文將嵌入式技術(shù)引入流媒體播放領(lǐng)域設(shè)計了一款基于S3C2440A的嵌入式流媒體播放終端,具有體積小、低功耗、低成本及操作簡單等優(yōu)點(diǎn)。
系統(tǒng)硬件如圖1所示。S3C2440A為系統(tǒng)處理器,SDRAM使用兩片三星公司的K4S561632構(gòu)成了32位數(shù)據(jù)寬度的存儲系統(tǒng),并映射到S3C2440A的BANK6上。Nor Flash采用EN29LV160AB,接在S3C2440A的BANK0上用來存取引導(dǎo)操作系統(tǒng)的Bootloader。Nand Flash采用K9F2G08,其有專門的時序控制總線,不占用系統(tǒng)總線資源,用來存儲操作系統(tǒng)內(nèi)核、文件系統(tǒng)等。該播放終端通過DM9000以太網(wǎng)卡以有線方式或USB無線網(wǎng)卡以無線方式連接。UDA1341主要用來將從S3C2440A輸出的數(shù)字音頻信號轉(zhuǎn)換為模擬音頻信號輸出。LCD顯示模塊主要是完成顯示功能,具有觸摸功能,方便用戶觀看和操作等。S3C2440A上運(yùn)行一個具有所有相關(guān)驅(qū)動的Linux操作系統(tǒng),將Mplayer移植到該平臺上。在操作系統(tǒng)及網(wǎng)絡(luò)協(xié)議的支持下,Mplayer就可以從服務(wù)器上下載音視頻流,并完成解碼,再由UDA1341芯片D/A轉(zhuǎn)換或LCD幀緩沖顯示。因嵌入式系統(tǒng)資源的有限性不適合Mplayer自帶的圖形界面運(yùn)行,所以用Qt重新編寫一個圖形界面以方便用戶操作。
圖1 系統(tǒng)總體方案
S3C2440A核心處理器采用ARM公司設(shè)計的16/32位ARM920T的RISC處理器,是一款低價格、低功耗、具有高性價比且廣泛用于手持設(shè)備的微控制器[1]。它實現(xiàn)了MMU,AMBA BUS和Harvard高速緩沖體系結(jié)構(gòu),具有獨(dú)立的16 kbyte指令Cache和16 kbyte數(shù)據(jù)Cache,集成有I2S音頻編解碼接口、LCD接口、SDRAM內(nèi)存控制器、Nand Flash控制器、USB控制器、ADC及觸摸屏接口等。工作主頻一般為400 MHz,最高可達(dá)533 MHz。該設(shè)計中S3C2440A工作所需時鐘源由外接12 MHz晶振提供。此外,采用2片三星公司的K4S561632,片選信號為 nGCS6,2 Mbyte的 Nor Flash EN29LV160AB,片選信號為nGCS0。Nand Flash不是一種總線型設(shè)備,S3C2440A提供了專用訪問接口,本設(shè)計中采用256 Mbyte的K9F2G08。這樣S3C2440A就和外部的時鐘電路及SDRAM,Nor Flash和Nand Flash存儲設(shè)備組成S3C2440A最小系統(tǒng)。
嵌入式流媒體播放終端網(wǎng)絡(luò)接口部分是必不可少的,該播放終端可以通過有線的以太網(wǎng)卡DM9000或USB WiFi無線網(wǎng)卡訪問網(wǎng)絡(luò)。
DM9000是DEVICOM公司生產(chǎn)的一款10/100(Mbit·s-1)快速以太網(wǎng)卡控制芯片,它實現(xiàn)了以太網(wǎng)媒體介質(zhì)訪問層(MAC)和物理層(PHY)的功能,集成有10/100(Mbit·s-1)自適應(yīng)收發(fā)器,4 kbyte雙字節(jié)的靜態(tài)隨機(jī)存儲器,支持介質(zhì)無關(guān)接口和幀喚醒,完全符合IEEE 802.3u規(guī)格,支持IEEE 802.3x全雙工的流控制[2]。通過設(shè)置,外部處理器可以以8位、16位、32位這3種方式之一訪問DM9000內(nèi)部存儲器。本設(shè)計中DM9000與S3C2440A處理器的連接如圖2所示。
圖2 DM9000網(wǎng)卡電路原理圖
S3C2440A的 nGCS4與 DM9000的 AEN相連,SA4,SA5,SA6及SA7直接跟地線相連,SA8和SA9與電源連接。當(dāng)AEN引腳為低電平時DM9000就被選中。SD0~SD15與S3C2440A的 DATA0~DATA15相連,CMD引腳與S3C2440A的ADDR2連接。當(dāng)CMD引腳為高電平時,SD0~SD15上傳輸?shù)氖菙?shù)據(jù),反之傳輸?shù)刂贰WAIT為讀寫等待信號,當(dāng)其為低電平時說明上條指令沒執(zhí)行完,當(dāng)前指令需等待。nOE和nWE為DM9000的讀和寫允許信號,都是低電平有效。LAN_INT與S3C2440A的18號中斷相連,nRESET為初始化 DM9000的重啟信號,EEDO和WAKEUP引腳為默認(rèn)的低電平,這決定其總線寬度為16位。X1和X2引腳兩端外接25 MHz石英晶振外圍電路組成 DM9000 的時鐘電路。RXI+,RXI-,TXO+,TXO-為網(wǎng)絡(luò)信號的輸入和輸出端。DM9000接在BANK4上,片選信號為NGCS4。
因S3C2440A集成USB控制器,硬件電路幾乎不需要重新設(shè)計,只需選擇一款在軟件上能被支持的USB無線網(wǎng)卡就能實現(xiàn)通過無線方式訪問網(wǎng)絡(luò)。
UDA1341是一款飛利浦公司生產(chǎn)的支持I2S接口的數(shù)字音頻解碼芯片,它采用位元流技術(shù)進(jìn)行信號處理,具備AD轉(zhuǎn)換和DA轉(zhuǎn)換功能,并可用PGA(可編程增益控制)和AGC(自動增益控制)對模擬信號進(jìn)行處理,同時其對數(shù)字信號提供了DSP處理功能[3]。UDA1341在本設(shè)計中完成將S3C2440A送來的數(shù)字音頻信號轉(zhuǎn)化成模擬信號輸出,UDA1341音頻轉(zhuǎn)換電路如圖3所示。S3C2440A提供了5 根 I2S 信號線(I2SSO,I2SSDI,I2SLRCK,I2SSCLK,CDCLK)與UDA1341相應(yīng)信號線相連,UDA1341的DATAI為其數(shù)據(jù)輸入端,DATAO為數(shù)據(jù)輸出端,BCK為其時鐘輸入端,WS為字選擇端,SYSCLK為時鐘信號線。L3MODE,L3DATA和L3CLOCK是UDA1341的L3接口總線,用來對其功能進(jìn)行控制和獲取狀態(tài)信息。S3C2440A沒有L3總線專用接口,故采用其GPB2,GPB3和GPB4引腳用軟件方式模擬實現(xiàn)L3總線功能從而對UDA1341中的音頻處理參數(shù)和系統(tǒng)控制參數(shù)進(jìn)行配置。從UDA1341的19引腳輸入的數(shù)字音頻信號經(jīng)過處理后,最終從24和26引腳輸出到揚(yáng)聲器發(fā)出聲音。
圖3 UDA1341音頻轉(zhuǎn)換電路原理圖
本設(shè)計中采用TFT的LCD來完成系統(tǒng)的顯示功能,S3C2440A內(nèi)部具有LCD控制器,可以支持TFT等帶觸摸屏功能的LCD。S3C2440A提供了讓LCD模塊工作的幀同步信號(VFRAME)、行同步信號(VLINE)、像素時鐘信號(VCLK)、AC偏置信號(VM)及數(shù)據(jù)信號(VD0~VD23)等。硬件電路設(shè)計簡單,只需將相應(yīng)信號對應(yīng)連接即可。
該流媒體播放終端選擇Linux操作系統(tǒng),通過移植Mplayer實現(xiàn)流媒體的播放,為了操作方便,用Embedded Qt編寫一個圖形界面操作程序。因此接下來的工作包括Linux內(nèi)核的移植、yaffs2文件系統(tǒng)的制作、Mplayer的移植、QT圖形界面應(yīng)用程序的編寫等。
Linux是一個開源免費(fèi)操作系統(tǒng),很受廣大嵌入式開發(fā)者歡迎。本設(shè)計選擇Linux-2.6.31內(nèi)核,其已經(jīng)帶有比較完善的設(shè)備驅(qū)動,不需太多修改。移植Linux的步驟如下:
1)從網(wǎng)絡(luò)上下載Linux-2.6.31,并解壓到相應(yīng)目錄。
2)修改其頂層 Makefile文件下的“ARCH?”和“CROSS_COMPILE?”為“ARCH=arm,CROSS_COMPILE?=arm-linu-”,并將“/arm/mach-S3C2440/mach-smdk2440.c”文件的第163行“S3c24xx_init_clocks(16934400)”修改為“s3c24xx_init_clocks(12000000)”,使輸入時鐘為12 MHz。
3)下載yaffs2源碼,通過執(zhí)行其目錄下的“patchker.sh”腳本給Linux-2.6.31打上補(bǔ)丁,使其支持yaffs2文件系統(tǒng)。
4)添加或修改相關(guān)驅(qū)動代碼后,執(zhí)行“make menuconfig”命令進(jìn)入圖形配置界面對內(nèi)核進(jìn)行裁剪和配置。配置好內(nèi)核后,在Linux內(nèi)核根目錄下執(zhí)行“make zImage”命令編譯,“arch/arm/boot”下將生成內(nèi)核映像文件zImage。
Yaffs2文件系統(tǒng)非常適合在Nand Flash上運(yùn)行。制作文件系統(tǒng)的步驟如下:
1)首先建立一個root_2.6.31目錄,再在root_2.6.31下建 立/bin,/etc,/dev,/home,/lib,/mnt,/opt,/proc,/root,/sbin,/sys,/tmp,/usr,/var等根文件系統(tǒng)目錄。
2)獲取busybox1.15.2源碼,修改其頂層Makefile中的“CROSS_COMPILE=arm-Linux-,ARCH=arm”。再執(zhí)行“make menuconfig”進(jìn)入圖形界面進(jìn)行配置。然后執(zhí)行“make”和“make install”命令編譯安裝。
3)將busybox1.15.2安裝后生成的文件復(fù)制到root_2.6.31相應(yīng)文件夾下,并在dev目錄下執(zhí)行“mknod console c 5 1”和“mknod null c 1 3”命令建立兩個設(shè)備節(jié)點(diǎn)。
4)制作文件系統(tǒng)的準(zhǔn)備工作做好后,使用mkyaffs2image工具執(zhí)行“mkyaffs2image root_2.6.31”,“root_2.6.31.bin”命令生成yaffs2文件系統(tǒng)鏡像。
Mplayer是一款開放源代碼的音視頻播放器,自帶解碼庫,也可以通過外掛解碼庫以支持播放更多格式的視頻文件或流媒體[4]。本設(shè)計采用MPlayer-1.0rc2版本。由于Mplayer本身就具備播放網(wǎng)絡(luò)流媒體的功能,采用將其移植到ARM平臺的方法大大減少了開發(fā)工作。
3.3.1 live555的編譯
Mplayer對網(wǎng)絡(luò)流媒體的在線播放功能離不開RTSP和MMS協(xié)議的支持,因此配置編譯Mplayer之前需編譯live555協(xié)議庫,此過程并不復(fù)雜,過程如下:
1)從網(wǎng)絡(luò)獲取live555協(xié)議庫,修改其live目錄下“config.armLinux”文件中變量“CROSS_COMPILE”為“CROSS_COMPILE?=arm-Linux-”。
2)在live根目錄下執(zhí)行“./genMakefile armLinux”命令,生成Makefile文件后,執(zhí)行make命令。
3)執(zhí)行“cp-r live/usr/local/lib”命令,這樣Mplayer編譯時就可以找到它了。
3.3.2 WMA的解碼器優(yōu)化
由于S3C2440A處理器上沒有用于浮點(diǎn)運(yùn)算的協(xié)處理器,不支持浮點(diǎn)運(yùn)算。當(dāng)前許多網(wǎng)絡(luò)電臺采用了WMA格式或者M(jìn)P3格式,MP3的定點(diǎn)解碼可通過移植libmad解決,這里不詳述。Mplayer的FFMPEG解碼庫解碼WMA采用了大量浮點(diǎn)運(yùn)算,直接使用會造成無聲現(xiàn)象,所以先進(jìn)行優(yōu)化。對WMA解碼器進(jìn)行優(yōu)化的方法有浮點(diǎn)運(yùn)算轉(zhuǎn)定點(diǎn)運(yùn)算、以空間換時間及手工匯編等。Mplayer主程序調(diào)用WMA解碼程序的過程如圖4所示,圖中的wma_decode_superframe,wma_decode_frame 和 wma_decode_block這3個函數(shù)在解碼過程中被調(diào)用頻繁,耗時較多,需對其優(yōu)先優(yōu)化[5]。此過程相當(dāng)繁瑣,工作量很大,因此不詳細(xì)敘述具體過程。優(yōu)化后能夠滿足系統(tǒng)對WMA格式解碼的要求。
圖4 WMA主要解碼函數(shù)及其關(guān)系
3.3.3 配置編譯Mplayer
Mplayer移植的準(zhǔn)備工作做好后就可以對Mplayer配置編譯了,配置如下:
./configure--disable-mencoder- -enable-Linux-devfs--disableiconv--disable-dvdnav--disable-dvdread--disable-dvdread-internal--disable-libdvdcss-internal--enable-libavcodec_a--enable-libavcodec_mpegaudio_hp--enable-mad--disable-mp3lib--disable-ivtv--enable-fbdev--enable-ossaudio--cc=arm-Linux-gcc--h(huán)ost-cc=gcc--target=arm-Linux--enable-static
其中“--cc=arm-Linux-gcc”用來指定交叉編譯工具,“--target=arm-Linux ”用來指定運(yùn)行平臺,“--h(huán)ostcc=gcc”用來編譯需要在host上執(zhí)行的中間文件,“--enable-static”表明使用靜態(tài)鏈接庫,“--enable-live”選項讓Mplayer支持流媒體協(xié)議,其他選項含義都可通過執(zhí)行“./configure-h(huán)elp”查看。配置完后,就會在相應(yīng)目錄下生成Makefile文件,然后通過執(zhí)行make命令,編譯完后在其頂層目錄就生成可執(zhí)行的mplayer文件。
Qt/Emdedded是Trolltech公司開發(fā)的面向嵌入式系統(tǒng)的Qt版本,其移植方便,簡單易學(xué),所以本設(shè)計采用它編寫一個方便用戶操作的圖形界面應(yīng)用程序。Mplayer有一種工作模式叫slave模式,在此模式下,它能夠接受用戶的輸入命令行,具體能夠支持的命令行通過執(zhí)行mplayer-input cmdlist可得到。用戶界面中有通過QPushButton類實例實現(xiàn)的打開文件、播放、暫停、停止等控件,這些控件被放在MainWindow這個類中。通過公有繼承QWidget的方法編寫一個用于顯示播放界面的Player類,Player中有一個QProcess類成員,在Player類的構(gòu)造函數(shù)中用它的成員函數(shù)start()就可執(zhí)行Mplayer程序,相關(guān)代碼如“mplayerProcess- > start(tr("/usr/bin/mplayer"),args);”。其 中mplayerProcess為 QProcess的實例化,args為傳遞給mplayer的參數(shù)。傳遞給 Mplayer的控制命令可通過QProcess的write()函數(shù)進(jìn)行。如實現(xiàn)Mplayer停止運(yùn)行的代碼如“mplayerProcess->write(“quit ”);”。實現(xiàn)其他控制功能類似。
類MainWindow和類Player之間及它們的成員之間是獨(dú)立的,不能相互通信,解決這一問題的是Qt的信號和槽機(jī)制,編程中具體實現(xiàn)這一功能的是connect()函數(shù),這一函數(shù)將各類的信號與信號或信號與槽關(guān)聯(lián)使得各類相互配合實現(xiàn)復(fù)雜的功能。如實現(xiàn)點(diǎn)擊播放功能的代碼如“connect(playButton,SIGNAL(clicked()),this,SLOT(slotPlay()));”。當(dāng)點(diǎn)擊播放按鈕時就會發(fā)射clicked()信號,此后實現(xiàn)播放功能的slotPlay()函數(shù)就會立即執(zhí)行,實現(xiàn)網(wǎng)絡(luò)流媒體的播放。設(shè)計好圖形操作界面后,就可以方便地操作Mplayer了。
本文通過移植Mplayer的方法在S3C2440A平臺上實現(xiàn)流媒體播放終端,并用QT為其編寫了一個圖形操作界面,可以通過有線或無線兩種方式訪問網(wǎng)絡(luò)。測試表明,在網(wǎng)絡(luò)暢通的地方,可以非常清晰地收聽網(wǎng)絡(luò)廣播和較流暢地收看網(wǎng)絡(luò)電視。實現(xiàn)的這款嵌入式流媒體播放終端具有體積小、功耗低及成本低的優(yōu)點(diǎn),能讓人們享受流媒體帶來的學(xué)習(xí)和生活上的方便及樂趣,有著良好的市場應(yīng)用前景。
[1]韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊[M].北京:人民郵電出版社,2008.
[2]韓超,王可人.基于DM9000的嵌入式系統(tǒng)的網(wǎng)絡(luò)接口設(shè)計與實現(xiàn)[J].工業(yè)控制計算機(jī),2007,27(20):17-18.
[3]胡力剛,許偉明,焦陽.基于S3C2410A和UDA1341TS的嵌入式音頻系統(tǒng)設(shè)計[J].計算機(jī)測量與控制,2009,17(12):2511-2512.
[4]周金和,焦瑞莉,王勇.嵌入式IPv6網(wǎng)絡(luò)視頻終端[J].電視技術(shù),2006,30(12):35-38.
[5]張海濱,李揮.基于S3C2410的WMA開源解碼程序優(yōu)化[J].計算機(jī)工程與設(shè)計,2009,30(1):13-15.