0

写真ファイルと音声ファイルを取り、ビデオを作成する必要があります。私はそれが可能であることを知っています

Runtime.getRuntime().exec("ffmpeg -i image.jpeg -i audio.mp3 out.avi") 

ただし、ルート化されたデバイス専用であるため、ffmpeg.c から main() の JNI ラッパーを作成し、次のようにアクティビティから呼び出すようにしました: http://demo860.blogspot.com/2010/07/android-ffmpeg-動的モジュール jni.html

1.このコードは ffmpeg.c にあります:

int m_argc = 0;
char *m_pargv [30];

int dynamic_ffpmeg_main (int argc, char **argv);
jint JNICALL Java_com_ccmedia_codec_ffmpeg_mod_1run ( JNIEnv *, jclass, jstring,     jstring );

jint JNICALL Java_com_ccmedia_codec_ffmpeg_mod_1run ( JNIEnv *env, jclass class, jstring pj1, jstring pj2)
{
    // as in http://demo860.blogspot.com/2010/07/android-ffmpeg-dynamic-module-jni.html
}

int dynamic_ffpmeg_main(int argc, char **argv)
{
// as in http://demo860.blogspot.com/2010/07/android-ffmpeg-dynamic-module-jni.html
}

int main(int argc, char **argv)
{
    dynamic_ffpmeg_main ( argc, argv );
    return 0;
}

2.このコードは私の.javaにあります:

public class FFmpegCreator implements Runnable {

    static boolean m_bret = false;
static String m_szconfig = " -i /sdcard/file.mpg -vcodec mpeg4 aaa.mpg";

//public native String unimplementedStringFromJNI();

static {
    try {

        System.out.println("[AdDBCache] Module load try ffmpeg : "
                + System.getProperty("java.library.path"));

        // System.load("/sdcard/arm_and/bin/libffmpeg.so");

        System.loadLibrary("ffmpeg");

        System.out.println("[AdDBCache] Module load success");

    }

    catch (Exception e) {

        System.out.println("[AdDBCache] Module load err : "
                + System.getProperty("java.library.path"));

    }

}

private static synchronized final native int Java_com_ccmedia_codec_ffmpeg_mod_1run(String name, String sztoken);

public void set_config(String sz_config) {

    m_szconfig = sz_config;

}

public void run_core(String sz_file, String sz_token) {

    int n_stat;
    m_bret = false;
    n_stat = Java_com_ccmedia_codec_ffmpeg_mod_1run(m_szconfig, sz_token);
    m_bret = true;

}

public void run() {

    run_core("", "");

}
}

3.そしてこれは私の活動で:

FFmpegCreator f = new FFmpegCreator ();
new Thread(f).start();

しかし、私は持っています

E/AndroidRuntime(25682): java.lang.UnsatisfiedLinkError: Java_com_ccmedia_codec_ffmpeg_mod_1run .

なぜだか理解できません... FFmpeg ビルドは成功しました... 誰か助けてくれませんか? あなたが私を助けることができれば、私は本当に感謝します. ありがとうございました。

4

1 に答える 1

1

Java_com_ccmedia_codec_ffmpeg_mod_1run問題は、Java 側のネイティブ メソッドのネーミングです。Java_package... のすべての部分を除いて、通常のメソッド名を付けてください。次に、これを C 関数に一致させるには、メソッドが属するパッケージとクラスを使用する必要があります。これを行う最も確実な方法は、最初に Java 側を更新することです。

public class FFmpegCreator implements Runnable {
    // ...

    private static synchronized final native int mod_1run(String name, String sztoken);

    //...
}

次に、クラスでjavahを実行します。

$ javah -o FFmpegCreator.h -classpath bin/classes com.yourpackage.FFmpegCreator

bin/classes( .class ファイルがコンパイルされているディレクトリと、その中com.yourpackageにあるパッケージに置き換えFFmpegCreatorます)。生成された を見るとFFmpegCreator.h、ネイティブ メソッドの正しい署名が含まれています。

于 2013-03-12T22:10:09.113 に答える