我們想要在Android上面開發自己的media player,第一個想到的就是利用FFmpeg來實作。FFmpeg是一個跨平台的編解碼函式庫,我們可以呼叫它所提供的API來完成。另 外,FFmpeg有提供一個小程式ffplay,它本身就是一個media player,所以我們打算以ffplay作為程式的基礎。
以 下是這次我所用到的開發環境:
- Cygwin
- Android NDK:android-ndk-r4b-windows
- FFmpeg:0.6.1
- SDL:1.2.14
《Step 1》
首先建立一個Android的project。
《Step 2》
建立一個資料 夾$(PROJECT)/jni/libs,然後參考【將FFmpeg整合至Android平台】,將libavcodec.a、libavformat.a、 libavutil.a、libpostproc.a和libswscale.a拷貝至此。
《Step 3》
從 ffplay的程式碼中,可以發現它內部會用到SDL的函式。因為FFmpeg只負責編解碼,如果想要將解出來的影像資料畫到螢幕上去,或是將聲音播放出 來,這時就會需要SDL來幫忙把資料傳給device。可以參考【將SDL整合至Android平台】,將libSDL.a拷貝至$(PROJECT)/jni/libs。
《Step 4》
將ffplay.c、cmdutils.c和cmdutils.h放到$(PROJECT)/jni底下,然後建立一個Makefile:
TARGET = libjniomx.so
SOURCES = $(wildcard *.c)
CFLAGS = -I../../../build/platforms/tegra/include/openmax/il/ -I/usr/local/include/SDL/ -I./ffmpeg/ -std=c99
LDFLAGS = -lstdc++ -lc -lm -llog -lnvomx -lavformat -lavcodec -lavutil -lswscale
LDFLAGS += -L./ffmpeg/libs/ -lSDL
include ../../../build/build.mk
《Step 5》
在$(PROJECT)/jni底下執行make,接著透過Eclipse將project build出來。
《Step 6》
Install到Android平台上會發現程式跑不起來,我們可以利用debug模式來看問題出在哪裡。此時會出現下面的 message:
No available video device
Trace程式會得到開啟/dev/graphics/fb0失敗的現象。
《Step 7》
參考下面的連結:
http://groups.google.com/group/android-ndk/browse_thread/thread/9cb5a34e0baae1f0
Linux的framebuffer在存取上會有permission方面的問題,因此我 們的程式無法正常運行。
《Step 8》
結論:以FFmpeg加上SDL所實作的media player,無法在Android平台上作用。
轉自 http://blog.csdn.net/banyao2006/archive/2011/01/10/6126247.aspx