移植Mplayer

                                                                                     移植 Mplayer

 

1 移植 ALSA

        ALSAAdvanced Linux Sound Architecture ,高级Linux 声音架构的简称, 它在Linux 操作系统上提供了音频和MIDIMusical Instrument Digital Interface ,音乐设备数字化接口)的支持。在2.6 系列内核中,ALSA 已经成为默认的声音子系统,用来替换2.4 系列内核中的OSSOpen Sound System ,开放声音系统)。

1.1 获取源码

         从网站 http://www.alsa-project.org/main/index.php/Download 下载alsa-lib-1.0.23.tar.bz2 源码,拷贝到/opt/transplants 目录下

1.2 修改并配置源码

         解压源码包

       # cd /opt/transplants

       # tar jxvf alsa-lib-1.0.23.tar.bz2

         解压后生成目录alsa-lib-1.0.23

         进入目录后进行配置

       # ./configure --host=arm-none-linux-gnueabi --target=arm-linux --prefix=/alsa-lib --enable-shared --disable-python --with-configdir=/alsa --with-plugindir=/usr/lib/alsa-lib

--host 配置交叉编译工具链;--prefix 配置编译生成库的存放目录。--with-configdir 配置库在开发板文件系统中的存放目录

1.3 编译并安装源码

         编译安装

       #make

       #make install

         成功后在系统根目录下生成/alsa-lib 目录;在/usr/share/ 目录下生成alsa 目录。

         将/alsa-lib 目录下所有文件拷贝到/opt/Tools/arm-2009q1/arm-none-linux-gnueabi/libc/usr 目录下,为编译mplayer 做准备。

       # cp /alsa-lib/** /opt/Tools/arm-2009q1/arm-none-linux-gnueabi/libc/usr -raf

         将/alsa-lib 目录下所有文件拷贝到开发板文件系统/usr 目录下

         将/usr/share/alsa 目录拷贝到开发板文件系统/usr/share 目录下

         在开发板文件系统/etc/profile 添加如下内容

mkdir /dev/snd

ln -s /dev/pcmC0D0c /dev/snd/pcmC0D0c

ln -s /dev/pcmC0D0p /dev/snd/pcmC0D0p

ln -s /dev/controlC0 /dev/snd/controlC0

ln -s /dev/pcmC1D0c /dev/snd/pcmC1D0c

ln -s /dev/pcmC1D0p /dev/snd/pcmC1D0p

ln -s /dev/controlC1 /dev/snd/controlC1

ln -s /dev/seq /dev/snd/seq

ln -s /dev/timer /dev/snd/timer

ALSA 库移植完毕。

NOTE 开发板文件系统没有的目录请用户根据需要自行创建。


2 移植 LIBMAD

去网站 http://sourceforge.net/projects/mad/files/ 下载libmad-0.12.1b.tar.gz 源码,拷贝到/opt/transplants 目录下。

2.1 修改并配置源码

         解压源码包

      # cd /opt/transplants

      # tar xzvf libmad-0.12.1b.tar.bz2

        解压后生成目录libmad-0.12.1b

        进入目录后进行配置

      # ./configure --enable-fpm=arm --host=arm-linux --disable-shared --disable-debugging --prefix =/opt/libmad CC="arm-linux-gcc"

--host 配置交叉编译工具链;--prefix 配置编译生成库的存放目录。 disable-shared这个选项就是说明要静态编译

CC=arm-linux-gcc(要保证 arm-linux-gcc的路径已经有 export过,否则给出完整路径。)

2.2 编译并安装源码

         编译安装

       #make

       #make install

        NOTE 编译过程遇到与”-fforce-mem” 相关的错误,打开Makefile 找到CFLAGS 变量,将它的-fforce-mem 选项去掉即可。

成功后生成/opt/libmad 目录。

         将/opt/libmad 目录下所有文件拷贝到/opt/Tools/arm-2009q1/arm-none-linux-gnueabi/libc/usr 目录下,为编译mplayer 做准备。

       # cp /opt/libmad/** /opt/Tools/arm-2009q1/arm-none-linux-gnueabi/libc/usr -raf

          将/opt/libmad 目录下所有文件拷贝到开发板文件系统/usr 目录下。

NOTE 开发板文件系统没有的目录请用户根据需要自行创建。


3 移植 Mplayer

首先到网上 http://www.mplayerhq.hu/design7/dload.html
下载
MPlayer-1.0rc1.tar.bz2,解压后生成 MPlayer-1.0rc1。 拷贝到/opt/transplants 目录下。

