s3c2410移植MPlayer到linux2.6

admin @ 2014-03-25 , reply:0

我使用的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()函數體,加上如下一段代碼,  
   
if   (!output_stream   .buffers   &&   audio_setup_buf(&output_stream))  
                                              return   -ENOMEM;  
      添加的位置具體見以下代碼的粗體部分:  
              static   int   smdk2410_audio_open(struct   inode   *inode,   struct   file   *file)  
      {  
                    int   cold   =   !audio_active;  
                            DPRINTK("audio_open ");  
                            if   ((file->f_flags   &   O_ACCMODE)   ==   O_RDONLY)   {  
                                  if   (audio_rd_refcount   ||   audio_wr_refcount)  
                                                return   -EBUSY;  
                                  audio_rd_refcount++;  
                    }   else   if   ((file->f_flags   &   O_ACCMODE)   ==   O_WRONLY)   {  
                                  if   (audio_wr_refcount)  
                                                return   -EBUSY;  
                                  audio_wr_refcount++;  
                    }   else   if   ((file->f_flags   &   O_ACCMODE)   ==   O_RDWR)   {  
                                  if   (audio_rd_refcount   ||   audio_wr_refcount)  
                                                return   -EBUSY;  
                                  audio_rd_refcount++;  
                                  audio_wr_refcount++;  
                    }   else  
                                  return   -EINVAL;  
                          if   (cold)   {  
                                  audio_rate   =   AUDIO_RATE_DEFAULT;  
                                  audio_channels   =   AUDIO_CHANNELS_DEFAULT;  
                                  audio_fragsize   =   AUDIO_FRAGSIZE_DEFAULT;  
                                  audio_nbfrags   =   AUDIO_NBFRAGS_DEFAULT;  
                                  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;  
                                  }  
                                  if   ((file->f_mode   &   FMODE_READ)){  
                                                              init_s3c2410_iis_bus_rx();  
                                                              audio_clear_buf(&input_stream);  
                                  }  
                }  
                MOD_INC_USE_COUNT;  
               return   0;  
    }  
    改完驅動后,重新編譯內核。

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

更新
解決Failed to open /dev/rtc: No such file or directory (it should be readable by the user.)問題
在configure時添加 --disable-rtc




[admin via 研發互助社區 ] s3c2410移植MPlayer到linux2.6已經有1973次圍觀

http://cocdig.com/docs/show-post-42050.html