王正萬
(1.貴州大學(xué)貴州貴陽550000;2.貴州電子信息職業(yè)技術(shù)學(xué)院貴州凱里556000)
現(xiàn)在大多數(shù)嵌入式設(shè)備都要求實(shí)現(xiàn)音視頻的播放功能。ARM9+Linux在嵌入式系統(tǒng)中應(yīng)用廣泛,因此,這里提出一種嵌入式Linux下基于ARM9的多媒體播放系統(tǒng)。
播放器的嵌入式Linux系統(tǒng)的層次結(jié)構(gòu)如圖1所示。硬件上電后,CPU的程序指針首先指向一個(gè)特定的存儲(chǔ)器地址,該地址一般存放Bootloader,Bootloader在CPU和內(nèi)存初始化后,把Linux內(nèi)核從ROM設(shè)備中解壓到內(nèi)存,然后程序指針跳轉(zhuǎn)到內(nèi)核在內(nèi)存的起始位,由Linux內(nèi)核繼續(xù)完成剩下的系統(tǒng)引導(dǎo)[1]。內(nèi)核在重新初始化系統(tǒng)后,就加載根文件系統(tǒng),運(yùn)行用戶應(yīng)用程序。圖2為開發(fā)系統(tǒng)硬件設(shè)計(jì)框圖。
圖1 開發(fā)系統(tǒng)層次結(jié)構(gòu)Fig.1 Block diagram of development system hierarchy
圖2 系統(tǒng)硬件結(jié)構(gòu)框圖Fig.2 Structure diagram of system hardware design
系統(tǒng)硬件平臺(tái)的核心處理器為S3C2410X,微處理器是一款由Samsung公司為手持設(shè)備設(shè)計(jì)的低功耗、高度集成的基于ARM7TDMI核的微處理器。為了降低系統(tǒng)總成本和減少外圍器件,這款芯片中還集成有:16 KB指令Cache、16 KB數(shù)據(jù)Cache、MMU、外部存儲(chǔ)器控制器、LCD控制器(STN和TFT)、NAND Flash控制器、4個(gè)DMA通道、3通道UART、1個(gè)I2C總線控制器、1個(gè)I2S總線控制器,以及4通道PWM定時(shí)器和1個(gè)內(nèi)部定時(shí)器、通用I/O口、實(shí)時(shí)時(shí)鐘、8通道10位ADC和觸摸屏接口、USB主、USB從、SD/MMC卡接口等。該處理器廣泛應(yīng)用于PDA、移動(dòng)通信、路由器和工業(yè)控制等領(lǐng)域[2]。
軟件系統(tǒng)設(shè)計(jì)必須與硬件平臺(tái)緊密結(jié)合。S3C2410采用NAND Flash作為整個(gè)系統(tǒng)的程序存儲(chǔ)區(qū)域,在系統(tǒng)啟動(dòng)時(shí)通過片上ROM的Bootloader程序,從NAND Flash加載并執(zhí)行外部引導(dǎo)程序來實(shí)現(xiàn)整個(gè)系統(tǒng)的啟動(dòng)步驟,整個(gè)軟件系統(tǒng)采取圖3所示的設(shè)計(jì)結(jié)構(gòu)[3]。
madplay主程序頭文件信息數(shù)據(jù)結(jié)構(gòu)如下:
struct option const options[]={
{"adjust-volume",required_argument,0,’A’},
{"amplify",required_argument,0,’a’},
{"ancillary-output",required_argument,0,-’a’},
{"attenuate",required_argument,0,’a’},
{"bit-depth",required_argument,0,’b’},
{"display-time",required_argument,0,-’t’},
{"downsample",no_argument,0,-’d’},
{"fade-in",optional_argument,0,-’i’},
{"help",no_argument,0,’h’},
{"ignore-crc",no_argument,0,’i’},
{"left",no_argument,0,’1’},
{"license",no_argument,0,-’l’},
{"mono",no_argument,0,’m’},
{"no-dither",no_argument,0,’d’},
{"output",required_argument,0,’o’},
{"pre-amp",required_argument,0,’a’},
{"quiet",no_argument,0,’q’},
{"repeat",optional_argument,0,’r’},
{"replay-gain",optional_argument,0,’G’},
{"right",no_argument,0,’2’},
{"sample-rate",required_argument,0,’R’},
{"show-tags-only",no_argument,0,’T’},
{"shuffle",no_argument,0,’z’},
{"start",required_argument,0,’s’},
{"stereo",no_argument,0,’S’},
{"time",required_argument,0,’t’},
{"verbose",no_argument,0,’v’},
{"version",no_argument,0,’V’},
{"very-quiet",no_argument,0,’Q’},
}
本系統(tǒng)需要madplay源代碼以及l(fā)ibid3tag庫和libmad庫,這里采用madplay-0.15.1b.tar.gz、libid3tag-0.15.1b.tar.gz和libmad-0.15.1b.tar.gz,另外libid3tag庫編譯時(shí)需要zlib庫。將文件拷貝到/home/cvtech/jx2410/examples。其安裝后的目錄為:
[root@localhost root]#cd/home/cvtech/jx2410/examples
[root@localhost examples]#tar zxvf madplay.tar.gz
[root@localhost examples]#cd madplay
[root@localhost madplay]#ls-l
drwxr-xr-x4 rootroot 40961月25 11:10 install
drwxrwxrwx510001000 40961月25 12:06 libid3tag-0.15.1b
drwxrwxrwx5 10001000 40961月25 12:06 libmad-0.15.1b
drwxr-xr-x4 rootroot 40961月25 10:25 libz
drwxrwxrwx8 10001000 40961月25 12:06 madplay-0.15.1b
-rwxrwxrwx1 rootroot 12281月25 11:50 mkall
drwxr-xr-x7rootroot 40961月2511:35zlib-1.1.4
其中,install目錄是libid3tag和libmad庫安裝后的安裝目錄,madplay編譯時(shí)必須正確指定該目錄下的include和lib子目錄為其include搜索目錄和庫文件搜索目錄;libid3tag-0.15.1b為libid3tag庫的源代碼目錄[4];libmad-0.15.1b為libmad庫的源代碼目錄;libz為libz庫安裝目錄,libid3tag庫編譯時(shí)使用;madplay-0.15.1b為madplay源程序目錄;mkall為編譯腳本。
在該目錄下直接執(zhí)行以下語句:[root@localhost madplay]#./mkall
該腳本將編譯libid3tag庫、libmad庫以及madplay。編譯成功后在madplay-0.15.1b目錄下生成madplay文件即為MP3播放器程序。
編譯libid3tag庫:
cd libid3tag-0.15.1b
make distclean
CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc./configure--host=arm-linux--
prefix=/home/cvtech/jx2410/examples/madplay/installCPPFLAGS=-I
/
home/cvtech/jx2410/examples/madplay/libz/include LDFLAGS=-
L/home/cvtech/jx2410/examples/madplay/libz/lib make
make install
編譯libmad庫:
cd../libmad-0.15.1b
make distclean
CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc./configure--host=arm-linux--
prefix=/home/cvtech/jx2410/examples/madplay/install make
make install
編譯madplay:
cd../madplay-0.15.1b
make distclean
CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc./configure--host=arm-linux--enable-static CPPFLAGS=-I/home/cvtech/jx2410/examples/madplay/install/includeLDFLAGS=-L/home/cvtech/jx2410/examples/madplay/install/lib/make
/usr/local/arm/2.95.3/bin/arm-linux-gcc-static-Wall-g-O2-o madplay madplay.o getopt.o getopt1.o version.o resample.o filter.o tag.o crc.o player.o audio.o audio_aiff.o audio_cdda.o audio_hex.o audio_null.o audio_raw.o audio_snd.o audio_wave.o audio_oss.o-L/home/cvtech/jx2410/examples/madplay/install/lib/home/cvtech/jx2410/examples/madplay/install/lib/libmad.a/home/cvtech/jx2410/examples/madplay/install/lib/libid3tag.a-L/home/cvtech/jx2410/examples/madplay/libz/lib-lz-lm cd..
編譯成功后將在madplay目錄下生成mplayer文件,該文件為mplayer媒體播放程序:
[root@localhost madplay-0.15.1b]#cp madplay/tftpboot
下載運(yùn)行。啟動(dòng)ARM9+Linux平臺(tái),用U盤中的MP3音頻文件zgl.mp3,系統(tǒng)使用該文件進(jìn)行測(cè)試:
#mount 192.168.1.180:/tftpboot/mnt/nfs
#mount/dev/sda1/mnt/udisk
#cd/mnt/nfs
#./madplay/mnt/cramfs/mp3/zgl.mp3
將耳機(jī)插入SPK座,如果正常的話將聽到歌聲。
mplayer只支持16 bpp以上圖形顯示,而不支持8 bpp圖形顯示,因此,當(dāng)mplayer程序運(yùn)行在LCD配置為STN的教學(xué)系統(tǒng)時(shí),只能播放聲音,不能顯示圖形,而在LCD配置為TFT的教學(xué)系統(tǒng)時(shí),既可以播放聲音,又能顯示圖形[5]。
以下為音視頻同步代碼
static float default_max_pts_correction=-1;//0.01f;
staticfloatmax_pts_correction=0;//default_max_pts_correction;
static float c_total=0;
float audio_delay=0;
static int softsleep=0;
float force_fps=0;
static int force_srate=0;
static int audio_output_format=0;
int frame_dropping=0;
static int play_n_frames=-1;
static int play_n_frames_mf=-1;安裝及編譯結(jié)果如下:
[root@localhost root]#cd/home/cvtech/jx2410/examples
[root@localhost examples]#tar zxvf mplayer.tar.gz
[root@localhost examples]#cd MPlayer-0.93
在MPlayer-0.93目錄下有一個(gè)腳本文件:mkall,這個(gè)文件為編譯腳本。在該目錄下直接執(zhí)行:[root@localhost MPlayer-0.93]#./mkall
該腳本將配置并編譯mplayer,下面是該腳本所進(jìn)行的配置和編譯命令:
./configure--cc=/usr/local/arm/2.95.3/bin/arm-linux-gcc--target=arm-linux--with-extralibdir=/usr/local/arm/2.95.3/armlinux/lib/-with-extraincdir=/usr/local/arm/2.95.3/arm-linux/include/--disable-sdl--enable-static--disable-dvdnav--disable-tv--disable-gui--
disable-mpdvdkit--enable-linux-devfs make
編譯成功后將在MPlayer-0.93目錄下生成mplayer文件,該文件為mplayer媒體播放程序。
[root@localhost MPlayer-0.93]#cp mplayer/tftpboot
下載運(yùn)行。啟動(dòng)ARM9+Linux平臺(tái),用U盤中的mpeg視頻測(cè)試[6]。
#mount 192.168.1.180:/tftpboot/mnt/nfs
#mount/dev/sda1/mnt/udisk
#cd/mnt/nfs
#./mplayer-vo fbdev/mnt/udisk/zbs.mpeg
將耳機(jī)插入SPK座,觀察LCD顯示器,測(cè)試系統(tǒng)是否有音視頻輸出。
本系統(tǒng)設(shè)計(jì)具有很好的移植性,其實(shí)現(xiàn)過程和核心的代碼對(duì)同類應(yīng)用有很好的通用性,只需要較小的修改就能移植到不同的操作系統(tǒng)和平臺(tái)上,可以廣泛使用在各種嵌入式系統(tǒng)中,如PDA,智能手機(jī)等方面,并具有較高的經(jīng)濟(jì)價(jià)值。該設(shè)計(jì)方案具有低耦合、高內(nèi)聚、可擴(kuò)展、可移植等良好特點(diǎn),支持編碼格式為MPEG-1、MPEG-2、MPEG-3和MPEG-4等多媒體文件。
[1]韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊(cè)[M].北京:人民郵電出版社,2008:68-70.
[2]邵長彬,李洪亮.用Busybox制作嵌入式Linux根文件系統(tǒng)[J].微計(jì)算機(jī)信息,2007,23(10-2):48-50.
SHAO chang-Bin,LI Hong-liagn.With busybox make embedded Linux root file system[J].Micro-computer information,2007,23(10-2):48-50.
[3]馬忠梅,馬廣云,徐英慧,等.ARM嵌入式處理器結(jié)構(gòu)與應(yīng)用基礎(chǔ)[M].北京:北京航空航天大學(xué)出版社,2002.
[4]馬忠梅,李善平,康慨,等.ARM&Linux嵌入式系統(tǒng)教程[M].北京:北京航天航空大學(xué)出版社,2005.
[5]夏靖波,王航,陳雅蓉.嵌入式系統(tǒng)原理與開發(fā)[M].西安:西安電子科技大學(xué)出版社,2006.
[6]陳峰,李濱滔,戈志華.基于S3C2410的嵌入式Linux系統(tǒng)構(gòu)建[J].現(xiàn)代電子技術(shù),2007(24):55-57.
CHEN Feng,TAO Li-Bin,GE Zhi-hua.S3C2410-based embedded Linux system construction[J].Modern Electronic Technology,2007(24):55-57.