web-dev-qa-db-fra.com

FFmpeg sur Android

J'ai compilé FFmpeg (libffmpeg.so) sur Android. Maintenant, je dois créer une application comme RockPlayer ou utiliser le cadre multimédia existant Android pour appeler FFmpeg.

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

  2. Pouvez-vous s'il vous plaît me guider sur comment puis-je utiliser cette bibliothèque pour la lecture multimédia?

  3. J'ai une exigence pour laquelle j'ai déjà des flux de transport audio et vidéo, que je dois transmettre à FFmpeg et le faire décoder/restituer. Comment puis-je faire cela sur Android, car les API IOMX sont basées sur OMX et ne peuvent pas brancher FFmpeg ici?

  4. De plus, je n'ai pas trouvé de documentation sur les API FFmpeg qui doivent être utilisées pour la lecture.

199
Jag

Voici les étapes que j'ai suivies pour que ffmpeg fonctionne sur Android:

  1. Construisez des bibliothèques statiques de ffmpeg pour Android. Ceci a été réalisé en construisant le port ffmpeg Android d’olvaffe ( libffmpeg ) à l’aide du Android Build System . Il suffit de placer les sources sous/external et make. Vous devrez également extraire bionic (libc) et zlib (libz) de la version Android, car les bibliothèques ffmpeg en dépendent.
  2. Créez une bibliothèque dynamique enveloppant la fonctionnalité ffmpeg à l’aide de Android NDK . Il y a beaucoup de documentation sur la façon de travailler avec le NDK. En gros, vous devez écrire du code C/C++ pour exporter les fonctionnalités dont vous avez besoin hors de ffmpeg dans une bibliothèque Java avec laquelle vous pouvez interagir via JNI. Le NDK vous permet de créer facilement un lien avec les bibliothèques statiques que vous avez générées à l’étape 1; il suffit d’ajouter une ligne semblable à celle-ci dans Android.mk: LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz

  3. Utilisez la bibliothèque dynamique ffmpeg-wrapping à partir de vos sources Java. Il y a suffisamment de documentation sur JNI, ça devrait aller.

En ce qui concerne l'utilisation de ffmpeg pour la lecture, il existe de nombreux exemples (le binaire ffmpeg lui-même est un bon exemple), ici est un tutoriel de base. La meilleure documentation se trouve dans les en-têtes.

Bonne chance :)

105
yonilevy

Pour diverses raisons, le multimédia a été et n’est jamais facile en termes de réalisation de la tâche sans compromettre l’efficacité. ffmpeg est un effort pour l’améliorer jour après jour. Il supporte différents formats de codecs et de conteneurs.

Maintenant, pour répondre à la question de comment utiliser cette bibliothèque , je dirais que ce n'est pas le cas simple d'écrire ici. Mais je peux vous guider dans comme suit .

1) Dans le répertoire ffmpeg du code source, vous avez output_example.c ou api_example.c . Ici, vous pouvez voir le code où le codage/décodage est effectué. Vous aurez une idée de quelle API à l'intérieur de ffmpeg vous devriez appeler. Ce serait votre première étape.

2) Dolphin Player est un projet open source pour Android. Actuellement, il y a des bugs, mais les développeurs travaillent en permanence. Dans ce projet, vous avez toute la configuration prête que vous pouvez utiliser pour poursuivre 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.

Un conseil supplémentaire que je voudrais offrir est que lorsque vous construisez le code ffmpeg, dans build.sh, vous devez activer les multiplexeurs/démultiplexeurs/encodeurs/décodeurs des formats que vous souhaitez utiliser. Sinon, le code correspondant ne sera pas inclus dans les bibliothèques. Il m'a fallu beaucoup de temps pour m'en rendre compte. Alors pensé à le partager avec vous.

Quelques notions de base: Lorsque nous disons un fichier vidéo, ex: avi, il s’agit d’une combinaison de données audio et vidéo.

