モバイルプラットフォームベースのマルチメディアフレームワーク-Androidにプレーヤーを移植
モバイルプラットフォームベースのマルチメディアフレームワーク-Androidにプレーヤーを移植
今日、私たちが開発したffmpegベースのプレーヤーをAndroidに移植することに成功し、tablet上でテストに成功しました.本明細書で提供する考え方によれば、ffmpegベースのすべてのプレーヤーをAndroidに移植することができる.
準備:
必要な2つのライブラリ,ffmpeg,SDLのコンパイル方法については,前述した.
開発時には、この2つのコンパイルされたライブラリファイル:libffmpegが必要です.soとlibSDL.so/platforms/android-8/arch-arm/usr/lib/下に入れる.デバッグおよび実行時には、adb pushをAndroidの/system/lib/以下に使用する必要があります.
△本明細書で述べた項目のバージョンには違いがあり、長い間メンテナンスされていません.参考にして、大意を味わうことを改めて強くお勧めします.vlc公式のandroidバージョンで試してみることをお勧めします.本明細書と同じ考えですが、不要な面倒を省くことができます.本明細書の例のプレーヤーダウンロードアドレスは、https://github.com/pkuembedded/TVplayer.このプレーヤーは私たちの実験室が自分で開発したもので、現在はまだ更新中ではありませんが、基本的な再生機能はあります.読者は自分の興味に基づいて、自分が開発したプレーヤーを含む他の機能の強いオープンソースプレーヤーを本論文の考え方に従って移植することができます.
ステップ1:eclipseでAndroidプロジェクトを新規作成します.PC Linux版のTVplayerと区別するため、このプロジェクト名はTVplayer_Android.パッケージ名はcom.プレイヤー、クラス名はTVplayer.
新しいプロジェクトを作成する場合は、ffmpegとSDLが一致するAndroidのバージョンとndk、sdkのバージョンを選択してコンパイルします.
ステップ2:移植対象のプレーヤーをプロジェクトにインポートします.TVプレイヤーでAndroidディレクトリの下にjni/srcを新規作成します.TVplayerの下のsrcのすべてのcファイルとhファイルをTVplayer_にコピーAndroid/jni/srcでは、NDKでコンパイルする準備をしています.
新しいTVplayer_Android/jni/Android.mk.内容は次のとおりです.
LOCAL_SRC_FILESの最初の行の後ろにコンパイルするソースファイルが追加されます.
LOCAL_C_INCLUDESの最初の2行は、cライブラリのヘッダファイルを含むために使用され、ffmpegとSDLのヘッダファイルディレクトリをここに追加します.
LOCAL_LDLIBSの最初の行には、デバッグが容易になります.
ステップ3:javaクラスを実装します.AndroidがSDLをサポートするためには、SDLソースファイルのSDLActivityが必要です.JAvaファイル.SDLActivity.JAvaは私たち自身のTVplayerにコピーします.JAva兄弟ディレクトリ.
TVplayerを修正します.JAvaは次のとおりです.
今日、私たちが開発したffmpegベースのプレーヤーをAndroidに移植することに成功し、tablet上でテストに成功しました.本明細書で提供する考え方によれば、ffmpegベースのすべてのプレーヤーをAndroidに移植することができる.
準備:
必要な2つのライブラリ,ffmpeg,SDLのコンパイル方法については,前述した.
開発時には、この2つのコンパイルされたライブラリファイル:libffmpegが必要です.soとlibSDL.so
△本明細書で述べた項目のバージョンには違いがあり、長い間メンテナンスされていません.参考にして、大意を味わうことを改めて強くお勧めします.vlc公式のandroidバージョンで試してみることをお勧めします.本明細書と同じ考えですが、不要な面倒を省くことができます.本明細書の例のプレーヤーダウンロードアドレスは、https://github.com/pkuembedded/TVplayer.このプレーヤーは私たちの実験室が自分で開発したもので、現在はまだ更新中ではありませんが、基本的な再生機能はあります.読者は自分の興味に基づいて、自分が開発したプレーヤーを含む他の機能の強いオープンソースプレーヤーを本論文の考え方に従って移植することができます.
ステップ1:eclipseでAndroidプロジェクトを新規作成します.PC Linux版のTVplayerと区別するため、このプロジェクト名はTVplayer_Android.パッケージ名はcom.プレイヤー、クラス名はTVplayer.
新しいプロジェクトを作成する場合は、ffmpegとSDLが一致するAndroidのバージョンとndk、sdkのバージョンを選択してコンパイルします.
ステップ2:移植対象のプレーヤーをプロジェクトにインポートします.TVプレイヤーでAndroidディレクトリの下にjni/srcを新規作成します.TVplayerの下のsrcのすべてのcファイルとhファイルをTVplayer_にコピーAndroid/jni/srcでは、NDKでコンパイルする準備をしています.
新しいTVplayer_Android/jni/Android.mk.内容は次のとおりです.
LOCAL_PATH := $(call my-dir)/src
include $(CLEAR_VARS)
LOCAL_MODULE := TVplayer
LOCAL_SRC_FILES := \
audio.c \
display.c \
file.c \
queue.c \
sync.c \
TVplayer.c \
video.c
LOCAL_C_INCLUDES += /home/baby/workspace/SDL-1.3.0-6050/include/
LOCAL_C_INCLUDES += /home/baby/workspace/avs/ffmpeg-0.8.7/
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -lffmpeg -lSDL -llog
include $(BUILD_SHARED_LIBRARY)
:LOCAL_SRC_FILESの最初の行の後ろにコンパイルするソースファイルが追加されます.
LOCAL_C_INCLUDESの最初の2行は、cライブラリのヘッダファイルを含むために使用され、ffmpegとSDLのヘッダファイルディレクトリをここに追加します.
LOCAL_LDLIBSの最初の行には、デバッグが容易になります.
ステップ3:javaクラスを実装します.AndroidがSDLをサポートするためには、SDLソースファイルのSDLActivityが必要です.JAvaファイル.SDLActivity.JAvaは私たち自身のTVplayerにコピーします.JAva兄弟ディレクトリ.
TVplayerを修正します.JAvaは次のとおりです.
public class TVplayer extends SDLActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
这里采用的方法是用自己的类继承SDLActivity类,在onCreate方法中调用父类方法。简单起见也可以直接把SDLActivity类改名为TVplayer,为了以后方面添加其他类而不至于太臃肿,没有采用这种方法。SDLActivity.java要稍作修改:将原来的System.loadLibrary函数全部注释,然后在原位置添加一句System.loadLibrary("TVplayer");结果如下:static { //System.loadLibrary("SDL"); //System.loadLibrary("SDL_image"); //System.loadLibrary("SDL_mixer"); //System.loadLibrary("SDL_ttf"); //System.loadLibrary("main"); System.loadLibrary("TVplayer"); }
ステップ4:cファイルを変更します.TVplayer_Android/jni/src/TVplayer.cファイルも変更します.
Javaのnative関数を実装します.次のようにします.void Java_com_player_SDLActivity_nativeInit(JNIEnv* env, jclass cls, jobject obj){ /* This interface could expand with ABI negotiation, calbacks, etc. */ SDL_Android_Init(env, cls); /* Run the application code! */ int status; char *argv[2]; argv[0] = strdup("SDL_app"); argv[1] = NULL; //status = main(1, argv); status = main(2, argv); /* We exit here for consistency with other platforms. */ exit(status); // Java_org_libsdl_app_SDLActivity_nativeInit(env, cls, obj); } void Java_com_player_SDLActivity_nativeQuit(JNIEnv* env, jclass cls, jobject obj){ Java_org_libsdl_app_SDLActivity_nativeQuit(env, cls, obj); } void Java_com_player_SDLActivity_onNativeResize(JNIEnv* env, jclass cls, jobject obj, int x, int y, int format){ Java_org_libsdl_app_SDLActivity_onNativeResize(env, cls, obj, x, y, format); } void Java_com_player_SDLActivity_onNativeAccel(JNIEnv* env, jclass cls, jobject obj, float x, float y, float z){ Java_org_libsdl_app_SDLActivity_onNativeAccel(env, cls, obj, x, y, z); }
実装方法とは,SDLの元の実装方法を呼び出すことである.前回のSDLの移行例を実行して、プロセス全体を理解すれば、SDLで対応する関数を見つけることができます.
これらの関数を追加すると、JavaはSDLをAndroid設計の初期化方法として呼び出し、元のmain関数で呼び出されたSDL_Init関数が削除されました.
ステップ5:コンパイル実行:まずエンジニアリングディレクトリの下でndk-buildを生成しlibTVplayerを生成する.so.
次にeclipseでコンパイルして実行します.