FFMpeg auf Android, undefined Verweise auf libavcodec Funktionen, obwohl es auf Befehlszeile aufgeführt ist

Ich habe ein Problem mit ungelösten Verweisen auf die libavcodec-Funktionen von ffmpeg, die bisher nicht die Antwort an anderen Orten (einschließlich meines Verstandes) gefunden haben 🙂

Lassen Sie mich beschreiben mein Setup – es braucht Platz, aber ist wirklich einfach, könnte es sein, dass ich versuche, etwas Fehler zu sehen …

Ich habe eine FFMPeg mit ndk r5 Toolchain, ffmpeg Port Ich habe von http://bambuser.com/opensource (wie in anderen Fragen hier empfohlen). Es baute gut, also habe ich mehrere statische Bibliotheken in mein Projekt wie folgt:

<project>/jni/bambuser_ffmpeg/libavcodec.a <project>/jni/bambuser_ffmpeg/libavformat.a <project>/jni/bambuser_ffmpeg/libavcore.a <project>/jni/bambuser_ffmpeg/libavutil.a 

Als nächstes habe ich eine Android.mk im Ordner bambuser_ffmpeg erstellt, um diese libs als vorgefertigte aufzulisten:

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := bambuser-libavcore LOCAL_SRC_FILES := libavcore.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := bambuser-libavformat LOCAL_SRC_FILES := libavformat.a include $(PREBUILT_STATIC_LIBRARY) (same for other two libs) 

Als nächstes habe ich ein anderes Modul, das auf diese libs in seinem Android.mk verweist, einrichten Pfade, etc:

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := ffmpegtest LOCAL_STATIC_LIBRARIES := bambuser-libavcodec bambuser-libavcore bambuser-libavformat bambuser-libavutil LOCAL_SRC_FILES := ffmpeg_test.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH)/../bambuser_ffmpeg/include LOCAL_LDLIBS := -llog -lz include $(BUILD_SHARED_LIBRARY) 

Und schließlich habe ich meine ffmpeg_test.cpp was wirklich einfach ist, wie folgt:

 #include <jni.h> extern "C" { #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> } extern "C" { JNIEXPORT jint JNICALL Java_com_the7art_ffmpegtest_PaintThread_testFFMpeg(JNIEnv* env, jobject obj, jstring fileName); } JNIEXPORT jint JNICALL Java_com_the7art_ffmpegtest_PaintThread_testFFMpeg(JNIEnv* env, jobject obj, jstring fileName) { av_register_all(); return 0; } 

Wenn ich ndk-build laufe , kompiliert es gut, aber beim Verknüpfen druckt es einen ungelösten Verweis auf fast jede Funktion in libavcodec . Sieht aus wie nur die Funktionen dieses libs befinden sich nicht:

