网站导航: 首页 > 设计参考 > 正文 文章搜索
s3c2410移植MPlayer到linux2.6
 
文章编号:
100719154259
文章分类: 单片机 ARM
点 击:
...
关 键 词: s3c2410,MPlayer,linux2.6
文章来源:
互联网
摘 要:
我使用的linux内核为2.6.14.1 MPlayer版本为MPlayer-1.0pre7try2.bz2 目前虽然已经添加了mad的mp3库,但播放声音文件回导致mplayer错误,放视频还得禁掉声音,怪了,madplay放mp3就很好,下面介绍下整个移植过程

我使用的linux内核为2.6.14.1 MPlayer版本为MPlayer-1.0pre7try2.bz2
目前虽然已经添加了mad的mp3库,但播放声音文件回导致mplayer错误,放视频还得禁掉声音,怪了,madplay放mp3就很好
下面介绍下整个移植过程,也是参考了网上很多文章综合而来的
=================================================================
1)编译器最好选择3.3.2 ,我使用3.4.1会出现snow.c编译错误,找不到解决办法
解压3.3.2到/usr/local/arm/下
并export PATH=/usr/local/arm/3.3.2/bin:$PATH
echo $PATH看看3.3.2是不是在第一个?

2)播放mp3需要禁掉mp3lib 而使用madlib ,据说如果使用mp3lib会占用2000%的CPU,可能嘛?
安装libmad
(1).交叉编译libmad
下载libmad包(libmad-0.15.1b.tar.gz);
打开一个终端,进入libmad的目录,输入配置命令:
./configure --enable-fpm=arm --host=arm-linux --disable-shared --disable-debugging --prefix=/usr/local/arm/3.3.2/lib
CC=arm-linux-gcc(要保证arm-linux-gcc的路径已经有 export过,否则给出完整路径。)
make
make install
这样就可以看到 /usr/local/arm/3.3.2/lib 目录下多了include和lib目录,这些就是libmad相关的库。
(2).在 configure mplayer的时候,要加上以下几个选项:
--enable-mad
--with-extraincdir=/usr/local/arm/3.3.2/lib/include(这个指明 mad.h 这个文件所在的路径)
--with-extralibdir=/usr/local/arm/3.3.2/lib/lib(这个指明libmad相关链接库所在的路径)
通过以上两个步骤,就可以把libmad交叉编译到 mplayer中。

3)解压MPlayer-1.0pre7try2.bz2,改名为mplayer ,方便而已
在此目录下配置
./configure   --cc=arm-linux-gcc   --target=arm-armv4-linux   --enable-static   --disable-win32     --disable-dvdread   --enable-fbdev   --disable-mencoder   --disable-live   --disable-mp3lib   --enable-mad   --enable-libavcodec   --with-extraincdir=/usr/local/arm/3.3.2/arm-linux/sys-include/:/usr/local/arm/3.3.2/lib/include --with-extralibdir=/usr/local/arm/3.3.2/arm-linux/lib:/usr/local/arm/3.3.2/lib/lib --prefix=/tmp/mplayer --host-cc=gcc

4)make
当然会有错误

排错

错误(1)
./codec-cfg ./etc/codecs.conf > codecs.conf.h
./codec-cfg: 1: Syntax error: word unexpected (expecting ")")

网上有两种解决方法
A 说在configure时添加 --host-cc=gcc就可以解决
可是会出现其他库找不到的错误
猜想是指定了库--with-extralibdir导致的,所以还得采用笨笨的B方案

B 引用原话
“ 先把mplayer编译成x86的代码,于是重新配置,简单的   ./configure,   make,然后将生成的codec-cfg改名为codec-cfg.x86。
然后再按跨平台方式配置,编译,等编译器出现错误停止编译时,将codec-cfg.x86该名为codec-cfg,再make,OK,编译就可以继续进行了。”
的确可行

错误(2)vobsub.c错误
这个错误可能在B方案时就会出现,
解决方法:修改vobsub.c 230行将getline函数名称改为mygetline

5)make完毕后拷贝目录下的mplayer文件到arm9linux文件系统运行就好了,我是拷贝在u盘里面运行的
>/mnt # mplayer
>MPlayer 1.0pre7try2-3.3.2 (C) 2000-2005 MPlayer Team
>CPU: ARM
>Usage:   mplayer [options] [url|path/]filename

