FFmpeg sur Android

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

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

  2. pouvez-vous me guider sur la façon dont je peux utiliser cette bibliothèque pour la lecture multimédia?

  3. j'ai une exigence où j'ai déjà des flux de transport audio et vidéo, que j'ai besoin de transmettre à FFmpeg et de le décoder / rendre. Comment puis-je le faire sur Android, puisque les API IOMX sont basées sur OMX et ne peuvent pas se brancher sur FFmpeg ici?

  4. aussi je n'ai pas pu trouver de documentation sur les API FFmpeg qui doivent être utilisés pour la lecture.

189
demandé sur Cornstalks 2011-01-18 18:18:15

9 réponses

Voici les étapes que j'ai traversé pour obtenir ffmpeg de travailler sur Android:

  1. construire des bibliothèques statiques de ffmpeg pour Android. Cela a été réalisé en construisant le port android ffmpeg d'olvaffe ( libffmpeg ) en utilisant le Android Build System . Il suffit de placer les sources sous /externe et make loin. Vous aurez besoin d'extraire bionic(libc) et zlib(libz) de la construction Android ainsi, que les bibliothèques ffmpeg en dépendent.
  2. créer une bibliothèque dynamique enveloppant la fonctionnalité ffmpeg à 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 la fonctionnalité dont vous avez besoin à partir de ffmpeg dans une bibliothèque avec laquelle java peut interagir via JNI. Le NDK vous permet de lier facilement avec les bibliothèques statiques que vous avez générées à l'étape 1, ajoutez juste une ligne similaire à à Androïde.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 assez de documentation sur JNI là-bas, ç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:)

101
répondu yonilevy 2011-01-27 18:26:35

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 de jour en jour. Il prend en charge différents formats de codecs et conteneurs.

Maintenant, pour répondre à la question de comment utiliser cette bibliothèque , je dirais qu'il n'est pas si simple de l'écrire ici. Mais je peux vous guider dans en suivant les chemins .

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ù l'encodage/décodage est fait. Vous aurez une idée de l'API à l'intérieur de ffmpeg que 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 continuellement. Dans ce projet, vous avez toute la configuration prête que vous pouvez utiliser pour continuer votre enquête. Voici un lien vers le projet de code.google.com ou lancez la commande" clone git 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.

conseil supplémentaire que je voudrais offrir est que lorsque vous construisez le code ffmpeg, à l'intérieur build.sh vous devez activer les muxers/demuxers/encoders / décodeurs des formats que vous voulez utiliser. Sinon le code correspondant ne seront pas inclus dans les bibliothèques. Il m'a fallu beaucoup de temps pour m'en rendre compte. Donc la pensée de le partager avec vous.

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

Fichier Vidéo = Vidéo + Audio


Video = Codec + Muxer + Demuxer

codec = codeur + Décodeur

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


Audio = Codec + Muxer + Demuxer

codec = codeur + Décodeur

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


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

Muxer / demuxer est utilisé pour combiner/séparer les cadres d'un fichier utilisé lors de l'encodage/décodage.

donc si vous voulez utiliser le format avi, Vous devez activer les composants Vidéo + composants Audio.

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

phewwwwww...

Programmatiquement 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)

Hope i did not vous confondez plus après tout cela...

Merci, toute l'aide nécessaire, s'il vous plaît laissez-moi savoir.

62
répondu mk.. 2012-05-03 05:36:50

la mise en œuvre la plus facile à construire, la plus facile à utiliser que j'ai trouvée est faite par l'équipe de projet de la Guardia: https://github.com/guardianproject/android-ffmpeg

11
répondu Guy 2012-10-31 11:15:18

j'ai fait un petit projet pour configurer et construire X264 et FFMPEG en utilisant le NDK Android. La principale chose qui manque est une interface JNI décente pour la rendre accessible via Java, mais c'est la partie facile (relativement). Quand j'aurai fait en sorte que L'interface JNI soit bonne pour mes propres besoins, je vais pousser ça.

l'avantage sur le système de construction d'olvaffe est qu'il ne nécessite pas Android.les fichiers mk pour construire les bibliothèques, il utilise juste les makefiles réguliers et les de la chaîne. Cela le rend beaucoup moins susceptible de cesser de travailler lorsque vous tirez nouveau changement de FFMPEG ou X264.

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

10
répondu Nick 2011-06-24 11:33:30

pour faire mon application FFMPEG j'ai utilisé ce projet ( https://github.com/hiteshsondhi88/ffmpeg-android-java ) donc, je n'ai pas à compiler quoi que ce soit. Je pense que C'est le moyen facile d'utiliser FFMPEG dans nos applications Android.

plus d'information sur http://hiteshsondhi88.github.io/ffmpeg-android-java/

5
répondu jmartinalonso 2015-05-18 18:02:04

inspiré par beaucoup D'autres FFmpeg sur les implémentations Android là-bas (principalement le guadianproject ), j'ai trouvé une solution (avec support boiteux aussi).

(lame 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.
        }
    }
}
3
répondu dentex 2013-09-21 17:54:52

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

Il est assez détaillé, étape par étape les instructions pour copier/coller de la ligne de commande, pour les paresseux comme moi ))

2
répondu Mixaz 2014-11-28 15:04:40

j'ai eu le même problème, j'ai trouvé le plus de réponses ici désuètes. J'ai fini par écrire un wrapper sur FFMPEG pour accéder à partir D'Android avec une seule ligne de code.

https://github.com/madhavanmalolan/ffmpegandroidlibrary

1
répondu Madhavan Malolan 2017-10-27 11:12:49

Dans les paramètres système > à propos du téléphone> informations juridiques > système de webview licences, il semble ffmpeg est inclus en tant que partie du système d'exploitation Android (8.0.0, Nexus 5X). Ce serait génial que nous puissions y accéder au lieu d'en être un autre nous-mêmes.

license page in Android

-1
répondu hyiltiz 2017-12-01 00:57:29