ARM 9 MPlayer 移植总结

来源:互联网 发布:联表查询sql语句 编辑:程序博客网 时间:2024/06/01 16:43
        一个项目要求上音频、视频播放。项目环境为linux2.6 + s3c2440,google了一下,应该是mplayer无疑了。
        网上很多好人把mplayer的移植过程分享出来了,比较详细。自己交叉编译的过程中遇到的问题基本上都能搜索到解决办法。
        先到官方网站http://www.mplayerhq.hu下载一个最新的1.0-rc2版本,解压后就按照按照步骤来交叉编译了。
        MPlayer-1.0rc2.tar.bz2  + arm-linux-gcc-3.4.1.tar.bz2(就是网上流传的那个版本)


        1。./configure
         关键就是后面的配置参数了。rc2版本的配置参数相比pre版本而言有些微的改变,配置参数如下:


./configure --cc=arm-linux-gcc --target=arm-linux --enable-static \
     --prefix=/tmp/mplayer-rc2 --disable-win32dll --disable-dvdread \
     --enable-fbdev --disable-mencoder --disable-live --disable-mp3lib \
     --enable-mad --enable-libavcodec_a --language=zh_CN \
     --disable-armv5te --disable-armv6 \
     --with-extraincdir=/usr/local/arm/3.4.1/lib/include \
     --with-extralibdir=/usr/local/arm/3.4.1/lib/lib


         参数解释:
         --cc
         交叉编译工具,如果没添加到环境变量,就要指定完整路径


         --target
         在pre版本中,对于--target和这个配置参数是这样描述的:
===============================================
--target=arm- armv4l-linux这个参数要注意的是一个分三部分,第一部分的arm是指arch,这里设定为arm;第二部分的armv4l是指具体的版本,这个要注意了,一定要跟libavcodec目录下的平台目录名一致,否则为这个平台的优化代码没办法编译进去(据我观察是这样的);第三部分是系统平台。
===============================================
         但是在rc2版本中,只需要--target=arm-linux这样指定就好了。


         --enable-static
         是设定静态连接,不需要一堆乱七八糟的动态库,尤其对我们这些新手来说省了很多的麻烦。如果设置了这个参数就不用设置--prefix了,另外也不用执行make install。


         --prefix=/tmp/mplayer-rc2
         make install后,可执行程序就安装在/tmp/mplayer-rc2目录下。


         --disable-win32dll
         禁用win32动态链接库支持。在pre版本中该参数为


        --disable-dvdread
        禁用libdvdread.


        --enable-fbdev
       支持fbdev,这个一定要选上。


        --disable-mp3lib 和 --enable-mad
        arm系列的cpu,一般都没浮点运算单元,而mplayer的mp3解码默认使用mp3lib,这个是浮点运算库,在arm上肯定跑不了,使用 ffmp3或者libmad(需要外部库libmad支持)应该就没问题了。所以这里需要禁止掉mencoder和使能libmad。


        --disable-mencoder
        禁止编码功能。项目上不需要此功能,禁掉以缩小尺寸。而且听说在这里编译mencoder会有问题,听说而已,没试过。


        --disable-live
        禁止live 555流媒体。(不知道干啥用)


        --enable-libavcodec_a


        启用静态的libavcodec解码。在pre版本中该参数为--enable-libavcodec。


        --disable-armv5te --disable-armv6
        禁用armv5te、armv6指令扩展。


        --with-extraincdir和-with-extralibdir
        指定libmad和mad.h的路径。mad的路径被添加到编译参数-I和-L后面,替换libmad后需要指定。


        注:在pre版本中需要指定--host-cc=gcc配置参数。用来编译一些需要在host上执行的中间文件的,如codec-cfg,切记不能缺少。但在rc2版本中该参数可以省略掉。


        2。make
       ./configure 之后就开始make了。
       编译过程应该是很顺利的。宿主环境是Fedora 8,GCC版本为4.1.2。在FC8上编译pre版本会通不过gcc编译器检测,pre版本不支持4.x以上的版本。或许可以加上--disable- gcc-check禁用gcc版本检测,不过我没有试过,有闲的可以试一试。
       另外在redhat9宿主环境下也编译过rc2版本。不过make的时候好像弹出了个dvdcss的什么错误,在配置选项中--disable-libdvdcss-internal禁掉dvdcss就好了。
       因为需要mad库播放音频,所以还需要交叉编译libmad。
       libmad的版本为 libmad-0.15.1b.tar.bz2
       libmad也是configure make之类的步骤。configure的配置参数为:
       ./configure --enable-fpm=arm --host=arm-linux --disable-shared \
                        --disable-debugging --prefix=/usr/local/arm/3.4.1/lib \
                        CC=arm-linux-gcc
        
       之后make,就很顺利的编译出libmad了。注意--prefix配置选项表示libmad库和头文件在哪个目录生成,比如本例中make install后在/usr/local/arm/3.4.1/lib目录下就多了include和lib两个目录。这与mplayer的配置选项 --with-extraincdir指定的目录是相符的。


       编译完成后就生成了mplayer,最开始下载到板子上运行的时候却崩溃了,打出错误信息:
       "MPlayer interrupted by signal 4 in module: decode_video"
       google 了一下,发现是用了不支持的armv5、armv6的优化指令,s3c2440是armv4,运行到不认识的armv5、armv6的指令就崩溃了。加上禁用armv5、armv6的指令扩展配置选项--disable-armv5te --disable-armv6,再重新来一次,下载运行mplayer,就OK了。其实这些高版本的指令扩展应当是自动检测的,不知道为什么没有生效。需要手动的禁止掉。


 


       3。运行mplayer
       手上板子的LCD屏很怪,是240×320的,而不是常见的320×240。这样,用命令播放:


       mplayer test.avi


       开始播放avi的时候画面就被截短了,并打印出错信息:
     “Could not find matching colorspace - restrying with -vf scale...”。


       于是加上参数:


       mplayer test.avi -framedrop -quiet -vf rotate -flip -x 240 -y 320 


       画面是对了,但是速度非常慢,就像我们平时用“1/2倍速”来播放影片一样。CPU占有率90%以上。


       再瞎试,看到一组参数,试一下:


       mplayer test.avi -framedrop -quiet -vf rotate=1,scale=240:320 -ac mad 


       播放就比较流畅了。但是CPU占有率还是90%以上。test.avi是Xvid格式的MP4,505kbps。


       如果视频源文件的分辨率比240×320大,最好用工具转换一下,否则播放的速度会非常慢。