楊功銀,付 玉,黎 珍
(湖南師范大學 工學院,湖南 長沙 410086)
計算機和電子通信技術的發展將人們帶入了嶄新的數字化音視頻世界。人們可以不再僅僅依靠易受干擾的無線電波收聽廣播和收看電視,還可以跨地域實時地欣賞網絡上的電臺和電視節目,這些與流媒體技術的出現和發展密切相關。流媒體技術讓用戶無需將整個文件下載完而只需等待緩沖片刻就可欣賞,其余部分在后臺從服務器繼續下載。目前來看,這些都是在PC機上實現的,PC機處理能力強大,但也有笨重不便攜帶、耗電量大及需占較大空間等缺點,有時甚至是一種資源浪費。本文將嵌入式技術引入流媒體播放領域設計了一款基于S3C2440A的嵌入式流媒體播放終端,具有體積小、低功耗、低成本及操作簡單等優點。
系統硬件如圖1所示。S3C2440A為系統處理器,SDRAM使用兩片三星公司的K4S561632構成了32位數據寬度的存儲系統,并映射到S3C2440A的BANK6上。Nor Flash采用EN29LV160AB,接在S3C2440A的BANK0上用來存取引導操作系統的Bootloader。Nand Flash采用K9F2G08,其有專門的時序控制總線,不占用系統總線資源,用來存儲操作系統內核、文件系統等。該播放終端通過DM9000以太網卡以有線方式或USB無線網卡以無線方式連接。UDA1341主要用來將從S3C2440A輸出的數字音頻信號轉換為模擬音頻信號輸出。LCD顯示模塊主要是完成顯示功能,具有觸摸功能,方便用戶觀看和操作等。S3C2440A上運行一個具有所有相關驅動的Linux操作系統,將Mplayer移植到該平臺上。在操作系統及網絡協議的支持下,Mplayer就可以從服務器上下載音視頻流,并完成解碼,再由UDA1341芯片D/A轉換或LCD幀緩沖顯示。因嵌入式系統資源的有限性不適合Mplayer自帶的圖形界面運行,所以用Qt重新編寫一個圖形界面以方便用戶操作。

圖1 系統總體方案
S3C2440A核心處理器采用ARM公司設計的16/32位ARM920T的RISC處理器,是一款低價格、低功耗、具有高性價比且廣泛用于手持設備的微控制器[1]。它實現了MMU,AMBA BUS和Harvard高速緩沖體系結構,具有獨立的16 kbyte指令Cache和16 kbyte數據Cache,集成有I2S音頻編解碼接口、LCD接口、SDRAM內存控制器、Nand Flash控制器、USB控制器、ADC及觸摸屏接口等。工作主頻一般為400 MHz,最高可達533 MHz。該設計中S3C2440A工作所需時鐘源由外接12 MHz晶振提供。此外,采用2片三星公司的K4S561632,片選信號為 nGCS6,2 Mbyte的 Nor Flash EN29LV160AB,片選信號為nGCS0。Nand Flash不是一種總線型設備,S3C2440A提供了專用訪問接口,本設計中采用256 Mbyte的K9F2G08。這樣S3C2440A就和外部的時鐘電路及SDRAM,Nor Flash和Nand Flash存儲設備組成S3C2440A最小系統。
嵌入式流媒體播放終端網絡接口部分是必不可少的,該播放終端可以通過有線的以太網卡DM9000或USB WiFi無線網卡訪問網絡。
DM9000是DEVICOM公司生產的一款10/100(Mbit·s-1)快速以太網卡控制芯片,它實現了以太網媒體介質訪問層(MAC)和物理層(PHY)的功能,集成有10/100(Mbit·s-1)自適應收發器,4 kbyte雙字節的靜態隨機存儲器,支持介質無關接口和幀喚醒,完全符合IEEE 802.3u規格,支持IEEE 802.3x全雙工的流控制[2]。通過設置,外部處理器可以以8位、16位、32位這3種方式之一訪問DM9000內部存儲器。本設計中DM9000與S3C2440A處理器的連接如圖2所示。

