FFmpeg auf Android

Lesezeit: 8 Minuten

FFmpeg auf Android
Jag

Ich habe FFmpeg kompiliert (libffmpeg.so) auf Android. Jetzt muss ich entweder eine Anwendung wie RockPlayer erstellen oder das vorhandene Android-Multimedia-Framework verwenden, um FFmpeg aufzurufen.

  1. Haben Sie Schritte / Verfahren / Code / Beispiel zur Integration von FFmpeg auf Android / StageFright?

  2. Können Sie mir bitte erklären, wie ich diese Bibliothek für die Multimedia-Wiedergabe verwenden kann?

  3. Ich habe eine Anforderung, bei der ich bereits Audio- und Video-Transportströme habe, die ich in FFmpeg einspeisen und decodiert / gerendert bekommen muss. Wie kann ich dies auf Android tun, da IOMX-APIs OMX-basiert sind und FFmpeg hier nicht einbinden können?

  4. Außerdem konnte ich keine Dokumentation zu den FFmpeg-APIs finden, die für die Wiedergabe verwendet werden müssen.

  • das ist interessant, ich bin auch neugierig

    – Axarydax

    19. Januar 2011 um 15:15 Uhr

  • Wie haben Sie ffmpeg kompiliert, um .so-Dateien zu erhalten? kannst du bitte die Schritte teilen, die du befolgt hast. Ich arbeite unter Windows mit cygwin-1.7.9 und ndk r5. Bitte hilf mir.

    – Swathi EP

    20. September 2011 um 6:46 Uhr

  • Hier ist ein relativ neues FFmpeg für Android: sourceforge.net/projects/ffmpeg4android

    – schlau

    5. Oktober 2012 um 9:46 Uhr

  • @slhck Ich habe den ffmpeg-Code vom obigen Link heruntergeladen und versucht, ihn zu kompilieren, aber ich kann die .so-Dateien nicht abrufen. es zeigt viele Probleme ..

    – RAJESCH

    20. November 2012 um 10:34 Uhr

  • Bitte helfen Sie mir mit: stackoverflow.com/questions/14157030/…, ich weiß nicht, wo ich diese Funktion einfügen und ausführen soll! …..

    – Tharaka Nirmana

    15. Januar 2013 um 6:27 Uhr

Hier sind die Schritte, die ich durchlaufen habe, um ffmpeg auf Android zum Laufen zu bringen:

  1. Erstellen Sie statische Bibliotheken von ffmpeg für Android. Dies wurde durch den Aufbau des ffmpeg-Android-Ports von olvaffe erreicht (libffmpeg) Verwendung der Android-Build-System. Legen Sie einfach die Quellen unter /external und make Weg. Sie müssen auch bionic(libc) und zlib(libz) aus dem Android-Build extrahieren, da ffmpeg-Bibliotheken davon abhängen.
  2. Erstellen Sie mithilfe von Android eine dynamische Bibliothek, die die ffmpeg-Funktion umschließt NDK. Es gibt eine Menge Dokumentation darüber, wie man mit dem NDK arbeitet. Grundsätzlich müssen Sie C/C++-Code schreiben, um die benötigte Funktionalität aus ffmpeg in eine Bibliothek zu exportieren, mit der Java über JNI interagieren kann. Mit dem NDK können Sie problemlos mit den statischen Bibliotheken verknüpfen, die Sie in Schritt 1 generiert haben. Fügen Sie einfach eine ähnliche Zeile wie diese zu Android.mk hinzu: LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz

  3. Verwenden Sie die dynamische ffmpeg-Wrapping-Bibliothek aus Ihren Java-Quellen. Es gibt genügend Dokumentation zu JNI da draußen, es sollte Ihnen gut gehen.

In Bezug auf die Verwendung von ffmpeg für die Wiedergabe gibt es viele Beispiele (die ffmpeg-Binärdatei selbst ist ein gutes Beispiel). Hierist ein grundlegendes Tutorial. Die beste Dokumentation finden Sie in den Kopfzeilen.

