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
這時候可能會有錯誤
如果是這種錯誤的話
vim libavcodec/armv4l/dsputil_arm_s.S
vim libmpeg2/motion_comp_arm_s.S
在這兩個檔案開頭加上
#ifndef HAVE_PLD
.macro pld reg
.endm
#endif
然後我又遇見了這個錯誤
不知道是為什麼 但是去掉 config.mak 33 行處的-s 參數之後 再次 make && make install 就沒錯誤了
這時候會在目錄下生成兩個可執行檔案 mplayer 和 mencoder
mencoder 是一個格式轉換工具 比如我在小破站上直接下載下傳的檔案 在開發闆上用 mplayer 上播放 就提示
就不支援 ,此時這個工具就可以派上用場了 可以用這個轉換成 mp4 或者 avi 格式的 但是我看網上說可以直接用 但我的不可以 還是需要 sudo apt 一下
直接百度就出來的 就可以進行格式轉換了
扯遠了
在生成可執行檔案 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));
重新編譯核心,就可以了
但是 在我播放一次視訊 準備再播放一次的時候 又出現了新的問題 (是不是有毒 所有能碰見的問題都給我遇見了呗 -_-!!!)
無法初始化視訊驅動 !
我的運作的指令是 mplayer -ac mad -framedrop -fs
但我播放另外一個視訊就可以
于是我去掉 -fs 指令 OK