11
votes

FFMPEG sur Android, des références non définies aux fonctions de LibavCodec, bien qu'elle soit listée sur la ligne de commande

J'ai un problème avec des références non résolues aux fonctions de LibavCodec de FFMPEG, jusqu'à présent, n'a pas réussi à trouver la réponse dans d'autres endroits (y compris mon esprit) :)

Permettez-moi de décrire ma configuration - il faut de l'espace, mais est vraiment basique, Il se peut que je ne puisse pas voir certaines erreurs ... p>

J'ai construit une FFMPEG avec NDK R5 Toolchain, Port FFMPEG J'ai eu de http://bambuser.com/opensource (comme recommandé dans d'autres questions ici). Il est bien construit, alors j'ai placé plusieurs bibliothèques statiques dans mon projet comme celle-ci: P>

/home/dimka/src/mobile/android/ffmpegtest/obj/local/armeabi/libavformat.a(allformats.o): In function `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 function `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 function `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 function `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/utils.c:1283: undefined reference to `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 reference to `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 reference to `av_dup_packet'
and so on...


2 commentaires

Y a-t-il une chance que votre code va être libéré à la source ouverte? Ou pouvez-vous simplement m'aider en fournissant une structure très basique (c'est-à-dire où mettre les fichiers .so ou .a, comment l'appeler dans l'application Android)? J'ai essayé votre procédure originale et la réponse ci-dessous, mais non plus. Merci pour des indices!


@slhck Peut-être que je pourrais vous envoyer un courriel avec Dir Android.MK et Zipped Dir, bien qu'il ne soit pas très complexe là-bas, écrivez-moi à Dimsuz à Gmail Com. Comme une alternative, je suppose que vous pouvez simplement poser une question spécifique ici, décrire votre problème, peut-être que quelqu'un trouvera une solution :)


3 Réponses :


2
votes

J'utilise FFMPEG pour un travail Android aussi. Je fais ma construction un peu différent cependant. Je prends les fichiers lib * .a et le dirgue Dir de la construction Bambuser.com et les incluent juste directement dans mon annuaire Jni, mon Android.MK ressemble à ceci:

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)


6 commentaires

Ce que j'ai aussi trouvé, c'est la phrase mystérieuse "NDK ne supporte pas la combinaison de bibliothèques statiques", mais je ne suis pas sûr de ce que cela signifie - dans les bibliothèques statiques finales ne sont que des collections de fichiers d'objet, donc si je les spécifie sur la ligne de commande, ils devrait être lié tous ensemble dans l'ordre spécifié. C'était le cas, mais cela n'a pas fonctionné pour une raison quelconque. Peut-être que je ne connais pas des détails :)


Hein, maintenant une autre chose. av_open_input_file renvoie -2 (aucun fichier ou répertoire de ce type ou répertoire) lorsque j'essaie d'ouvrir un fichier de /sdcard/myfile.mp4 (il existe sûrement, j'ai des autorisations dans AndroidManifest.xml, etc.). Avez-vous eu un tel problème peut-être, connaissez la solution? :)


En fait, oui. Si vous utilisez les valeurs par défaut de la version Bambuser.com, ils ont désactivé le protocole de fichier. Je l'ai activé dans la version que j'utilise, et je me réfère au fichier comme «fichier: /sdcard/myfile.mp4» dans mon code.


Oh, merci beaucoup! Je suppose que je vais recompiler avec le protocole de fichier activé et réessayez. Je suppose que cela prendrait beaucoup de temps pour le savoir sans votre allusion, merci! :)


Désolé de vous déranger à nouveau, mais je suis bloqué une fois de plus, Googling n'aide pas :) Le protocole de fichiers est maintenant activé, mais maintenant, je reçois une erreur -22 (données non valides trouvées lors du traitement de la saisie). J'essaie d'ouvrir un fichier MP4 - MP4 Decoder est activé également, essayé différents fichiers, même cette erreur. Vous avez peut-être vu quelque chose comme ça? :)


Vient de découvrir que av_find_input_format ("mpeg4") et av_find_input_format ("MP4") renvoie Null. Bien que j'ai clairement spécifié --enable-décodeur = mpeg4 et il est correctement activé dans config.h. Gratter ma tête ... :)



5
votes

L'Android.MK suivant fonctionne pour moi, y compris la manipulation de l'arc de la cible. Le résultat de la gestion du Bambuser Build.sh est copié de ... / Build / FFMPEG TO / JNI / LIB / FFMPEG. J'utilise prebuild_shared_library plutôt que prébuilt_static_library comme l'OP le faisait.

        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"


5 commentaires

Merci! Avez-vous réussi à faire jouer quelque chose? :) Parce qu'après que je l'ai compilée, je ne pars rien (voir mon dernier commentaire à la réponse ci-dessus)


Oui. Je devais activer le protocole de fichiers et le codec / démonteur que mon fichier utilisait. La configure de Bambuser désactive tous les couple de codecs qu'ils utilisent.


Aha. Je soupçonne que cela pourrait être mon problème. J'ai essayé d'activer le codec MP4 et d'ouvrir le fichier MP4, mais cela ne s'ouvrira pas. J'ai commencé à penser que je dois peut-être que plus de codecs peut-être peut-être même d'essayer de tous les activer :) Avez-vous activé des spécifiques ou tous?


Je viens d'activer ceux dont j'avais besoin. Vous aurez besoin du protocole de fichiers avec le 264 Demuxer et le décodeur 264 et peut-être deux autres choses par essai et erreurs. Faire ./configure - help puis essayez les options -List-XYZ pour savoir ce qui est disponible.


Quel nom de paquet ?! Je n'ai pas encore de projet Android! Je veux juste compiler FFMPEG pour le bras! C'est bon dans Ubuntu, mais dans Windows, j'obtiens cette erreur: "Option inconnue" =Neame-Prefix = / Data / Data / Com.Bambuser.Broadcaster / lib / ""



0
votes

Lorsque vous construisez FFMPEG doit utiliser Android-14 ou plus bas, comme celui-ci:

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


0 commentaires