編譯移植Mplayer到mini2440開發板的過程及問題解決辦法

kunkliu發表於2020-04-05

轉載地址:http://blog.sina.com.cn/s/blog_640531380100utiz.html

在網上搜了一下,實現linux下通用播發器Mplayer到mini2440開發板的編譯移植過程不算複雜。不過。由於各種原因,在編譯過程中總 會遇到許多問題,而多數問題從網上又都可以找得到答案。在此,結合本人親自移植經歷,將整個編譯移植過程和這個過程中遇到的問題及解決辦法整理一下,和大 家一起分享。

##################################################################################################

準備工作:

 1、下載Mplayer的版本為:MPlayer-1.0rc2.tar.bz2   並將其解壓到linux主機的/opt資料夾下(任意資料夾都可以);

 2、下載libmad的版本為: libmad-0.15.1b.tar.gz    並將其也解壓到/opt資料夾下;

 3、交叉編譯器版本為:arm-linux-gcc-4.4.3

################################################################################################

 libmad交叉編譯過程及問題解決辦法:

1、#cd /opt/libmad-0.15b

2 ./configure  --prefix=/tmp/mplayer  --enable-fpm=arm --host=arm-linux  --disable-debugging  --enable-shared --enable-static 

 CC=arm-linux-gcc   (CC為交叉編譯工具,如果沒新增到環境變數,就要指定完整路徑)

3、  make

4、  make install

這時如果出現錯誤:cc1: error: unrecognized command line option “-fforce-mem”
(其實這個錯誤是編譯安裝libmad時候引起的,audacity包含libmad)
  解決方式是:找到libmad configure之後的Makefile,並vi Makefile

去掉129行"-fforce-mem"字串,因為arm-eabi編譯器都不支援這個選項,將其刪除之後,就ok了

 

###############################################################################################

 Mplayer交叉編譯過程及問題解決辦法:

1、#cd /opt/Mplayer-1.0rc2

2、./configure     --prefix=/tmp/mplayer       --cc=arm-linux-gcc       --target=arm-linux     --enable-static           --disable-win32dll

--disable-dvdread        --disable-dvdread-internal       --disable-dvdnav       --disable-libdvdcss-internal       --disable-mencoder 

--disable-mp3lib     --disable-armv5te       --disable-armv6        --enable-fbdev       --enable-mad         --enable-libavcodec_a    

 --enable-libavcodec_mpegaudio_hp                    --disable-iconv                    --enable-linux-devfs             --disable-ivtv

--language=zh_CN                 --enable-cross-compile                     --enable-real   --enable-ossaudio   --host-cc=gcc                          --disable-live

--with-extraincdir=/opt/FriendlyARM/toolschain/4.4.3/lib/include    

 --with-extralibdir=/opt/FriendlyARM/toolschain/4.4.3/lib/lib          2>&1|tee logfile     

 

引數解釋:
       --prefix                      mplayer安裝路徑,make install 後就可以在本目錄下找到可執行程式mplayer

         --cc                        交叉編譯工具,如果沒新增到環境變數,就要指定完整路徑

         --enable-static       設定靜態連線

        --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        禁止編碼功能

        --disable-live         禁止live 555流媒體。

       --enable-libavcodec_a        啟用靜態的libavcodec解碼。在pre版本中該引數為--enable-libavcodec。

        --disable-armv5te --disable-armv6        禁用armv5te、armv6指令擴充套件。

        --with-extraincdir和-with-extralibdir        指定libmad和mad.h的路徑

 

3、make

      make完後如出現如下問題:

 

問題一:

---------------------------------------------------------------------------------------------------------------------------------------------

......

......

armv4l/jrevdct_arm.S: Assembler messages:

armv4l/jrevdct_arm.S:59: Error: no such instruction: `stmdb sp!,{r4 - r12,lr}@all callee saved regs'

armv4l/jrevdct_arm.S:61: Error: too many memory references for `sub'

armv4l/jrevdct_arm.S:62: Error: invalid char '[' beginning operand 2 `[ sp]@save the DCT pointer to the stack'

armv4l/jrevdct_arm.S:64: Error: invalid character '=' in operand 2

armv4l/jrevdct_arm.S:65: Error: expecting operand after ','; got nothing

armv4l/jrevdct_arm.S:66: Error: too many memory references for `add'