Viel Glück 🙂

  • Es gibt einige Links zu dieser Antwort zum Erstellen von ffmpeg für Android. Ist das immer noch die beste Lösung? Der Link zum Android Build System ist defekt – was soll das sein? Es gibt eine Reihe von Toolkits, die beim Erstellen mit dem NDK helfen. Sie scheitern jedoch alle mit verschiedenen Build-Fehlern für mich und scheinen ein wenig alt zu sein. Gibt es einen Grund, warum jemand nicht einfach eine gebaute statische ffmpeg-Lib posten kann?

    – Rob Lourens

    22. Mai 2012 um 16:03 Uhr

  • Um meine eigene Frage zu beantworten, fand ich dieses Repo am nützlichsten zum Erstellen von ffmpeg- und JNI-Wrappern – github.com/andynicholson/android-ffmpeg-x264

    – Rob Lourens

    26. Mai 2012 um 19:07 Uhr

FFmpeg auf Android
Sandeep

Aus verschiedenen Gründen war und ist Multimedia nie einfach, um die Aufgabe zu erfüllen, ohne Kompromisse bei der Effizienz einzugehen. ffmpeg bemüht sich, es Tag für Tag zu verbessern. Es unterstützt verschiedene Formate von Codecs und Containern.

Nun zur Beantwortung der Frage nach wie man diese Bibliothek benutzt, würde ich sagen, dass es nicht so einfach ist, es hier zu schreiben. Aber ich kann dich hineinführen folgende Wege.

1) Im ffmpeg-Verzeichnis des Quellcodes haben Sie Ausgabe_Beispiel.c oder api_example.c. Hier sehen Sie den Code, in dem die Codierung/Decodierung durchgeführt wird. Sie erhalten eine Vorstellung davon, welche APIs in ffmpeg Sie aufrufen sollten. Das wäre Ihr erster Schritt.

2) Dolphin Player ist ein Open-Source-Projekt für Android. Derzeit hat es Fehler, aber die Entwickler arbeiten kontinuierlich daran. In diesem Projekt haben Sie das gesamte Setup bereit, mit dem Sie Ihre Untersuchung fortsetzen können. Hier ist ein Link zum Projekt von code.google.com oder führen Sie den Befehl “git-Klon https://code.google.com/p/dolphin-player/” in einem Terminal. Sie können zwei Projekte mit den Namen P und P86 sehen. Sie können beide verwenden.

Ein zusätzlicher Tipp, den ich anbieten möchte, ist, dass Sie beim Erstellen des ffmpeg-Codes in build.sh die Muxer/Demuxer/Encoder/Decoder der Formate aktivieren müssen, die Sie verwenden möchten. Andernfalls wird der entsprechende Code nicht in die Bibliotheken aufgenommen. Es hat lange gedauert, bis ich das erkannt habe. Also dachte ich daran, es mit Ihnen zu teilen.

Ein paar Grundlagen:
Wenn wir von einer Videodatei sprechen, z. B. avi, handelt es sich um eine Kombination aus Audio und Video

Videodatei = Video + Audio


Video = Codec + Muxer + Demuxer

Codec = Encoder + Decoder

=> Video = Encoder + Decoder + Muxer + Demuxer (Mpeg4 + Mpeg4 + avi +avi – Beispiel für avi-Container)


Audio = Codec + Muxer + Demuxer

Codec = Encoder + Decoder

=> Audio = Encoder + Decoder + Muxer + Demuxer (mp2 + mp2 + avi + avi – Beispiel für avi-Container)


