L'exécution de ffmpeg, de la bibliothèque dans android
J'ai une tâche simple à faire. J'ai besoin de fusionner ensemble d'images en une vidéo à l'aide de ffmpeg de travail dans l'environnement android.
Après plus d'une semaine de combats avec les différents tutoriels et des exemples expliquant comment exécuter compiler ffmpeg, j'ai, disons, moyen de succès. J'ai enfin compilé ffmpeg pour android.
J'ai suivi cet exemple:
https://github.com/appunite/AndroidFFmpeg
ce qui fonctionne le mieux pour moi.
La suite de la construction de ffmpeg ont un structure de répertoire suivante:
[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
J'ai également suivi le ndk exemples donc, j'ai l'exécution de code c à partir de java:
#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 !");
}
Ma question est comment faire pour exécuter la fonction de ffmpeg de mon "bonjour-jni" c-fichier. Je l'ai lu, j'ai besoin d'écrire un wrapper sur ffmpeg qui à mon salut-jni est destiné à être.
Voici mon Android.mk, ce qui est probablement importation de la partie pour atteindre mon objectif, mais honnêtement, je ne comprends pas certaines lignes définies dans ce fichier. Ou tout simplement je ne sais pas comment faire fonctionner les choses.
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)
Une chose de plus. J'ai trouvé un exemple sur la façon d'envelopper ffmpeg fonction principale. Ce serait le moyen le plus facile à utiliser ffmpeg pour moi, matures, je ne sais pas ffmpeg api et j'espère que c'est possible d'exécuter ffmpeg de cette façon:
Peut FFmpeg être utilisé comme une bibliothèque, au lieu d'un programme autonome?
Pour résumer, je pense que mes problèmes sont dus au manque complètement de c/c++ connaissances à tous, en particulier comment utiliser exécuter n'importe quelle fonction .si la bibliothèque.
J'espère que quelqu'un pourra m'aider :).
ce sur arrêt/annulation de l'exécution? connaissez-vous une solution comment arrêter FFmpeg après avoir appelé ffmpeg fonction principale?
OriginalL'auteur szakal | 2013-02-25
Vous devez vous connecter pour publier un commentaire.
https://github.com/halfninja/android-ffmpeg-x264/blob/master/Project/jni/videokit/uk_co_halfninja_videokit_Videokit.c
Look à la 'JNI_Call..." dans le lien ci-dessus. C'est comment appeler le wrapper pour 'ffmpeg.main()' a partir de android.
https://github.com/halfninja/android-ffmpeg-x264/blob/master/Project/jni/videokit/ffmpeg.c
utiliser le lien ci-dessus et de trouver des 'main()' à la fin. C'est par exemple très légèrement modifié la version de ffmpeg.c (logger modifié pour java/android ndk).
Si vous l'étude de ces échantillons , vous devriez obtenir une sensation pour savoir comment wrapper ffmpeg.main() dans l'un des autres projets, si vous souhaitez l'utiliser. L'enregistreur question est sans objet à ce stade, de sorte que le plus moderne [android-ffmpeg] projets sur git peut juste faire ffmpeg.c hors de la boîte et de l'utiliser avec JNI. La seule chose que u peut encore changer, c'est la "exit ()" à la fin de main().
le halfninja version de ffmpeg sous-module est " d0A2...' u en utilisant qui s'engagent ... NON . si le commentaire ne s'applique pas à vous et à votre ffmpeg.
En fait, je suis en train d'utiliser ffmpeg pour la compression vidéo. Mais puisque vous avez mentionné que j'ai besoin de changer la sortie à la fin de main(), qui est la raison pour laquelle je me demande pourquoi j'ai besoin de le faire? quelles pourraient être les conséquences si j'utilise ffmpeg.c main() comme il est. ??
github.com/halfninja/android-ffmpeg-x264/blob/master/Project/... c'est la sortie j'ai fait référence. Ce n'était pas dans la première version du code à l'époque et ont été nécessaires pour obtenir un nettoyage de sortie et lib décharger à l'intérieur d'android jni de la pile.
OriginalL'auteur Robert Rowntree