6)播放mp3的问题
A不带参数运行,如下
/mnt # mplayer 1.mp3
MPlayer 1.0pre7try2-3.3.2 (C) 2000-2005 MPlayer Team
CPU: ARM
Failed to open /dev/rtc: No such file or directory (it should be readable by the user.)
Playing 1.mp3.
Audio file detected.
Clip info:
Title: 高达一年战争秘闻录
Artist: Taja
Album:
Year:
Comment:
Genre: Other
==========================================================================
Requested audio codec family [mp3] (afm=mp3lib) not available.
Enable it at compilation.
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 16000->176400)
Selected audio codec: [ffmp3] afm:ffmpeg (FFmpeg MPEG layer-3 audio decoder)
==========================================================================
Checking audio filter chain for 44100Hz/2ch/s16le -> 44100Hz/2ch/s16le...
AF_pre: 44100Hz/2ch/s16le
[AO OSS] audio_setup: Can't open audio device /dev/dsp: No such file or directory
AO: [null] 44100Hz 2ch s16le (2 bps)
Building audio filter chain for 44100Hz/2ch/s16le -> 44100Hz/2ch/s16le...
Video: no video
Starting playback...
[Mixer] No hardware mixing, inserting volume filter.                           
A:   0.3 (00.2) 47.4%                                                          
A:   0.8 (00.8) 55.9%                                                          
A:   1.2 (01.1) 57.2%                                                          
No bind found for key l

打不开,因为没有安装mp3lib库

B加参数mad
/mnt # mplayer -ac mad 1.mp3
MPlayer 1.0pre7try2-3.3.2 (C) 2000-2005 MPlayer Team
CPU: ARM
Failed to open /dev/rtc: No such file or directory (it should be readable by the user.)
Playing 1.mp3.
Audio file detected.
Clip info:
Title: 高达一年战争秘闻录
Artist: Taja
Album:
Year:
Comment:
Genre: Other
==========================================================================
Forced audio codec: mad
Opening audio decoder: [libmad] libmad mpeg audio decoder
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 16000->176400)
Selected audio codec: [mad] afm:libmad (libMAD MPEG layer 1-2-3)
==========================================================================
Checking audio filter chain for 44100Hz/2ch/s16le -> 44100Hz/2ch/s16le...
AF_pre: 44100Hz/2ch/s16le
[AO OSS] audio_setup: Can't open audio device /dev/dsp: No such file or directory
AO: [null] 44100Hz 2ch s16le (2 bps)
Building audio filter chain for 44100Hz/2ch/s16le -> 44100Hz/2ch/s16le...
Video: no video
Starting playback...
A:   3.9 (03.8) 46.9%

看似在播放了,但是完全没有声音
仔细看输出,有个错误[AO OSS] audio_setup: Can't open audio device /dev/dsp: No such file or directory

奇怪,我记得dsp应该在sound下啊
既然它要找/dev/dsp,我做个链接好了
前天刚学过ln命令,现学现卖
ln -s /dev/sound/dsp /dev/dsp

再运行看看
/mnt # mplayer -ac mad 1.mp3
MPlayer 1.0pre7try2-3.3.2 (C) 2000-2005 MPlayer Team
CPU: ARM
Failed to open /dev/rtc: No such file or directory (it should be readable by the user.)
Playing 1.mp3.
Audio file detected.
Clip info:
Title: 高达一年战争秘闻录
Artist: Taja
Album:
Year:
Comment:
Genre: Other
==========================================================================
Forced audio codec: mad
Opening audio decoder: [libmad] libmad mpeg audio decoder
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (rs3c2410-uda1341-superlp: audio_set_dsp_speed:44100 prescaler:66
atio: 16000->176s3c2410-uda1341-superlp: audio_set_dsp_speed:44100 prescaler:66
400)
Selected audio codec: [mad] afm:libmad (libMAD MPEG layer 1-2-3)
==========================================================================
Checking audio filter chain for 44100Hz/2ch/s16le -> 44100Hz/2ch/s16le...
AF_pre: 44100Hz/2ch/s16le
AO: [oss] 44100Hz 2ch s16le (2 bps)
Building audio filter chain for 44100Hz/2ch/s16le -> 44100Hz/2ch/s16le...
Video: no video
Starting playback...

