222 votes

FFMPEG sur Android

J'ai FFMPEG compilé (libffmpeg.donc) sur Android. Maintenant, je dois buld soit une application comme RockPlayer ou utiliser les android MM cadre d'invoquer FFMPEG.

  1. Avez-vous des mesures / procédures / code / exemple sur l'intégration de FFMPEG sur Android / StageFright?

  2. Pouvez-vous svp me guider sur comment puis-je utiliser cette bibliothèque pour les MM de la lecture?

  3. J'ai une exigence où je l'ai déjà Audio et Vidéo TS, j'ai besoin de les nourrir à FFMPEG et obtenir décodé / rendu. Comment puis-je le faire sur Android, depuis IOMX api sont OMX et ne peut plug-in FFMPEG ici.

  4. Aussi je ne pouvais pas trouver de la documentation sur le FFMPEG api qui doivent être utilisés pour la lecture.

Pouvez vous s'il vous plaît m'aider avec ces questions et à me faire sur ce point? Votre aide est grandement appréciée.

111voto

yonilevy Points 2106

Voici les étapes que j'ai passées dans l'obtention de ffmpeg pour travailler sur Android:

  1. Construire des bibliothèques statiques de ffmpeg pour Android. Ceci a été réalisé par la construction d'olvaffe de ffmpeg android port (libffmpeg) à l'aide de l' Androïde de Système de construction. Il suffit de placer les sources dans /externe et make loin. Vous aurez besoin d'extraire bionique(libc) et de zlib(libz) à partir de l'Android construire ainsi, comme ffmpeg bibliothèques dépendent.
  2. Créer une bibliothèque dynamique enveloppant ffmpeg fonctionnalités à l'aide de l'Android NDK. Il y a beaucoup de documentation sur la façon de travailler avec le NDK. Fondamentalement, vous aurez besoin d'écrire du code C/C++ pour exporter les fonctionnalités dont vous avez besoin de ffmpeg dans une bibliothèque java peuvent interagir par le biais de JNI. Le NDK vous permet de lier facilement contre les bibliothèques statiques que vous avez créé à l'étape 1, il suffit d'ajouter une ligne semblable à celui d'Android.mk: LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz

  3. Utiliser le ffmpeg-habillage dynamique de la bibliothèque de vos sources java. Il y a assez de documentation sur la JNI là, vous devriez être bien.

Concernant l'utilisation de ffmpeg pour la lecture, il existe de nombreux exemples (le ffmpeg binaire lui-même est un bon exemple), voiciun tutoriel de base. La meilleure documentation peut être trouvée dans les en-têtes.

Bonne chance :)

73voto

mk.. Points 2087

Pour diverses raisons, le Multimédia a été et n'est jamais facile en termes de réalisation de la tâche, sans compromis sur l'efficacité. ffmpeg est un effort pour l'améliorer de jour en jour. Il prend en charge différents formats de codecs et conteneurs.

Maintenant pour répondre à la question de savoir comment utiliser cette bibliothèque, je dirais qu'il n'est pas si simple de l'écrire ici. Mais je peux vous guider dans l' une des manières suivantes.

1) à l'Intérieur du répertoire ffmpeg de code source, vous avez output_example.c ou api_example.c. Ici, vous pouvez voir le code, le cas de l'encodage/décodage est fait. Vous aurez une idée de ce qui l'API à l'intérieur de ffmpeg, vous devriez suivre. Ce serait la première étape.

2) Dolphin player est un projet open source pour Android. Actuellement, il est d'avoir des bugs, mais les développeurs travaillent en permanence. Dans ce projet, vous avez l'ensemble de l'installation de prêt qui vous permet de continuer votre enquête. Voici un lien vers le projet de code.google.com ou exécutez la commande "git clone https://code.google.com/p/dolphin-player/" dans un terminal. Vous pouvez voir deux projets nommés P et P86 . Vous pouvez utiliser l'un ou l'autre.

Autre conseil, je tiens à offrir, c'est que lorsque vous générez le code de ffmpeg, à l'intérieur de build.sh vous devez activer les conteneurs/demuxers/codeurs/décodeurs des formats que vous souhaitez utiliser. Sinon le code correspondant ne seront pas inclus dans les bibliothèques. Il a fallu beaucoup de temps pour me rendre compte de cela. Donc la pensée de le partager avec vous.

Quelques Principes De Base : Lorsque nous disons qu'un fichier vidéo, ex : avi, c'est une combinaison à la fois de l'audio et de la vidéo