armv4l/jrevdct_arm.S:68: Error: no such instruction: `ldrsh r0,[lr,'

armv4l/jrevdct_arm.S:69: Error: no such instruction: `ldrsh r1,[lr,'

armv4l/jrevdct_arm.S:71: Error: junk at end of line, first unrecognized character is `@'

armv4l/jrevdct_arm.S:72: Error: junk at end of line, first unrecognized character is `@'

armv4l/jrevdct_arm.S:73: Error: no such instruction: `ldr r5,[lr,'

armv4l/jrevdct_arm.S:74: Error: no such instruction: `ldr r2,[lr,'

......

......

armv4l/jrevdct_arm.S:347: Error: no such instruction: `bne column_loop'

armv4l/jrevdct_arm.S:350: Error: junk at end of line, first unrecognized character is `@'

armv4l/jrevdct_arm.S:351: Error: too many memory references for `add'

armv4l/jrevdct_arm.S:352: Error: no such instruction: `ldmia sp!,{r4 - r12,pc}@restore callee saved regs and return'

make[1]: *** [armv4l/jrevdct_arm.o] 錯誤 1

make[1]: Leaving directory `/home/zazhgf/Mplayer/MPlayer-1.0rc2/libavcodec'

make: *** [libavcodec/libavcodec.a] 錯誤 2

----------------------------------------------------------------------------------------------------------------------------------------------------

解決辦法:

在報錯檔案MPlayer-1.0rc2/libmpeg2/motion_comp_arm_s.S和MPlayer-1.0rc2/libavcodec/armv4l/dsputil_arm_s.S兩個s.S檔案的開始處新增如下程式碼:

#ifndef HAVE_PLD

.macro pld reg

.endm

#endif

(這段程式碼意思是定義一個空的ARM彙編巨集 pld,這樣當程式碼出現pld指令,就變成一條空指令)

 

問題二:

-------------------------------------------------------------------------------------------------------------------------------------------------------       vo_ivtv.c: In function 'ivtv_reset':
       vo_ivtv.c:79: error: storage size of 'sd' isn't known
       vo_ivtv.c:80: error: storage size of 'sd1' isn't known
       vo_ivtv.c:84: error: 'IVTV_STOP_FL_HIDE_FRAME' undeclared (first use in this function)
       vo_ivtv.c:84: error: (Each undeclared identifier is reported .ly .ce
      vo_ivtv.c:84: error: for each function it appears in.)
      vo_ivtv.c:87: error: 'IVTV_IOC_STOP_DECODE' undeclared (first use in this function)
      vo_ivtv.c:97: error: 'IVTV_IOC_START_DECODE' undeclared (first use in this function)
      vo_ivtv.c:80: warning: unused variable 'sd1'
      vo_ivtv.c:79: warning: unused variable 'sd'
      make[1]: *** [vo_ivtv.o] Error 1
      make[1]: Leaving directory `/data1/wdy-tools/smplayer/MPlayer-1.0rc2/libvo'
      make: *** [libvo/libvo.a] Error 2
     -------------------------------------------------------------------------------------------------------------------------------------------------------------
     解決辦法:

在 ./configure 時新增 --disable-ivtv 來解決(我的第2步中有這個引數)

 

問題三:

--------------------------------------------------------------------------------------------------------------------------------------------------------

undefined reference to `video_out_ivtv'
       collect2: ld returned 1 exit status 
       ---------------------------------------------------------------------------------------------------------------------------------------------------------
      解決辦法:

開啟檔案 libvo/video_out.c,將其程式碼的以下部分: 
        #ifdef HAVE_DXR2
        extern vo_functions_t video_out_dxr2;
        #endif
       extern vo_functions_t video_out_dxr3; 

 #ifdef HAVE_IVTV
       extern vo_functions_t video_out_ivtv;
       #endif
     修改為:(紅色字型為新增部分)

#ifdef HAVE_DXR2
       extern vo_functions_t video_out_dxr2;
       #endif
       #ifdef HAVE_DXR3
       extern vo_functions_t video_out_dxr3; 
       #endif
       #ifdef HAVE_IVTV
      extern vo_functions_t video_out_ivtv;
      #endif

(可能還會遇到別的問題,到網上搜去吧,大都能找得到答案)

4、重新make,應該就沒有問題

5、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

---------------------------------------------------------------------------------------------------

不必理會,因為這時已經在/tem/mplayer/bin/下產生了可執行檔案mplayer了

###########################################################################################

   將可執行程式mplayer移植到mini2440開發板的/usr/bin目錄下

(通過設定開發板使系統通過nfs啟動,然後掛載主機,進行移植)

###########################################################################################

在開發板下執行:# mplayer   test.avi  -framedrop -vf rotate=1 ,scale=240 : 320

在播放音訊或視訊檔案時會出現沒有聲音輸出的問題,終端提示

[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 檔案。

再次# mplayer   test.avi  -framedrop -vf rotate=1 ,scale=240 : 320  就可以聽到聲音啦!

################################################################################################

到此,所有的工作已經完了,慢慢享受成功吧。嘿嘿。。。

相關文章