/home/dimka/src/mobile/android/ffmpegtest/obj/local/armeabi/libavformat.a(allformats.o): In der Funktion av_register_all': /home/dimka/work/suzy/tmp/ffmpeg-android/ffmpeg/libavformat/allformats.c:47: undefined reference to avcodec_register_all '/home/dimka/src/mobile/android/ffmpegtest/obj/local/armeabi/libavformat.a(utils.o): In der Funktion parse_frame_rate': /home/dimka/work/suzy/tmp/ffmpeg-android/ffmpeg/libavformat/utils.c:3240: undefined reference to av_parse_video_rate '/home/dimka/src/mobile/android/ffmpegtest/obj/local/armeabi/libavformat.a(utils .o): In der Funktion parse_image_size': /home/dimka/work/suzy/tmp/ffmpeg-android/ffmpeg/libavformat/utils.c:3234: undefined reference to av_parse_video_size' / home / dimka / src / mobile / android / Ffmpegtest / obj / local / armeabi / libavformat.a (utils.o): In der Funktion flush_packet_queue': /home/dimka/work/suzy/tmp/ffmpeg-android/ffmpeg/libavformat/utils.c:1277: undefined reference to Av_free_packet '/ home / dimka / work / suzy / tmp / ffmpeg-android / ffmpeg / libavformat / uti Ls.c: 1283: undefined Verweis auf av_free_packet' /home/dimka/src/mobile/android/ffmpegtest/obj/local/armeabi/libavformat.a(utils.o): In function get_audio_frame_size': / home / dimka / work /suzy/tmp/ffmpeg-android/ffmpeg/libavformat/utils.c:766: undefined Verweis auf av_get_bits_per_sample' /home/dimka/src/mobile/android/ffmpegtest/obj/local/armeabi/libavformat.a(utils.o): In function ff_interleave_add_packet ': /home/dimka/work/suzy/tmp/ffmpeg-android/ffmpeg/libavformat/utils.c:2909: undefined Verweis auf `av_dup_packet'

und so weiter…

Ich verstehe nicht, warum das passiert. Ich habe versucht ndk-Build V = 1 zu überprüfen, die tatsächliche Verknüpfung Befehl, und libavcodec sitzt dort perfekt richtig, wie es sollte. Alle anderen ffmpeg libs sind auch da.

Irgendwelche Hinweise?

  • Zeigen Sie zwei Videos zusammen und dann als zusammengeführtes Video auf einem einzigen Bildschirm aus
  • Festlegen von Video-Stream-Metadaten mit Ffmpeg
  • Android: Wie konfiguriere ich FFMPEG neueste Version im Android Studio?
  • Addieren Sie verschiedene Animation für verschiedene Rahmen im Video mit ffmpeg android
  • Wie baut man FFMPEG für alle Architektur von Android-Gerät?
  • Wie zu bauen und verwenden ffmpeg innerhalb Android
  • Screenshot des Nexus One von adb?
  • Erkennung der Orientierung eines aufgezeichneten Videos in Android
  • 3 Solutions collect form web for “FFMpeg auf Android, undefined Verweise auf libavcodec Funktionen, obwohl es auf Befehlszeile aufgeführt ist”

    Ich habe mit ffmpeg für einige Android-Arbeit zu verwenden. Ich mache mir ein bisschen anders. Ich nehme die lib * .a Dateien und das Include-Verzeichnis aus dem bambuser.com-Build und direkt direkt in mein jni-Verzeichnis ein, mein Android.mk sieht so aus:

     LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := ndk1 LOCAL_SRC_FILES := native.c LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_LDLIBS := -L$(NDK_PLATFORMS_ROOT)/$(TARGET_PLATFORM)/arch-arm/usr/lib -L$(LOCAL_PATH) -lavformat -lavcodec -lavdevice -lavfilter -lavutil -lswscale -llog -ljnigraphics -lz -ldl -lgcc include $(BUILD_SHARED_LIBRARY) 

    Es könnte ein paar cruft dort sein, aber vielleicht wird es helfen, Sie in die richtige Richtung zu zeigen. Ich habe versucht, einige der Formulare in den NDK Beispielprojekten wie Sie haben angelegt. Bündelung der libs in ein Modul und dann referenziert das. Aber am Ende fiel zurück auf die einfache direkte einschließen nur, um die Dinge zu arbeiten, und bisher hatte nicht Grund, es wieder zu besuchen.

    Die folgende Android.mk arbeitet für mich, einschließlich der Handhabung des Zielbogens. Das Ergebnis der Ausführung des bambuser build.sh wird von … / build / ffmpeg zu / jni / lib / ffmpeg kopiert. Ich benutze PREBUILD_SHARED_LIBRARY anstatt PREBUILT_STATIC_LIBRARY wie das OP hat.

     LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libavcodec LOCAL_SRC_FILES := lib/ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/lib/ffmpeg/$(TARGET_ARCH_ABI)/include include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libavcore LOCAL_SRC_FILES := lib/ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/lib/ffmpeg/$(TARGET_ARCH_ABI)/include include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libavdevice LOCAL_SRC_FILES := lib/ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/lib/ffmpeg/$(TARGET_ARCH_ABI)/include include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libavfilter LOCAL_SRC_FILES := lib/ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/lib/ffmpeg/$(TARGET_ARCH_ABI)/include include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libavformat LOCAL_SRC_FILES := lib/ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/lib/ffmpeg/$(TARGET_ARCH_ABI)/include include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libavutil LOCAL_SRC_FILES := lib/ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/lib/ffmpeg/$(TARGET_ARCH_ABI)/include include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libswscale LOCAL_SRC_FILES := lib/ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/lib/ffmpeg/$(TARGET_ARCH_ABI)/include include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := mynativecode LOCAL_SRC_FILES := native.c LOCAL_SHARED_LIBRARIES := libavcore libavdevice libavfilter libavutil libswscale libavformat LOCAL_LDLIBS := -L$(NDK_PLATFORMS_ROOT)/$(TARGET_PLATFORM)/arch-arm/usr/lib \ -L$(LOCAL_PATH)/lib/ffmpeg/$(TARGET_ARCH_ABI)/lib \ -lavcore \ -lavformat \ -lavcodec \ -lavdevice \ -lavfilter \ -lavutil \ -lswscale \ -llog \ -lz \ -ldl \ -lgcc include $(BUILD_SHARED_LIBRARY) 

    Ich musste auch die bambuser build.sh ändern, um das –soname-prefix-Argument zu ändern, um meinen Paketnamen anstatt Bambusers einzuschließen.

      FLAGS="--target-os=linux --cross-prefix=arm-linux-androideabi- --arch=arm" FLAGS="$FLAGS --sysroot=$SYSROOT" - FLAGS="$FLAGS --soname-prefix=/data/data/com.bambuser.broadcaster/lib/" + FLAGS="$FLAGS --soname-prefix=/data/data/<my package name here>/lib/" FLAGS="$FLAGS --enable-shared --disable-symver" FLAGS="$FLAGS --enable-small --optimization-flags=-O2" 

    Wenn du baut ffmpeg sollte Android-14 oder niedriger, wie folgt:

     export NDK=/Users/luoye/Downloads/android-ndk-r11c export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt export PLATFORM=$NDK/platforms/android-8/arch-arm export PREFIX=../simplefflib build_one(){ ./configure --target-os=linux --prefix=$PREFIX \ --enable-cross-compile \ --enable-runtime-cpudetect \ --disable-asm \ --arch=arm \ --cc=$PREBUILT/darwin-x86_64/bin/arm-linux-androideabi-gcc \ --cross-prefix=$PREBUILT/darwin-x86_64/bin/arm-linux-androideabi- \ --disable-stripping \ --nm=$PREBUILT/darwin-x86_64/bin/arm-linux-androideabi-nm \ --sysroot=$PLATFORM \ --enable-gpl --enable-shared --disable-static --enable-small \ --disable-ffprobe --disable-ffplay --disable-ffmpeg --disable-ffserver --disable-debug \ --extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors - Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a" } build_one make make install 
    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.