一个项目要求上音频、视频播放。项目环境为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
播放就比较流畅了。但是CPU占有率还是90%以上。test.avi是Xvid格式的MP4,505kbps。
如果视频源文件的分辨率比240×320大,最好用工具转换一下,否则播放的速度会非常慢。
posted on 2008-09-09 11:55
puppy 阅读(4885)
评论(12) 编辑 收藏 引用 所属分类:
LINUX