圖2 DM9000網卡電路原理圖
S3C2440A的 nGCS4與 DM9000的 AEN相連,SA4,SA5,SA6及SA7直接跟地線相連,SA8和SA9與電源連接。當AEN引腳為低電平時DM9000就被選中。SD0~SD15與S3C2440A的 DATA0~DATA15相連,CMD引腳與S3C2440A的ADDR2連接。當CMD引腳為高電平時,SD0~SD15上傳輸的是數據,反之傳輸地址。nWAIT為讀寫等待信號,當其為低電平時說明上條指令沒執行完,當前指令需等待。nOE和nWE為DM9000的讀和寫允許信號,都是低電平有效。LAN_INT與S3C2440A的18號中斷相連,nRESET為初始化 DM9000的重啟信號,EEDO和WAKEUP引腳為默認的低電平,這決定其總線寬度為16位。X1和X2引腳兩端外接25 MHz石英晶振外圍電路組成 DM9000 的時鐘電路。RXI+,RXI-,TXO+,TXO-為網絡信號的輸入和輸出端。DM9000接在BANK4上,片選信號為NGCS4。
因S3C2440A集成USB控制器,硬件電路幾乎不需要重新設計,只需選擇一款在軟件上能被支持的USB無線網卡就能實現通過無線方式訪問網絡。
UDA1341是一款飛利浦公司生產的支持I2S接口的數字音頻解碼芯片,它采用位元流技術進行信號處理,具備AD轉換和DA轉換功能,并可用PGA(可編程增益控制)和AGC(自動增益控制)對模擬信號進行處理,同時其對數字信號提供了DSP處理功能[3]。UDA1341在本設計中完成將S3C2440A送來的數字音頻信號轉化成模擬信號輸出,UDA1341音頻轉換電路如圖3所示。S3C2440A提供了5 根 I2S 信號線(I2SSO,I2SSDI,I2SLRCK,I2SSCLK,CDCLK)與UDA1341相應信號線相連,UDA1341的DATAI為其數據輸入端,DATAO為數據輸出端,BCK為其時鐘輸入端,WS為字選擇端,SYSCLK為時鐘信號線。L3MODE,L3DATA和L3CLOCK是UDA1341的L3接口總線,用來對其功能進行控制和獲取狀態信息。S3C2440A沒有L3總線專用接口,故采用其GPB2,GPB3和GPB4引腳用軟件方式模擬實現L3總線功能從而對UDA1341中的音頻處理參數和系統控制參數進行配置。從UDA1341的19引腳輸入的數字音頻信號經過處理后,最終從24和26引腳輸出到揚聲器發出聲音。

圖3 UDA1341音頻轉換電路原理圖
本設計中采用TFT的LCD來完成系統的顯示功能,S3C2440A內部具有LCD控制器,可以支持TFT等帶觸摸屏功能的LCD。S3C2440A提供了讓LCD模塊工作的幀同步信號(VFRAME)、行同步信號(VLINE)、像素時鐘信號(VCLK)、AC偏置信號(VM)及數據信號(VD0~VD23)等。硬件電路設計簡單,只需將相應信號對應連接即可。
該流媒體播放終端選擇Linux操作系統,通過移植Mplayer實現流媒體的播放,為了操作方便,用Embedded Qt編寫一個圖形界面操作程序。因此接下來的工作包括Linux內核的移植、yaffs2文件系統的制作、Mplayer的移植、QT圖形界面應用程序的編寫等。
Linux是一個開源免費操作系統,很受廣大嵌入式開發者歡迎。本設計選擇Linux-2.6.31內核,其已經帶有比較完善的設備驅動,不需太多修改。移植Linux的步驟如下:
1)從網絡上下載Linux-2.6.31,并解壓到相應目錄。
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源碼,通過執行其目錄下的“patchker.sh”腳本給Linux-2.6.31打上補丁,使其支持yaffs2文件系統。
4)添加或修改相關驅動代碼后,執行“make menuconfig”命令進入圖形配置界面對內核進行裁剪和配置。配置好內核后,在Linux內核根目錄下執行“make zImage”命令編譯,“arch/arm/boot”下將生成內核映像文件zImage。
Yaffs2文件系統非常適合在Nand Flash上運行。制作文件系統的步驟如下:
1)首先建立一個root_2.6.31目錄,再在root_2.6.31下建 立/bin,/etc,/dev,/home,/lib,/mnt,/opt,/proc,/root,/sbin,/sys,/tmp,/usr,/var等根文件系統目錄。
2)獲取busybox1.15.2源碼,修改其頂層Makefile中的“CROSS_COMPILE=arm-Linux-,ARCH=arm”。再執行“make menuconfig”進入圖形界面進行配置。然后執行“make”和“make install”命令編譯安裝。
3)將busybox1.15.2安裝后生成的文件復制到root_2.6.31相應文件夾下,并在dev目錄下執行“mknod console c 5 1”和“mknod null c 1 3”命令建立兩個設備節點。
4)制作文件系統的準備工作做好后,使用mkyaffs2image工具執行“mkyaffs2image root_2.6.31”,“root_2.6.31.bin”命令生成yaffs2文件系統鏡像。
Mplayer是一款開放源代碼的音視頻播放器,自帶解碼庫,也可以通過外掛解碼庫以支持播放更多格式的視頻文件或流媒體[4]。本設計采用MPlayer-1.0rc2版本。由于Mplayer本身就具備播放網絡流媒體的功能,采用將其移植到ARM平臺的方法大大減少了開發工作。
3.3.1 live555的編譯
Mplayer對網絡流媒體的在線播放功能離不開RTSP和MMS協議的支持,因此配置編譯Mplayer之前需編譯live555協議庫,此過程并不復雜,過程如下:
1)從網絡獲取live555協議庫,修改其live目錄下“config.armLinux”文件中變量“CROSS_COMPILE”為“CROSS_COMPILE?=arm-Linux-”。
2)在live根目錄下執行“./genMakefile armLinux”命令,生成Makefile文件后,執行make命令。
3)執行“cp-r live/usr/local/lib”命令,這樣Mplayer編譯時就可以找到它了。
3.3.2 WMA的解碼器優化
由于S3C2440A處理器上沒有用于浮點運算的協處理器,不支持浮點運算。當前許多網絡電臺采用了WMA格式或者MP3格式,MP3的定點解碼可通過移植libmad解決,這里不詳述。Mplayer的FFMPEG解碼庫解碼WMA采用了大量浮點運算,直接使用會造成無聲現象,所以先進行優化。對WMA解碼器進行優化的方法有浮點運算轉定點運算、以空間換時間及手工匯編等。Mplayer主程序調用WMA解碼程序的過程如圖4所示,圖中的wma_decode_superframe,wma_decode_frame 和 wma_decode_block這3個函數在解碼過程中被調用頻繁,耗時較多,需對其優先優化[5]。此過程相當繁瑣,工作量很大,因此不詳細敘述具體過程。優化后能夠滿足系統對WMA格式解碼的要求。

