私はやるべき簡単な仕事を持っています。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 ライブラリから関数を実行する方法についてです。
誰かが私を助けてくれることを願っています:)。