天天看點

jz2440 ARM9 開發闆移植 mplayer

1 、所需工具

mplayer版本 MPlayer-1.0rc2.tar.bz2 (我試了最新版本 一直出錯 便還是選擇了這個版本)

libmad版本 libmad-0.15.1b.tar.gz

(libmad)是一個開源的高精度 MPEG 音頻解碼庫,完全是定點計算,非常适合沒有浮點支援的平台上使用。

2、編譯libmad

先解壓libmad

tar xf libmad-0.15.1b.tar.gz

cd libmad-0.15.1b

./configure --prefix=/work/mplayer/mplayer --enable-fpm=arm --host=arm-linux --disable-debugging --enable-shared --enable-static CC=arm-linux-gcc //生成配置檔案

–prefix=/work/mplayer/mplayer //是生成 mad.h 和 libmad 庫的地方 自定義即可

make && make install

3、編譯mplayer

解壓再進入解壓後的目錄

./configure --prefix=/work/mplayer/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=/work/mplayer/mplayer/include --with-extralibdir=/work/mplayer/mplayer/lib 2>&1|tee logfile
           
//生成配置檔案
           

–prefix=/work/mplayer/mplayer //生成可執行程式的路徑,自定義即可

–with-extraincdir=/work/mplayer/mplayer/include --with-extralibdir=/work/mplayer/mplayer/lib //libmad 和 //mad.h 所在路徑 根據自己情況寫

–disable-win32dll //禁用win32動态連接配接庫支援

–disable-mp3lib //這是一個浮點運算解碼的 2440 上用不了 是以要禁止

–enable-mad //支援 libmad 解碼

make && make install

這時候可能會有錯誤

jz2440 ARM9 開發闆移植 mplayer

如果是這種錯誤的話

vim libavcodec/armv4l/dsputil_arm_s.S

vim libmpeg2/motion_comp_arm_s.S

在這兩個檔案開頭加上

#ifndef HAVE_PLD

.macro pld reg

.endm

#endif

然後我又遇見了這個錯誤

jz2440 ARM9 開發闆移植 mplayer

不知道是為什麼 但是去掉 config.mak 33 行處的-s 參數之後 再次 make && make install 就沒錯誤了

這時候會在目錄下生成兩個可執行檔案 mplayer 和 mencoder

mencoder 是一個格式轉換工具 比如我在小破站上直接下載下傳的檔案 在開發闆上用 mplayer 上播放 就提示

jz2440 ARM9 開發闆移植 mplayer

就不支援 ,此時這個工具就可以派上用場了 可以用這個轉換成 mp4 或者 avi 格式的 但是我看網上說可以直接用 但我的不可以 還是需要 sudo apt 一下

jz2440 ARM9 開發闆移植 mplayer

直接百度就出來的 就可以進行格式轉換了

扯遠了

在生成可執行檔案 mplayer 後 将它複制到開發闆的 bin 目錄下面 就可以使用了

但會出現沒有聲音的情況

提示 [AO OSS] 音頻設定: 無法打開音頻裝置 /dev/sound/dsp: No such file or directory

此時

mkdir -p /dev/sound

ln -s /dev/dsp /dev/sound/

或者把這個直接加在 rc.S 檔案裡 雖然我加了 開機後還是沒有

但我這樣弄了之後 不光沒有聲音 連動畫畫面也沒有了

然後我測試了下 音頻驅動 cat 1.mp3 > /dev/sound/dsp 差點兒給我震聾

嗯 音頻驅動沒有問題

而且我裝了madplay 播放 MP3 檔案完全可以播放

我查了一下 mplayer 使用指南

player -zoom -x <x> -y <y> <somefile>  //指定播放的尺寸
mplayer -fs <somefile> //全屏播放


mplayer -ac mad //用libmad播放
-framedrop //慢系統上播放
           

我又試了一次 mplayer -ac mad -framedrop -fs 01.avi

正在播放 01.mp4。
檢測到 Quicktime/MOV 檔案格式。
[mov] 找到音頻流,-aid 0
[mov] 找到視訊流,-vid 1
VIDEO:  [avc1]  544x960  24bpp  29.079 fps    0.0 kbps ( 0.0 kbyte/s)
==========================================================================
打開視訊解碼器: [ffmpeg] FFmpeg's libavcodec codec family
已選視訊編解碼器: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
==========================================================================
打開音頻解碼器: [faad] AAC (MPEG2/4 Advanced Audio Coding)
AUDIO: 44100 Hz, 2 ch, s16le, 64.2 kbit/4.55% (ratio: 8026->17640s3c2410-uda1341-superlp: audio_set_dsp_speed:44100 prescaler:66
s3c2410-uda1341-superlp: audio_set_dsp_speed:44100 prescaler:66
0)
已選音頻編解碼器: [faad] afm: faad (FAAD AAC (MPEG-2/MPEG-4 Audio) decoder)
==========================================================================
AO: [oss] 44100Hz 2ch s16le (2 bytes per sample)
開始播放...
VDec: vo 配置請求 - 544 x 960 (色彩空間首選項: Planar YV12)
找不到比對的色彩空間 - 重新嘗試 -vf scale...
打開視訊濾鏡: [scale]
VDec: 使用 Planar YV12 作為輸出 csp (沒有 0)
電影寬高比未定義 - 沒使用預放大。
[swscaler @ 0x80b184]No accelerated colorspace conversion found
[swscaler @ 0x80b184]SwScaler: using unscaled yuv420p -> bgr565 special converter
VO: [fbdev] 544x960 => 544x960 BGR 16-bit
A:   0.0 V:   0.0 A-V:  0.000 ct:  0.000   1/  1 ??% ??% ??,?% 0 0
           

會一直卡在這裡不會播放動畫 也沒有聲音 但我點了一下快進鍵 發現動畫 可以快進後退

但還是會卡住

這便很顯然 是聲霸卡驅動有問題

我在網上找 發現了一位大神的解決辦法 連結

在聲霸卡驅動裡 smdk2410_audio_open 函數裡修改

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);
			}
		}
           

這個問題産生的根源最終追溯到音頻的驅動部分。現在大部分的嵌入式闆子都使用菲利普 uda1341 音頻晶片,因而也都使用了相同一個音頻驅動,即 MIZI 公司擁有版權的 linux uda1341 音頻驅動,這個驅動基本上符合了 oss 的規範,但是當使用到多段 DMA 音頻資料傳輸時,出現了一個問題,即 DMA 緩沖的建立發生在第一次調用 write()函數将音頻資料傳送到裝置描述符的時候,然而 oss 驅動的調用者通常要在打開音頻裝置描述時候,就期望擷取 DMA 緩沖的資訊,然而因為緩沖尚未建立,因而傳回緩沖大小為 0 這個結果。

按以上的方法做了,但是還是出現同樣的提示,仔細的看了驅動,在驅動上加了大量的調試資訊最後發現在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));

重新編譯核心,就可以了

但是 在我播放一次視訊 準備再播放一次的時候 又出現了新的問題 (是不是有毒 所有能碰見的問題都給我遇見了呗 -_-!!!)

jz2440 ARM9 開發闆移植 mplayer

無法初始化視訊驅動 !

我的運作的指令是 mplayer -ac mad -framedrop -fs

但我播放另外一個視訊就可以

于是我去掉 -fs 指令 OK

繼續閱讀