圖4 WMA主要解碼函數及其關系
3.3.3 配置編譯Mplayer
Mplayer移植的準備工作做好后就可以對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--host-cc=gcc--target=arm-Linux--enable-static
其中“--cc=arm-Linux-gcc”用來指定交叉編譯工具,“--target=arm-Linux ”用來指定運行平臺,“--hostcc=gcc”用來編譯需要在host上執行的中間文件,“--enable-static”表明使用靜態鏈接庫,“--enable-live”選項讓Mplayer支持流媒體協議,其他選項含義都可通過執行“./configure-help”查看。配置完后,就會在相應目錄下生成Makefile文件,然后通過執行make命令,編譯完后在其頂層目錄就生成可執行的mplayer文件。
Qt/Emdedded是Trolltech公司開發的面向嵌入式系統的Qt版本,其移植方便,簡單易學,所以本設計采用它編寫一個方便用戶操作的圖形界面應用程序。Mplayer有一種工作模式叫slave模式,在此模式下,它能夠接受用戶的輸入命令行,具體能夠支持的命令行通過執行mplayer-input cmdlist可得到。用戶界面中有通過QPushButton類實例實現的打開文件、播放、暫停、停止等控件,這些控件被放在MainWindow這個類中。通過公有繼承QWidget的方法編寫一個用于顯示播放界面的Player類,Player中有一個QProcess類成員,在Player類的構造函數中用它的成員函數start()就可執行Mplayer程序,相關代碼如“mplayerProcess- > start(tr("/usr/bin/mplayer"),args);”。其 中mplayerProcess為 QProcess的實例化,args為傳遞給mplayer的參數。傳遞給 Mplayer的控制命令可通過QProcess的write()函數進行。如實現Mplayer停止運行的代碼如“mplayerProcess->write(“quit ”);”。實現其他控制功能類似。
類MainWindow和類Player之間及它們的成員之間是獨立的,不能相互通信,解決這一問題的是Qt的信號和槽機制,編程中具體實現這一功能的是connect()函數,這一函數將各類的信號與信號或信號與槽關聯使得各類相互配合實現復雜的功能。如實現點擊播放功能的代碼如“connect(playButton,SIGNAL(clicked()),this,SLOT(slotPlay()));”。當點擊播放按鈕時就會發射clicked()信號,此后實現播放功能的slotPlay()函數就會立即執行,實現網絡流媒體的播放。設計好圖形操作界面后,就可以方便地操作Mplayer了。
本文通過移植Mplayer的方法在S3C2440A平臺上實現流媒體播放終端,并用QT為其編寫了一個圖形操作界面,可以通過有線或無線兩種方式訪問網絡。測試表明,在網絡暢通的地方,可以非常清晰地收聽網絡廣播和較流暢地收看網絡電視。實現的這款嵌入式流媒體播放終端具有體積小、功耗低及成本低的優點,能讓人們享受流媒體帶來的學習和生活上的方便及樂趣,有著良好的市場應用前景。
[1]韋東山.嵌入式Linux應用開發完全手冊[M].北京:人民郵電出版社,2008.
[2]韓超,王可人.基于DM9000的嵌入式系統的網絡接口設計與實現[J].工業控制計算機,2007,27(20):17-18.
[3]胡力剛,許偉明,焦陽.基于S3C2410A和UDA1341TS的嵌入式音頻系統設計[J].計算機測量與控制,2009,17(12):2511-2512.
[4]周金和,焦瑞莉,王勇.嵌入式IPv6網絡視頻終端[J].電視技術,2006,30(12):35-38.
[5]張海濱,李揮.基于S3C2410的WMA開源解碼程序優化[J].計算機工程與設計,2009,30(1):13-15.