引 言
嵌入式系统是以应用为中心、以计算机技术为基础,软件硬件可裁剪,适应于应用系统的功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。我们将MPlayer移植到嵌入式系统中,是因为MPlayer播放器是Linux下最优秀的多媒体播放器之一,它的播放速度最快,支持的文件格式也最多。随着技术的不断进步,媒体播放器已越来越多,选择一款多功能播放器,实在不容易。MPlayer就是个好的媒体播放器,资源占用率极低,支持格式极广,输出设备支持极多,所以值得移植到嵌入式系统中。
配置与编译安装MPlayer
MPlayer是Linux上的电影播放器,它的功能十分强大,能够播放众多格式的文件,在X86 PC机上运行很稳定,也可以把它移植到非X86 CPU上的嵌入式系统中来。我们就是将MPlayer软件移植到ARM9开发板中,让MPlayer运行在ARM核上。MPlayer能使用众多本地的、Xanim、RealPlayer和Win32 DLL编解码器,播放大多数MPEG、VOB、AVI、OGG、VIVO、ASF/WMV、QT/MOV、FLI、RM、NuppelVideo、yuv4mpeg、FILM、RoQ文件。
借助于MPlayer你能观看VideoCD、SVCD、DVD、3ivx、RealMedia和DivX格式的电影。MPlayer的另一个大的特色是支持广泛的输出设备,它可以在X11、Xv、DGA、OpenGL、SVGAlib、fbdev、Aalib、DirectFB下工作,而且你也能使用GGI和SDL(由此使用它们支持的各种驱动模式) 和一些低级的硬件相关的驱动模式。这个播放器能很稳定地播放被破坏的MPEG文件,并且它能播放Windows media player 都打不开的有损坏的AVI文件,甚至,没有索引部分的AVI文件也可以播放。
MEncoder的使用
MPlayer采用的编解码器包是libavcodec,这个编解码器包可以在多种平台上对H263/MPES/RV10/ DivX4/DivX5/MP41/MP42/WMV1编码格式的视频流进行解码,它同时也是已知完成这些任务最快的解码器。MEncoder(MPlayer电影解码器)可以生成MPEG(MPEG-PS)格式的输出文件。它们只能用于libav codec的mpeg1video编解码器,因为一般播放器(除了MPlayer) 认为MPEG文件中包含的是MPEG1视频流和MPEG1 layer 2(MP2)音频流。要改变MEncoder的输出文件格式,可以使用-of mpeg选项。例如: mencoder -of mpeg -ovc lavc -lavcopts vcodec-mpeg1video -oac copy <other options> media.avi -o output.mpg。
MEncoder能用两种方式处理输入流:编码和复制
a.视频流(-ovc copy选项):MEncoder可以把FLI或者VIVO或者MPEG1的视频放到AVI文件中;还可以将视频流复制用于只有音频流需要被编码的情况。
b.音频流(-oac copy选项): 可以把一个外部音频文件(MP3,Vorbis)传到输出流中。使用-audiofile <filename>选择来实现这个功能。
MEncoder可以修复交错损坏的AVI文件,我们可以简单地复制视频和音频流,并用MEncoder产生索引。命令为:mencoder -idx input.avi -ovc copy -oac copy -o output.avi。MEncoder还可以用来修复两个或多个AVI文件并将其合并成一个文件。
如果需要GUI图形用户界面,就要安装gtk并且必须在运行./configure时使用_enable-gui来编译代码,然后在config文件中添加gui=yes;或者用-s $PREFIX/bin/MPlayer$PREFIX/bin/gmplayer,之后运行gmpalyer即可。目前MPlayer不自带skin,所以要使用GUI,就必须到网上下载,将下载回来的文件解压到$HOME/.mpslayer/skin下。
MPlayer有一个用户定义的OSD菜单接口,在编译MPlayer时,在./configure加上_enable-menu参数,这样确保安装了OSD字体;把etc/menu.conf复制到./mplayer目录下;把etc/input.conf复制到./mplayer目录下;检查并编辑input.conf来启动菜单控制键;键入mplayer -menu file.avi,来使用mplayer。将上述步骤做好后,就可以编译MPlayer,先到网上下载MPlayer0.91版本:
tar xzvf mplayer-0.91.tgz
./configure
make
make install
如果进行顺利的话,就可以运行你想看到的图像和声音了。
MPlayer在开发板上的实现
不过以上这些都是在X86 PC上实现的,要想在以ARM(开发板的CPU为S3C2410)为核心嵌入式开发板上实现此过程,还需要做下面的工作。首先要在交叉编译环境中对MPlayer进行编译,将Mplayer源代码中关于视、音频部分以及驱动部分写入Makefile文件里。由于开发板只有64MB的SDRAM及16MB的FLASH,而且应用程序一般都烧写到FLASH中,应用程序大概有16MB左右,所以直接将应用程序烧写到开发板里的FLASH中的做法不可行,这样开发板会因空间太小而拒绝运行应用程序。
当要在嵌入式系统中调试某个软件时,可以将软件应用代码拷贝到移动存储中,再将移动存储里的文件加载到嵌入式开发板上进行调试,也可以将软件应用代码通过PC机上的Linux操作系统挂载到嵌入式系统的开发板中进行调试,运行正常后再将软件应用代码烧写到开发板中,这样就可以避免应用程序在FLASH上的重复擦写。
我们所采用的方法是将宿主机和嵌入式开发板之间用以太网连接,在宿主机的Linux操作系统下的终端中运行minicom作为开发板的显示终端,通过Linux下的NFS网络文件系统将宿主机的硬盘安装到开发板上的某个目录下,然后再运行MPlayer的可执行文件./mplayer。将你想要播放的图像文件1.avi也放到宿主机的某个目录下( 如:/home/1.avi),同时将mplayer可执行文件也拷贝到此目录下/home/mplayer。假设宿主机的IP地址为192.168.2.122,在目标板上输入mount -o nolock 192.168.2.122:/home /mnt进入目标板的mnt目录:cd/mnt,然后运行./mplayer 1.avi,即可以观看在开发板的LCD上显示1.avi的内容。当然最后不要忘了播放完成后要从目标板上卸载宿主机的目录,键入umount /mnt即可。
如果没有NFS网络系统的支持,也可以自己做一个10MB的文件系统,开发板的FLASH为16MB,系统资源占去4MB左右FLASH的空间,而将ramdisk文件系统作为系统运行的最小文件系统,容量大概限定在2MB以内,剩下的10MB左右的FLASH可以做成Cramfs文件系统,它是一个压缩文件系统,实际容量可达到12MB~15MB,基本上满足了用户的应用要求。改变内核的配置,将支持Cramfs文件系统的功能编译到内核中,重新编写驱动程序并加到Makefile文件中,然后进行编译,在烧写ramdisk文件系统之后继续烧写Cramfs文件系统。烧写完毕后启动开发板,Cramfs就会作为ramdisk的子目录出现,直接调用该目录下的应用文件即可。
此开发板可用于掌上PDA的前期设计和应用。嵌入式系统软件的发展是以应用为中心,所以我们要利用国内巨大的应用市场资源,将我国的软件业发展成嵌入式系统软件、支撑软件、应用软件共同发展的格局。