Fichier vidéo = Vidéo + Audio


Vidéo = Codec + Muxer + Demuxer

codec = codeur + décodeur

=> Vidéo = codeur + décodeur + multiplexeur + démultiplexeur (Mpeg4 + Mpeg4 + avi + avi - Exemple pour le conteneur avi)


Audio = Codec + Muxer + Demuxer

codec = codeur + décodeur

=> Audio = codeur + décodeur + multiplexeur + démodulateur (mp2 + mp2 + avi + avi - Exemple pour le conteneur avi)


Codec (le nom est dérivé d'une combinaison de en * co * der/* dec * oder) n'est qu'une partie du format qui définit les algorithmes utilisés pour encoder/décoder une image. AVI n’est pas un codec, c’est un conteneur qui utilise les codecs vidéo de Mpeg4 et audio de mp2.

Le multiplexeur/démultiplexeur est utilisé pour combiner/séparer les images d'un fichier utilisé lors du codage/décodage.

Donc, si vous voulez utiliser le format avi, vous devez activer les composants vidéo + les composants audio.

Ex, pour avi, vous devez activer les éléments suivants. mpeg4 encodeur, mpeg4 décodeur, mp2 encodeur, mp2 décodeur, avi muxer, avi demuxer.

phewwwwwww ...

Par programme, 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)

J'espère que je ne vous confondre plus après tout cela ...

Merci, Toute aide nécessaire, s'il vous plaît faites le moi savoir.

66
mk..

L’implémentation la plus facile et la plus facile à utiliser que j’ai trouvée est réalisée par l’équipeguardianproject: https://github.com/guardianproject/Android-ffmpeg

13
Guy

J'ai fait un petit projet pour configurer et construire X264 et FFMPEG en utilisant le Android NDK. La principale chose qui manque est une interface JNI décente pour la rendre accessible via Java, mais c'est la partie la plus facile (relativement). Lorsque je me permettrai de rendre l'interface JNI adaptée à mes propres besoins, j'insisterai pour cela.

L'avantage par rapport au système de construction d'Olvaffe est qu'il ne nécessite pas de fichiers Android.mk pour créer les bibliothèques, il utilise simplement les fichiers Makefiles classiques et la chaîne d'outils. Cela le rend beaucoup moins susceptible de cesser de fonctionner lorsque vous extrayez une nouvelle modification de FFMPEG ou X264.

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

11
Nick

Après de nombreuses recherches, voici la bibliothèque compilée la plus récente pour Android que j'ai trouvée:

https://github.com/bravobit/FFmpeg-Android

  • En ce moment utilise FFmpeg release n4.0-39-gda39990
  • Comprend FFmpeg et FFProbe
  • Contient l'interface Java pour lancer les commandes
  • FFprobe ou FFmpeg peuvent être supprimés de l'APK, consultez le wiki https://github.com/bravobit/FFmpeg-Android/wiki
8
Aracem

Pour créer mon application FFMPEG, j'ai utilisé ce projet ( https://github.com/hiteshsondhi88/ffmpeg-Android-Java ), je n'ai donc rien à compiler. Je pense que c'est le moyen le plus simple d'utiliser FFMPEG dans nos applications Android.

Plus d'infos sur http://hiteshsondhi88.github.io/ffmpeg-Android-Java/

6
jmartinalonso

Étrange que ce projet n'ait pas été mentionné: AndroidFFmpeg from Appunite

Il contient des instructions pas à pas assez détaillées pour copier/coller en ligne de commande, pour les paresseux comme moi))

3
Mixaz

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

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

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.
        }
    }
}
3
dentex

J'avais le même problème, j'ai trouvé la plupart des réponses périmées. J'ai fini par écrire un wrapper sur FFMPEG pour y accéder à partir de Android avec une seule ligne de code.

https://github.com/madhavanmalolan/ffmpegandroidlibrary

2
Madhavan Malolan