モバイルプラットフォームベースのマルチメディアフレームワーク-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_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でコンパイルして実行します.