puppy居
puppy居士
posts - 41,comments - 27,trackbacks - 0

        一个项目要求上音频、视频播放。项目环境为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 阅读(4487) 评论(12)  编辑 收藏 引用 所属分类: LINUX

FeedBack:
# re: mplayer在s3c2440上的编译移植
2008-09-20 13:25 | takeda13
謝謝分享 我最近也作了一樣的事在armv5te上 請問一下
當您放完影片後, 畫面是否會關掉呢
另外分享一下, 可試試-ac mad參數  回复  更多评论
  
# re: mplayer在s3c2440上的编译移植[未登录]
2008-09-23 21:09 | puppy
加上 -idle 就可以不关掉了 不加的话放完了就会自动关掉。
-ac mad参数是放mp3的时候用的啊 好像没什么问题啊  回复  更多评论
  
# re: mplayer在s3c2440上的编译移植
2008-10-10 16:59 | zhangjie
楼主,我最近也在弄mplayer,用的平台、编译器和mplayer的版本都和你一样。但是我的mplayer没办法放出声音,但是madplay可以。我怀疑是不是我的声卡驱动写的有点问题。能把你的声卡驱动分享一下吗?谢谢!zhj8407@gmail.com  回复  更多评论
  
# re: mplayer在s3c2440上的编译移植
2008-10-10 19:31 | puppy
@zhangjie
声卡部分用的是UDA1341
驱动已经贴出来了 内核版本linux-2.6.26
2.6.26中semaphore结构体做了改动,所以我修改的驱动不一定适合你.你可以参考luofuchong大侠的2.6.22版本的驱动http://www.linuxforum.net/forum/showflat.php?Cat=&Board=embedded&Number=674018&page=0&view=collapsed&sb=5&o=0&fpart=&vc=1&PHPSESSID

我就是用他的驱动加上修改了semaphore相关部分就可以了.
如果你用的是mplayer,还应该做如下修改:

加上如下一段代码,

if ((file->f_mode & FMODE_WRITE)){

init_s3c2410_iis_bus_tx();

audio_clear_buf(&output_stream);

// 加上以下这行代码

if (!output_stream .buffers && audio_setup_buf(&output_stream))

return -ENOMEM;

按以上的方法做了,但是还是出现同样的提示,仔细的看了驱动,在驱动上加了大量的调试信息最后发现在smdk2410_audio_ioctl 中调用的一个函数老是返回错误,这个函数是access_ok(VERIFY_WRITE, inf, sizeof(*inf)),查了这个函数的代码发现返回1的时候是表示可以访问,而不是错误,所以导致下面代码老是出错,其实运行都是对的:

int err = access_ok(VERIFY_WRITE, inf, sizeof(*inf));

if (err)

return err;

于是改成int err = !access_ok(VERIFY_WRITE, inf, sizeof(*inf));


  回复  更多评论
  
# re: mplayer在s3c2440上的编译移植
2008-11-14 11:04 | zljjb
您好,
请问是先编译libmad,再对mplayer进行./configure和make吗?
我先编译的libmad,之后在/usr/local/arm/3.3.2/lib目录下没有找到include和lib两个目录。(我用的交叉编译器是3.3.2的)
请问这是怎么回事?  回复  更多评论
  
# re: mplayer在s3c2440上的编译移植[未登录]
2008-11-14 11:11 | puppy
@zljjb
自己创建嘛 然后把 libmad.a mad.h分别放进去  回复  更多评论
  
# re: mplayer在s3c2440上的编译移植
2008-11-17 10:51 | zljjb
libmad 的问题已经解决。
./mplayer -ac mad file.mp3后还是没有声音出来
提示的错误是:
[AO OSS]audio_setup:Can't open device /dev/sound/dsp :No such file or directory
这是怎么回事?是不是音频驱动之类的有问题?我查看音频输出# ./mplayer -ao help后的提示是:
MPlayer 1.0rc1-3.3.2 (C) 2000-2006 MPlayer Team
CPU: ARM
Available audio output drivers:
oss OSS/ioctl audio output
mpegpes Mpeg-PES audio output
null Null audio output
pcm RAW PCM/WAVE file writer audio output
请问这是出什么问题了,所有的音频文件都没有声音,视频也是只有图像。
  回复  更多评论
  
# re: mplayer在s3c2440上的编译移植
2008-11-18 11:18 | zljjb
还有一个问题是:在RedHat9下面编译的话,会出现你提到的libdvdcss错误,可是我--disable-libdvdcss-internal之后,还是有问题:dvdread/dvdread.a出现错误,我在./configure中也禁掉了dvdread啊?怎么回事呢?用的mplayer版本交叉编译器都和你上面提到的一样啊~  回复  更多评论
  
# re: mplayer在s3c2440上的编译移植[未登录]
2008-11-18 15:11 | puppy
@zljjb
那你把dvd相关的配置选项禁干净掉试试,我是在fedora 8下面编译的。
这种东西就是这样的,不是咱们弄的,咱们只能点点的去试。然后平台啊,版本什么的差异很大,即使完全一样都会产生不同的结果,所以只能慢慢的去试,基本上就是个体力活。
还有你上面那个问题,你可以先这样试试: cat test.mp3 > /dev/sound/dsp 这样都不行就是音频驱动没弄好。  回复  更多评论
  
# re: mplayer在s3c2440上的编译移植
2008-11-21 15:33 | zljjb
换成fedora8下OK了,声音问题也解决了,谢谢楼主~  回复  更多评论
  
# mplayer在ARM7的编译移植
2008-11-27 19:12 | 胡耀光
楼主,你好!
我在MAKE的时候出现如下错误,请问怎么回事?
[root@localhost MPlayer-1.0rc2]# make
/home/tool/usr/local/arm/3.4.1/bin/arm-linux-gcc -I./libavcodec -I./libavformat -I. -I. -I./libavutil -Wall -Wno-switch -Wpointer-arith -Wredundant-decls -O4 -pipe -ffast-math -fomit-frame-pointer -D_REENTRANT -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -DHAVE_CONFIG_H -c -o codec-cfg.o codec-cfg.c
codec-cfg.c: In function `parse_codec_cfg':
codec-cfg.c:507: error: `builtin_video_codecs' undeclared (first use in this function)
codec-cfg.c:507: error: (Each undeclared identifier is reported only once
codec-cfg.c:507: error: for each function it appears in.)
codec-cfg.c:508: error: `builtin_audio_codecs' undeclared (first use in this function)
make: *** [codec-cfg.o] 错误 1
  回复  更多评论
  
# re: mplayer在s3c2440上的编译移植
2008-12-05 16:32 | hurong
楼主,加入xvid了吗?
写下心得吧。

我编译后,运行总是不对。  回复  更多评论
  
只有注册用户登录后才能发表评论。