王正萬
(1.貴州大學貴州貴陽550000;2.貴州電子信息職業技術學院貴州凱里556000)
現在大多數嵌入式設備都要求實現音視頻的播放功能。ARM9+Linux在嵌入式系統中應用廣泛,因此,這里提出一種嵌入式Linux下基于ARM9的多媒體播放系統。
播放器的嵌入式Linux系統的層次結構如圖1所示。硬件上電后,CPU的程序指針首先指向一個特定的存儲器地址,該地址一般存放Bootloader,Bootloader在CPU和內存初始化后,把Linux內核從ROM設備中解壓到內存,然后程序指針跳轉到內核在內存的起始位,由Linux內核繼續完成剩下的系統引導[1]。內核在重新初始化系統后,就加載根文件系統,運行用戶應用程序。圖2為開發系統硬件設計框圖。

圖1 開發系統層次結構Fig.1 Block diagram of development system hierarchy

圖2 系統硬件結構框圖Fig.2 Structure diagram of system hardware design
系統硬件平臺的核心處理器為S3C2410X,微處理器是一款由Samsung公司為手持設備設計的低功耗、高度集成的基于ARM7TDMI核的微處理器。為了降低系統總成本和減少外圍器件,這款芯片中還集成有:16 KB指令Cache、16 KB數據Cache、MMU、外部存儲器控制器、LCD控制器(STN和TFT)、NAND Flash控制器、4個DMA通道、3通道UART、1個I2C總線控制器、1個I2S總線控制器,以及4通道PWM定時器和1個內部定時器、通用I/O口、實時時鐘、8通道10位ADC和觸摸屏接口、USB主、USB從、SD/MMC卡接口等。該處理器廣泛應用于PDA、移動通信、路由器和工業控制等領域[2]。
軟件系統設計必須與硬件平臺緊密結合。S3C2410采用NAND Flash作為整個系統的程序存儲區域,在系統啟動時通過片上ROM的Bootloader程序,從NAND Flash加載并執行外部引導程序來實現整個系統的啟動步驟,整個軟件系統采取圖3所示的設計結構[3]。
madplay主程序頭文件信息數據結構如下:
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’},
}
本系統需要madplay源代碼以及libid3tag庫和libmad庫,這里采用madplay-0.15.1b.tar.gz、libid3tag-0.15.1b.tar.gz和libmad-0.15.1b.tar.gz,另外libid3tag庫編譯時需要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編譯時必須正確指定該目錄下的include和lib子目錄為其include搜索目錄和庫文件搜索目錄;libid3tag-0.15.1b為libid3tag庫的源代碼目錄[4];libmad-0.15.1b為libmad庫的源代碼目錄;libz為libz庫安裝目錄,libid3tag庫編譯時使用;madplay-0.15.1b為madplay源程序目錄;mkall為編譯腳本。
在該目錄下直接執行以下語句:[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
下載運行。啟動ARM9+Linux平臺,用U盤中的MP3音頻文件zgl.mp3,系統使用該文件進行測試:
#mount 192.168.1.180:/tftpboot/mnt/nfs
#mount/dev/sda1/mnt/udisk
#cd/mnt/nfs
#./madplay/mnt/cramfs/mp3/zgl.mp3
將耳機插入SPK座,如果正常的話將聽到歌聲。
mplayer只支持16 bpp以上圖形顯示,而不支持8 bpp圖形顯示,因此,當mplayer程序運行在LCD配置為STN的教學系統時,只能播放聲音,不能顯示圖形,而在LCD配置為TFT的教學系統時,既可以播放聲音,又能顯示圖形[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;安裝及編譯結果如下:
[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目錄下有一個腳本文件:mkall,這個文件為編譯腳本。在該目錄下直接執行:[root@localhost MPlayer-0.93]#./mkall
該腳本將配置并編譯mplayer,下面是該腳本所進行的配置和編譯命令:
./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
下載運行。啟動ARM9+Linux平臺,用U盤中的mpeg視頻測試[6]。
#mount 192.168.1.180:/tftpboot/mnt/nfs
#mount/dev/sda1/mnt/udisk
#cd/mnt/nfs
#./mplayer-vo fbdev/mnt/udisk/zbs.mpeg
將耳機插入SPK座,觀察LCD顯示器,測試系統是否有音視頻輸出。
本系統設計具有很好的移植性,其實現過程和核心的代碼對同類應用有很好的通用性,只需要較小的修改就能移植到不同的操作系統和平臺上,可以廣泛使用在各種嵌入式系統中,如PDA,智能手機等方面,并具有較高的經濟價值。該設計方案具有低耦合、高內聚、可擴展、可移植等良好特點,支持編碼格式為MPEG-1、MPEG-2、MPEG-3和MPEG-4等多媒體文件。
[1]韋東山.嵌入式Linux應用開發完全手冊[M].北京:人民郵電出版社,2008:68-70.
[2]邵長彬,李洪亮.用Busybox制作嵌入式Linux根文件系統[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嵌入式處理器結構與應用基礎[M].北京:北京航空航天大學出版社,2002.
[4]馬忠梅,李善平,康慨,等.ARM&Linux嵌入式系統教程[M].北京:北京航天航空大學出版社,2005.
[5]夏靖波,王航,陳雅蓉.嵌入式系統原理與開發[M].西安:西安電子科技大學出版社,2006.
[6]陳峰,李濱滔,戈志華.基于S3C2410的嵌入式Linux系統構建[J].現代電子技術,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.