2013-02-25 2 views
7

私は簡単なやり方があります。私はアンドロイド環境で動作しているffmpegを使って、一連の写真をビデオにマージする必要があります。ライブラリとしてのアンドロイドでのffmpegの実行

コンパイルffmpegを実行する方法を説明するさまざまなチュートリアルとサンプルを使用して1週間以上にわたって戦った後、私は中期的な成功と言います。私は最終的にアンドロイド用のffmpegをコンパイルしました。

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

持って次のディレクトリ構造ffmpegの構築の結果:私の質問はどのようにある

#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 !"); 

} 

:私はJavaからCコードを実行しているので、私はまた、NDKの例を踏襲

[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 

を私の "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) 

もう1つ。 ffmpegの主な機能をラップする方法の例を見つけました。完全に欠けている Can FFmpeg be used as a library, instead of a standalone program?

要約すると、私は私の問題はに起因するものであると思う:それは私はffmpegののAPIを知らないsinse私のためのffmpegを使用する最も簡単な方法になるだろうと私はそれがこの方法をffmpegの実行することが可能です願っていますc/C++の知識、特に.soライブラリから任意の関数を使用する方法。

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

+0

[JavaCV](http://code.google.com/p/javacv/)にバンドルされているバイナリを試すことができます。それらを構築する方法についての指示もあります。 –

答えて

5

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

'JNI_Call ...' はリンクをご覧ください。それはアンドロイドから 'ffmpeg.main()'のラッパーを呼び出す方法です。

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

上記

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

これらのサンプルを調べると、他のプロジェクトの1つにffmpeg.main()をラッパーする方法を感じるはずです。この時点ではロガーの問題は解決されていないので、gitの最新の[android-ffmpeg]プロジェクトではffmpeg.cをそのまま使ってJNIで使うことができます。あなたが変えなければならない唯一の事は、main()の最後の 'exit()'です。

+0

こんにちはロバート、私はアンドロイドのためのffmpegのLGPL版をコンパイルしようとしており、このポストに従っています。しかし、私はmain()の最後にexit()を変えなければならないと言った理由を理解できません。ハーフニンジャプロジェクトでは、exit_program(0)はまだそこにあります。なぜそれを変更する必要がありますか、私はそれを変更する必要がありますか? – scooby

+0

ffmpegサブモジュールのhalfninjaバージョンは 'd0A2 ...'です。そのコミットを使用しています...いいえ。コメントはあなたとあなたのffmpegには当てはまりません。 –

+0

実際に私はビデオ圧縮にffmpegを使用しようとしています。しかし、あなたはmain()の最後でexitを変更する必要があると言いました。なぜそうする必要があるのでしょうか? ffmpeg.cのmain()をそのまま使用するとどうなるでしょうか。 ?? – scooby

関連する問題