MPlayer interrupted by signal 8 in module: play_audio
- MPlayer crashed by bad usage of CPU/FPU/RAM.
Recompile MPlayer with --enable-debug and make a 'gdb' backtrace and
disassembly. Details in DOCS/HTML/en/bugreports_what.html#bugreports_crash.
- MPlayer crashed. This shouldn't happen.
It can be a bug in the MPlayer code _or_ in your drivers _or_ in your
gcc version. If you think it's MPlayer's fault, please read
DOCS/HTML/en/bugreports.html and follow the instructions there. We can't and
won't help unless you provide this information when reporting a possible bug.

还是有错误,但AO的错误解决了,我目前仅做到这一步,尚未解决声音问题

6)播放视频
我尝试了avi mpg vcd的dat文件,都可以播放,速度有点满,还得禁掉sound,2410也就这样吧,放视频还得DSP

mplayer 13.mpg -nosound -fs
fs是中央显示

还有个错误
Failed to open /dev/rtc: No such file or directory (it should be readable by the user.)
RTC的错误?我找不到这个设备
暂时就这么多吧,声音问题继续研究中。。。。。。。。。。。。。。。。
最后转一段解决声音问题的方法,我按照如上做了,可惜还是没解决

2.开始调试   
        编译出来的代码能正常的在FS2410上跑吗?心中还是有许多疑问。给板子上电,然后用自己编写的一个网络传输工具将代码传到板子的ramdisk,接着 再传上一个10M左右的视频,好了,先不带参数运行mplayer,不错,中文的帮助信息弹出来了,说明程序基本编译对了,这时输入命令   ./mplayer     matrix.mpg   ,   眼睛直盯着屏幕,期待着画面的出现,可惜,在出现了一些视频剪辑的反馈信息后,程序再也不动了,没办法,按CTRL+C结束程序,然后就提示出现段错误。 以前听说有linux嵌入式的爱好者移植时也出现这样的错误,但是如果不播放声音时,图像可以出现,于是输入命令   ./mplayer     -nosound     matrix.mpg,这时画面出来了,这个320x240大小的从网上下载的视频,播放起来相当流畅,好像比平时看的影碟机解码速度还快,那当然了,毕 竟是320x240大小,又没声音解码的。  
   
声音这块不解决,当然是不能说移植成功的,因为mplayer还支持那么多格式的音频解码。但是问题究竟出在哪里呢?用排除法吧!找一个未经任何音频压缩 的WAV音频文件,其时就是PCM文件,上传到ramdisk,然后用mplayer播放,还是出现一样的问题,程序死了。好了,这就说明问题并非出现在 音频解码部分,极有可能出现在音频流的播放部分。现在市面上大多数的嵌入式开发板的音频驱动是oss规范的驱动,以前自己做过oss的编程,对这块还是比 较熟悉。于是开始查看mpalyer,c源文件,看看它是如何实现音频流播放的,  
   
在音频播放部分它使用到了libao2库的音频播放/控制模块,通过进一步查看ao_oss.c源代码进一步获知mplayer是如何与音频的linux 驱动工作的。这一步弄清楚后,重新编译mplayer,打开debug选项,打开调试字符串输出,并在音频播放处设置多处断点,并加上printf语句输 出一些变量内容,最终发现在调用ao_oss.c的play()函数时出现除零出错,  
   
这个问题产生的根源最终追溯到音频的驱动部分。现在大部分的嵌入式板子都使用菲利普uda1341音频芯片,因而也都使用了相同一个音频驱动,即MIZI 公司拥有版权的linux   uda1341音频驱动,这个驱动基本上符合了oss的规范,但是当使用到多段DMA音频数据传输时,出现了一个问题,即DMA缓冲的建立发生在第一次调 用write()函数将音频数据传送到设备描述符的时候,然而oss驱动的调用者通常要在打开音频设备描述时候,就期望获取DMA缓冲的信息,然而因为缓 冲尚未建立,因而返回缓冲大小为0这个结果。  
   
