分类: 嵌入式
2013-03-29 16:59:58
原文地址:mplayer移植 作者:szufhc2006
主机系统:ubuntu 9.10 amd64 (gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9))
目标平台:mini2440 (S3C2440 ARM920T)
交叉编译器:arm-linux-gcc-4.3.2 (arm-none-linux-gnueabi)
软件准备:MPlayer-1.0rc2.tar.bz2 软件包到~/download目录
本次移植的目标系统环境使用的是友善之臂官网上提供的arm-linux-gcc-4.3.2交叉编译器以及使用该编译器编译的linux-2.6.32.2内核及其相应的glibc库。
1、解压
cd ~/download
tar xf MPlayer-1.0rc2.tar.bz2 -C /tmp
2、配置
cd /tmp/MPlayer-1.0rc2 ./configure --disable-mencoder \ --enable-linux-devfs \ --disable-iconv \ --enable-network \ --disable-live \ --disable-dvdnav \ --disable-dvdread \ --disable-dvdread-internal \ --disable-libdvdcss-internal \ --enable-ftp \ --enable-libavcodec_a \ --enable-libavcodec_mpegaudio_hp \ --enable-mad \ --disable-mp3lib \ --enable-fbdev \ --enable-ossaudio \ --enable-cross-compile \ --cc=arm-linux-gcc \ --host-cc=gcc \ --target=arm-linux \ --enable-static \ --with-extraincdir=/opt/toolchains/arm920t-eabi/lib/include \ --with-extralibdir=/opt/toolchains/arm920t-eabi/lib/lib 2>&1 |tee logfile
红色部分的参数都是比较重要的,一般都需要指定(--disable-mencoder参数指定不编译mencoder以节省编译时间,因为不需要也不应该在ARM平台上使用mencoder来编辑视频)。其中--enable-mad是为了改善mplayer在ARM处理器上的音频播放性能。因为S3C2440还不支持硬浮点运算,而mp3lib库是使用浮点运算的,所以使用mp3lib库来播放mp3文件则相当占用CPU资源。因此,考虑使用libmad库来播放mp3等格式音频文件。由于libmad库并不包含在mplayer源码中,所以得事先另外安装,然后在编译mplayer时启用libmad库,即”--enable-mad”,并指定libmad库头文件以及编译完成的库文件所在的目录,即”--with-extraincdir”、”--extralibdir”参数指定的路径。其他参数可以通过 ./configure -h 来查看详细说明。由于这里指定了静态编译方式”--enable-static”,故没有另外指定”--prefix”安装路径前缀(当然你也可以指定为/tmp/mplayer,即”--prefix=/tmp/mplayer”),也不需要执行 make install 命令安装,编译完成后手动拷贝mplayer可执行文件到目标系统的/usr/bin目录则可。
ps:其实在执行 make install 命令时会有一个错误提示,但这个不碍事。
install -m 755 -s mplayer /tmp/mplayer/bin strip: Unable to recognise the format of the input file `/tmp/mplayer/bin/mplayer' install: strip process terminated abnormally make: *** [install-mplayer] 错误 1
3、编译
执行
make
命令编译。
下面参考http://hi.baidu.com/linuxcfan/blog/item/d448a758f2906e232934f04f.html
执行过程中会出现类似如下错误提示:
armv4l/dsputil_arm_s.S:79:error:selected processor does not support 'pld [r1]'
......
原因分析:armv5以下的版本不支持pld指令(mini2440的arm9属于armv4)
解决方法一:替换MPlayer-1.0rc2/libmpeg2/motion_comp_arm_s.S文件和MPlayer-1.0rc2/libavcodec/armv4l/dsputil_arm_s.S文件中的pld [r1]为空即可!
ps:为什么要修改两个文件呢?因为只修改错误提示中的那个文件后继续编译则会继续提示MPlayer-1.0rc2/libmpeg2/motion_comp_arm_s.S文件中同样的错误^_^
修改方法:使用vim分别打开dsputil_arm_s.S、motion_comp_arm_s.S这两个汇编源文件,执行
:%s/pld \[r1\]//
命令完成替换。
解决方法二:分别编辑dsputil_arm_s.S、motion_comp_arm_s.S这两个汇编源文件,在前面添加
#ifndef HAVE_PLD
.macro pld reg
.endm
#endif
详细可以参考:http://hi.baidu.com/serial_story/blog/item/ce608601a32c540b728da5cc.html
ps:这个问题确实与使用的交叉编译工具链相关,因为我之前使用arm920t-eabi交叉编译器编译时并没有出现这个错误。
4、编译libmad库
前面提到了使用libmad库来替代mp3lib库来改善mplayer在ARM处理器上播放音频的性能,那么在编译mplayer之前得编译好libmad库。
下载 libmad 包(libmad-0.15.1b.tar.gz)
将其解压后,进入 libmad 的目录,输入配置命令:
./configure --enable-fpm=arm \
--host=arm-linux \
--disable-shared \ (这个选项就是说明要静态编译)
--disable-debugging \
--prefix=/opt/toolchains/arm920t-eabi/lib
--cc=arm-linux-gcc
对于 --cc=arm-linux-gcc 选项要保证 arm-linux-gcc 的路径已经有 export 过,否则给出完整路径。
ps:其实意思就是事先已经搭建好交叉编译环境。
#make
#make install
这样就可以看到在 /opt/toolchains/arm920t-eabi/lib 目录下多了 include 和 lib 目录,这些就是 libmad 的库文件及其头文件。
ps:其实可以指定路径为/opt/toolchains/arm920t-eabi,这样如果使用的是arm920t-eabi交叉编译器,那么在编译mplayer时应该不需要再额外指定libmad库相关文件的所在路径了。
5、测试
在播放音频或视频文件时会出现没有声音输出的问题,终端提示
[AO OSS] audio_setup: Can't open audio device /dev/sound/dsp: No such file or dy
然而目标系统上有 /dev/dsp 音频设备文件,只是OSS音频驱动需要的是 /dev/sound/dsp 设备文件,这问题的简单解决方法是建一个符号链接。
mkdir -p /dev/sound
ln -s /dev/dsp /dev/sound/
这样问题就搞定了。可以把这两条命令添加到目标系统的启动文件的适当位置,修改目标系统的 /etc/init.d/rcS 文件。
后记:我编译的libmad库的安装路径为 /opt/toolchains/arm920t-eabi/lib,这是由于之前使用arm-linux-gcc-4.3.2交叉编译qte-4.5.3时出现了问题而改用arm920t-eabi交叉编译工具链造成的。原以为使用arm920t-eabi交叉编译器编译mplayer也能正常移植,不过事实证明是不行的(能够编译成功,只是移植过去程序执行出错),因为目标系统内核以及glibc库都是使用arm-linux-gcc-4.3.2编译的,而mplayer是用arm920t-eabi编译的,因此可能是不同版本的编译器之间的不兼容而造成了奇奇怪怪的郁闷的问题>_<。
尝试过移植mplayer的最新版本,移植过去能正常播放音频,只是播放视频时一闪即逝(有时却又像程序死循环一样),出错信息也看不懂,晕。