3.1 进入目录后进行配置

     #./configure --host-cc=gcc --cc=arm-none-linux-gnueabi-gcc --target=arm-armv4-linux --prefix=/tmp/mplayer --disable-win32dll --disable-dvdread --enable-fbdev --disable-mencoder --enable-mad



在make 的时候会出现如下错误: storage size of sd  isn't known

解决方法:在configure 参数选项加上--disable-ivtv

 

期间会提示以下错误:

ioctl.c:273:5: #error "DVD ioctls are unavailable on this system"

ioctl.c:446:5: #error "DVD ioctls are unavailable on this system"

ioctl.c:610:5: #error "DVD ioctls are unavailable on this system"

ioctl.c:734:5: #error "DVD ioctls are unavailable on this system"

ioctl.c:868:5: #error "DVD ioctls are unavailable on this system"

ioctl.c:1001:5: #error "DVD ioctls are unavailable on this system"

ioctl.c:1130:5: #error "DVD ioctls are unavailable on this system"

ioctl.c:1241:5: #error "DVD ioctls are unavailable on this system"

ioctl.c:1378:5: #error "DVD ioctls are unavailable on this system"

ioctl.c:1515:5: #error "DVD ioctls are unavailable on this system"

ioctl.c:1670:5: #error "DVD ioctls are unavailable on this system"

ioctl.c:1797:5: #error "DVD ioctls are unavailable on this system"

ioctl.c 中注释这些语句即可编译通过

3.2 编译并安装源码

         编译安装

         # make

         成功后本目录下mplayer 可执行文件。

         将mplayer 文件拷贝到开发板文件系统/opt 目录下。

NOTE 开发板文件系统没有的目录请用户根据需要自行创建。

3.3 测试验证

上述操作结束,接下来就是测试了,我有两个开发板,一个是友善的tiny6410 和MagicARM2410 (学校的板子) ,我先测试tiny6410(内核是2.6的)拷贝几个avi格式的文件,放在开发板文件系统/opt目录下。

         启动板卡进入系统。

         Target# cd /opt

         Target# ./mplayer tm.avi

画面而且有声音。

 

然后我在 MagicARM2410 上测试,结果打印出几行信息后就停止不动了,一开始我想是平台的原因无法播放,于是我参照另一篇 2410 的移植文档重新编译 mplayer ( 编译用的 arm-linux-gcc 版本是 3.4.1)


1. libmad 库,下载 libmad-0.15.1b.tar.bz2 ,解压,配置:

./configure --enable-fpm=arm --host=arm-linux --disable-shared --disable-debugging –prefix=/usr/local/arm/3.4.1/lib CC=arm-linux-gcc

其中 --prefix=/usr/local/arm/3.4.1/lib 指明 libmad 库和头文件在哪个目录生成。

然后 make ,完成后 make install ,之后再 /usr/local/arm/3.3.2/lib 中就会出现 lib include 两个文件夹

2. 接着开始安装 Mplayer-1.0rc2 ,下载 MPlayer-1.0rc2.tar.bz2 ,解压,配置:

./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 版本中该参数可以省略掉。

./configure 之后就开始 make 了。

我们编译时遇到一个错误,是关于 codecs-cfg builtin 什么的错误,解决方法是修改 Makefile ,将 $(HOST_CC) 改为 gcc 命令所在的绝对路径,比如在 fc8 里面就是 /usr/bin/gcc


 

编译好以后生成 mplayer 的可执行文件,拷到 U 盘里。在 2410 板子上运行时基本上什么格式的文件都不行正常播放,于是我试着把声音关掉,竟然可以播放了,但是很卡,所以应该是 音频的驱动的问题,参照网上的说法:

现在大部分的嵌入式板子都使用菲利普 uda1341 音频芯片,因而也都使用了相同一个音频驱动,即 MIZI 公司拥有版权的 linux   uda1341 音频驱动,这个驱动基本上符合了 oss 的规范,但是当使用到多段 DMA 音频数据传输时,出现了一个问题,即 DMA 缓冲的建立发生在第一次调用 write ()函数将音频数据传送到设备描述符的时候,然而 oss 驱动的调用者通常要在打开音频设备描述时候,就期望获取 DMA 缓冲的信息,然而因为缓冲尚未建立,因而返回缓冲大小为 0 这个结果

要修改音频驱动源码的 smdk2410_audio_open ()函数。可是我的 linux 内核是 2.4 版本的,修改了这个函数依然没用,没办法只能移植内核 2.6 了。

接着下篇:我的 linux2.6 内核移植过程

 

你可能感兴趣的:(linux,测试,gcc,平台,makefile,linux内核)