解决的办法是在音频驱动源码的smdk2410_audio_open()函数体,加上如下一段代码,

 
  1. if   (!output_stream   .buffers   &&   audio_setup_buf(&output_stream))      
  2.                                               return   -ENOMEM;      
  3.       添加的位置具体见以下代码的粗体部分:      
  4.               static   int   smdk2410_audio_open(struct   inode   *inode,   struct   file   *file)      
  5.       {      
  6.                     int   cold   =   !audio_active;      
  7.                             DPRINTK("audio_open ");      
  8.                             if   ((file->f_flags   &   O_ACCMODE)   ==   O_RDONLY)   {      
  9.                                   if   (audio_rd_refcount   ||   audio_wr_refcount)      
  10.                                                 return   -EBUSY;      
  11.                                   audio_rd_refcount++;      
  12.                     }   else   if   ((file->f_flags   &   O_ACCMODE)   ==   O_WRONLY)   {      
  13.                                   if   (audio_wr_refcount)      
  14.                                                 return   -EBUSY;      
  15.                                   audio_wr_refcount++;      
  16.                     }   else   if   ((file->f_flags   &   O_ACCMODE)   ==   O_RDWR)   {      
  17.                                   if   (audio_rd_refcount   ||   audio_wr_refcount)      
  18.                                                 return   -EBUSY;      
  19.                                   audio_rd_refcount++;      
  20.                                   audio_wr_refcount++;      
  21.                     }   else      
  22.                                   return   -EINVAL;      
  23.                           if   (cold)   {      
  24.                                   audio_rate   =   AUDIO_RATE_DEFAULT;      
  25.                                   audio_channels   =   AUDIO_CHANNELS_DEFAULT;      
  26.                                   audio_fragsize   =   AUDIO_FRAGSIZE_DEFAULT;      
  27.                                   audio_nbfrags   =   AUDIO_NBFRAGS_DEFAULT;      
  28.                                   if   ((file->f_mode   &   FMODE_WRITE)){      
  29.                                                               init_s3c2410_iis_bus_tx();      
  30.                                                               audio_clear_buf(&output_stream);      
  31.                                     //   加上以下这行代码      
  32.                                         if   (!output_stream   .buffers   &&   audio_setup_buf(&output_stream))      
  33.                                               return   -ENOMEM;      
  34.                                   }      
  35.                                   if   ((file->f_mode   &   FMODE_READ)){      
  36.                                                               init_s3c2410_iis_bus_rx();      
  37.                                                               audio_clear_buf(&input_stream);      
  38.                                   }      
  39.                 }      
  40.                 MOD_INC_USE_COUNT;      
  41.                return   0;      
  42.     }      

改完驱动后,重新编译内核。

=====================================================

更新
解决Failed to open /dev/rtc: No such file or directory (it should be readable by the user.)问题
在configure时添加 --disable-rtc

 
相关文章:
s3c2410 Timer工作原理[图]
虚拟SPI时序在TC77与S3C2410通信中的应用[图]
s3c2410 MMU(存储器管理单元)讲解[图]
s3c2410 CACHES,WRITE BUFFER讲解[图]
S3C2410中的脉宽调制定时器(PWM)
S3C2410 中断程序的实现
s3c2410 watchdog详解
s3c2410 中断异常处理[图]
基于ARM9芯片S3C2410a的GPRS数据终端设计
ARM系统中DMA方式在数据采集中的应用[图]
AD7888与S3C2410的SPI接口及Linux下嵌入式驱动的实现[图]
基于s3c2410的ARMer9开发平台的使用
ARM S3C2410硬件手册重点
基于ARM S3C2410与TMS320C6416的接口设计[图]
S3C2410上Jffs2的移植
ARM S3C2410驱动TFT-LCD的研究[图]
MINIGUI在S3C2410开发板的移植
ARM MPlayer移植过程
mplayer在S3C2410上的移植
在S3C2410上移植yaffs2文件系统
S3C2410 bootloader(vivi)阅读笔记
s3c2410 LCD图片显示
S3C2410 LCD 驱动程序移植及GUI程序编写[图]
S3C2410X开发总结及心得
U-Boot在S3C2410开发板上的移植
S3C2410初始化
S3C2410通过IIS总线与音频芯片UDA1380进行通信
在S3C2410上移植bluetooth(蓝牙)
S3c2410软件调试总结
S3C2410上触摸屏的应用实例
S3c2410的触摸屏及模数转换
S3C2410的快速启动技术
基于嵌入式linux和s3c2410平台的视频采集
S3c2410 LCD驱动学习心得

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4