Fichier vidéo = Vidéo + Audio


Vidéo = Codec + Multiplexeur + Demuxer

codec = codeur + Décodeur

=> Vidéo = codeur + décodeur + Multiplexeur + Demuxer(Mpeg4 + Mpeg4 + avi +avi - Exemple de conteneur avi)


Audio = Codec + Multiplexeur + Demuxer

codec = codeur + Décodeur

=> Audio = codeur + décodeur + Multiplexeur + Demuxer(mp2 + mp2 + avi + avi - Exemple de conteneur avi)


Codec(le nom est deriverd à partir d'une combinaison de fr*co*der/*dec*oder) est juste une partie de la forme qui définit les algorithmes utilisés pour encoder/décoder une image. AVI n'est pas un codec, c'est un récipient qui utilise la Vidéo codec Mpeg4 codec Audio et de mp2.

Multiplexeur/demuxer est utilisé pour combiner séparer les images à partir d'un fichier utilisé lors de l'encodage/décodage.

Donc, si vous souhaitez utiliser le format avi, vous devez activer les composants Vidéo + Audio composants.

Ex, pour avi, vous devez activer le. Encodeur mpeg4, mpeg4 décodeur, mp2 codeur, mp2 décodeur, avi format, avi demuxer.

phewwwwwww...

Par programmation build.sh doit contenir le code suivant:

--enable-muxer=avi --enable-demuxer=avi (Generic for both audio/video. generally Specific to a container)
--enable-encoder=mpeg4 --enable-decoder=mpeg4(For video support)
--enable-encoder=mp2 --enable-decoder=mp2 (For Audio support)

De l'espoir, je idid pas vous embrouiller plus après tout cela...

Merci, à Toute l'assistance nécessaire, s'il vous plaît laissez-moi savoir.

13voto

Guy Points 5270

Le plus facile à construire, la mise en œuvre facile à utiliser, j’ai trouvé est faite par l’équipe de theguardianproject : https://github.com/guardianproject/android-ffmpeg

11voto

Nick Points 6732

J'ai fait un petit projet pour configurer et construire X264 et FFMPEG à l'aide de l'Android NDK. La principale chose qui manque est un décent JNI interface pour la rendre accessible via Java, mais c'est la partie facile (relativement). Quand je suis toute à faire l'interface JNI bon pour mon propre usage, je vais les pousser que dans.

L'avantage sur olvaffe du système de construction est qu'il ne nécessite pas d'Android.mk fichiers pour créer les bibliothèques, il utilise juste le régulier makefiles et la chaîne de compilation. Cela le rend beaucoup moins susceptibles d'arrêter de travailler quand vous tirez nouveau changement de FFMPEG ou X264.

https://github.com/halfninja/android-ffmpeg-x264

3voto

dentex Points 706

Inspiré par de nombreux autres FFmpeg sur Android implémentations (principalement le guadianproject), j'ai trouvé une solution (avec Lame de soutien aussi).

(boiteux et FFmpeg: https://github.com/intervigilium/liblame et http://bambuser.com/opensource)

pour appeler FFmpeg:

new Thread(new Runnable() {

    @Override
    public void run() {

        Looper.prepare();

        FfmpegController ffmpeg = null;

        try {
            ffmpeg = new FfmpegController(context);
        } catch (IOException ioe) {
            Log.e(DEBUG_TAG, "Error loading ffmpeg. " + ioe.getMessage());
        }

        ShellDummy shell = new ShellDummy();
        String mp3BitRate = "192";

        try {
            ffmpeg.extractAudio(in, out, audio, mp3BitRate, shell);
        } catch (IOException e) {
            Log.e(DEBUG_TAG, "IOException running ffmpeg" + e.getMessage());
        } catch (InterruptedException e) {
            Log.e(DEBUG_TAG, "InterruptedException running ffmpeg" + e.getMessage());
        }

        Looper.loop();

    }

}).start();

et pour gérer la sortie de la console:

private class ShellDummy implements ShellCallback {

    @Override
    public void shellOut(String shellLine) {
        if (someCondition) {
            doSomething(shellLine);
        }
        Utils.logger("d", shellLine, DEBUG_TAG);
    }

    @Override
    public void processComplete(int exitValue) {
        if (exitValue == 0) {
            // Audio job OK, do your stuff: 

                            // i.e.             
                            // write id3 tags,
                            // calls the media scanner,
                            // etc.
        }
    }

    @Override
    public void processNotStartedCheck(boolean started) {
        if (!started) {
                            // Audio job error, as above.
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X