Codec (der Name leitet sich von einer Kombination aus en*co*der/*dec*oder ab) ist nur ein Teil des Formats, das die Algorithmen definiert, die zum Codieren/Decodieren eines Frames verwendet werden. AVI ist kein Codec, es ist ein Container, der den Video-Codec von Mpeg4 und den Audio-Codec von mp2 verwendet.

Muxer/Demuxer wird verwendet, um die Frames aus einer Datei zu kombinieren/zu trennen, die während der Codierung/Decodierung verwendet wird.

Wenn Sie also das AVI-Format verwenden möchten, müssen Sie Videokomponenten + Audiokomponenten aktivieren.

B. für avi, müssen Sie Folgendes aktivieren. MPEG4-Encoder, MPEG4-Decoder, MP2-Encoder, MP2-Decoder, AVI-Muxer, AVI-Demuxer.

puhwwwwww…

Programmgesteuert sollte build.sh den folgenden Code enthalten:

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

Hoffe, ich habe dich nach all dem nicht noch mehr verwirrt…

Danke. Wenn Sie Hilfe benötigen, lassen Sie es mich bitte wissen.

  • Hey, ich möchte mich ganz herzlich für diese Info bedanken, du hast mir wirklich sehr geholfen, kannst du mir vielleicht helfen, wenn ich später welche brauche? Danke!

    – idisch

    1. Juli 2012 um 8:14 Uhr

  • Kann ich Sie bitte über Skype/MSN oder eine andere Chat-Plattform hinzufügen? Ich habe ein paar Fragen dazu, danke.

    – idisch

    1. Juli 2012 um 8:46 Uhr

  • Sicher..!! Aber meine Online-Präsenz ist etwas gering. Wenn es nicht unbedingt erforderlich ist, logge ich mich nicht bei Skype ein. Sie können mir für alle wichtigen Dinge eine E-Mail schicken. E-Mail: [email protected]

    – Sandeep

    2. Juli 2012 um 8:49 Uhr

Nach vielen Recherchen ist dies im Moment die aktuellste kompilierte Bibliothek für Android, die ich gefunden habe:

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

  • In diesem Moment verwendet FFmpeg release n4.0-39-gda39990
  • Beinhaltet FFmpeg und FFProbe
  • Enthält eine Java-Schnittstelle zum Starten der Befehle
  • FFprobe oder FFmpeg könnten aus der APK entfernt werden, siehe Wiki https://github.com/bravobit/FFmpeg-Android/wiki

Die am einfachsten zu erstellende und zu verwendende Implementierung, die ich gefunden habe, stammt vom theguardianproject-Team: https://github.com/guardianproject/android-ffmpeg

Ich habe ein kleines Projekt durchgeführt, um X264 und FFMPEG mit dem Android NDK zu konfigurieren und zu erstellen. Das Wichtigste, was fehlt, ist eine anständige JNI-Schnittstelle, um es über Java zugänglich zu machen, aber das ist der einfache Teil (relativ). Wenn ich dazu komme, die JNI-Schnittstelle für meine eigenen Zwecke gut zu machen, werde ich das einbringen.

Der Vorteil gegenüber dem Build-System von olvaffe besteht darin, dass keine Android.mk-Dateien zum Erstellen der Bibliotheken erforderlich sind, sondern nur die regulären Makefiles und die Toolchain verwendet werden. Dies macht es viel unwahrscheinlicher, dass es nicht mehr funktioniert, wenn Sie neue Änderungen von FFMPEG oder X264 ziehen.

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

  • Nick, dein Projekt kompiliert nicht unter OS X 10.7 libx264.a(common.o): In Funktion x264_param_parse': common.c:(.text+0x2864): undefined reference to _DefaultRuneLocale’ collect2: ld gab 1 Exit-Status zurück make: *** [x264] Fehler 1

    – Juri Solowjow

    21. Dezember 2011 um 11:41 Uhr

FFmpeg auf Android
jmartinalonso

Um meine FFMPEG-Anwendung zu erstellen, habe ich dieses Projekt verwendet (https://github.com/hiteshsondhi88/ffmpeg-android-java), also muss ich nichts kompilieren. Ich denke, es ist der einfache Weg, FFMPEG in unseren Android-Anwendungen zu verwenden.

Mehr Infos auf http://hiteshsondhi88.github.io/ffmpeg-android-java/

  • Nick, dein Projekt kompiliert nicht unter OS X 10.7 libx264.a(common.o): In Funktion x264_param_parse': common.c:(.text+0x2864): undefined reference to _DefaultRuneLocale’ collect2: ld gab 1 Exit-Status zurück make: *** [x264] Fehler 1

    – Juri Solowjow

    21. Dezember 2011 um 11:41 Uhr

Inspiriert von vielen anderen FFmpeg-on-Android-Implementierungen da draußen (hauptsächlich die guadianprojekt), habe ich eine Lösung gefunden (auch mit Lame-Unterstützung).

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

um FFmpeg aufzurufen:

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();

und um die Konsolenausgabe zu verarbeiten:

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

  • Wie sind Ihre Erfahrungen mit guardianproject?

    – XY

    24. März 2014 um 22:48 Uhr

964270cookie-checkFFmpeg auf Android

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy