7

私はやるべき簡単な仕事を持っています。Android環境で動作するffmpegを使用して、一連の写真をビデオにマージする必要があります。

コンパイルffmpegを実行する方法を説明するさまざまなチュートリアルと例と1週間以上戦った後、私は中間の成功を収めたとしましょう。私はついにAndroid用のffmpegをコンパイルしました。

私はこの例に従いました: https://github.com/appunite/AndroidFFmpeg は私にとって最もうまくいきました。

ffmpeg をビルドした結果、次のディレクトリ構造が作成されました。

[Project]/jni/ffmpeg-build/armeabi-v7a/libffmpeg.so
[Project]/jni/ffmpeg-build/armeabi/libffmpeg.so
[Project]/jni/ffmpeg-build/mips/libffmpeg.so
[Project]/jni/ffmpeg-build/x86/libffmpeg.so

ndk の例にも従ったので、Java から C コードを実行しました。

#include <string.h>
#include <jni.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>    
#include <android/log.h>    
#include <stdlib.h>
#include <stdbool.h>

bool initted = false;    
static JavaVM *sVm;

jstring Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz) {

    char **argv;
    char *cmd;
    int argc;

//  cmd = "ffmpeg -version";
//  argv = parsedargs(cmd, &argc);
//  ffmpeg(argc, argv);

    return (*env)->NewStringUTF(env, "Hello from JNI !");

}

私の質問は、「hello-jni」C ファイルから ffmpeg の関数を実行する方法です。私のhello-jniが意図しているffmpegのラッパーを書く必要があることを読みました。

これはおそらく私の目標を達成するための重要な部分である私の Android.mk ですが、正直なところ、このファイルに設定されているいくつかの行がわかりません。または単に物事を機能させる方法がわかりません。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg-prebuilt
LOCAL_SRC_FILES := ffmpeg-build/$(TARGET_ARCH_ABI)/libffmpeg.so
LOCAL_EXPORT_C_INCLUDES := ffmpeg-build/$(TARGET_ARCH_ABI)/include
LOCAL_EXPORT_LDLIBS := ffmpeg-build/$(TARGET_ARCH_ABI)/libffmpeg.so
LOCAL_PRELINK_MODULE := true
include $(PREBUILT_SHARED_LIBRARY)


include $(CLEAR_VARS)
LOCAL_ALLOW_UNDEFINED_SYMBOLS=true
LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/ffmpeg-build/$(TARGET_ARCH_ABI)/include
LOCAL_SHARED_LIBRARY := ffmpeg-prebuilt
#LOCAL_CFLAGS += -g -Iffmpeg-prebuilt -Ihello-jni -Wno-deprecated-declarations 
#LOCAL_LDLIBS += -llog -lz -landroid ffmpeg-build/$(TARGET_ARCH_ABI)/libffmpeg.so 

include $(BUILD_SHARED_LIBRARY)

もう一つ。ffmpeg のメイン関数をラップする方法の例を見つけました。ffmpeg の api がわからないので、ffmpeg を使用する最も簡単な方法です。この方法で ffmpeg を実行できることを願ってい ます。スタンドアロン プログラムではなく、ライブラリとして FFmpeg を使用できますか?

要約すると、私の問題は、c/c++ の知識がまったくないことが原因であると思います。特に、.so ライブラリから関数を実行する方法についてです。

誰かが私を助けてくれることを願っています:)。

4

1 に答える 1

5

https://github.com/halfninja/android-ffmpeg-x264/blob/master/Project/jni/videokit/uk_co_halfninja_videokit_Videokit.c

上記のリンクの「JNI_Call...」を見てください。これは、Android から「ffmpeg.main()」のラッパーを呼び出す方法です。

https://github.com/halfninja/android-ffmpeg-x264/blob/master/Project/jni/videokit/ffmpeg.c

上記のリンクを使用して、最後に「main()」を見つけます。これは、ffmpeg.c の非常にわずかに変更されたバージョンの例です (java/android ndk 用に変更されたロガー)。

これらのサンプルを学習すると、他のプロジェクトのいずれかで ffmpeg.main() を使用したい場合にラップする方法を理解できるはずです。現時点ではロガーの問題は重要ではないため、git の最新の [android-ffmpeg] プロジェクトでは、そのまま ffmpeg.c を作成して JNI で使用できます。まだ変更しなければならない唯一のことは、main() の最後にある「exit()」です。

于 2013-03-09T01:16:33.730 に答える