Ich habe FFmpeg auf Android kompiliert (libffmpeg.so). Jetzt muss ich entweder eine Anwendung wie RockPlayer erstellen oder ein vorhandenes Android-Multimedia-Framework verwenden, um FFmpeg aufzurufen.
Haben Sie Schritte / Prozeduren / Code / Beispiele zur Integration von FFmpeg in Android / StageFright?
Können Sie mir bitte eine Anleitung geben, wie ich diese Bibliothek für die Multimedia-Wiedergabe verwenden kann?
Ich habe eine Anforderung, bei der ich bereits Audio- und Videotransport-Streams habe, die ich an FFmpeg weiterleiten und dekodieren / rendern muss. Wie kann ich dies auf Android tun, da IOMX-APIs OMX-basiert sind und FFmpeg hier nicht einstecken können?
Außerdem konnte ich keine Dokumentation zu den FFmpeg-APIs finden, die für die Wiedergabe verwendet werden müssen.
Antworten:
Hier sind die Schritte, die ich durchlaufen habe, um ffmpeg für Android zum Laufen zu bringen:
make
weg. Sie müssen auch bionic (libc) und zlib (libz) aus dem Android-Build extrahieren, da ffmpeg-Bibliotheken davon abhängen.Erstellen Sie mit dem Android NDK eine dynamische Bibliothek, die die ffmpeg-Funktionalität einschließt . 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ötigten Funktionen aus ffmpeg in eine Bibliothek zu exportieren, mit der Java über JNI interagieren kann. Mit dem NDK können Sie problemlos Verknüpfungen zu den statischen Bibliotheken herstellen, die Sie in Schritt 1 generiert haben. Fügen Sie einfach eine ähnliche Zeile zu Android.mk hinzu:
LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz
Verwenden Sie die dynamische Bibliothek ffmpeg-wrapping aus Ihren Java-Quellen. Es gibt genug Dokumentation zu JNI da draußen, es sollte dir 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). Hier ist ein grundlegendes Tutorial. Die beste Dokumentation finden Sie in den Headern.
Viel Glück :)
quelle
Aus verschiedenen Gründen war und ist Multimedia im Hinblick auf die Erreichung der Aufgabe ohne Kompromisse bei der Effizienz nie einfach. ffmpeg ist eine Anstrengung, es Tag für Tag zu verbessern. Es unterstützt verschiedene Formate von Codecs und Containern.
Um nun die Frage zu beantworten, wie diese Bibliothek verwendet werden soll , würde ich sagen, dass es nicht so einfach ist, sie hier zu schreiben. Aber ich kann Sie auf folgende Weise führen .
1) Im ffmpeg-Verzeichnis des Quellcodes haben Sie output_example.c oder api_example.c . Hier sehen Sie den Code, in dem die Codierung / Decodierung erfolgt. Sie erhalten eine Vorstellung davon, welche APIs in ffmpeg Sie aufrufen sollten. Dies wäre Ihr erster Schritt.
2) Dolphin Player ist ein Open Source Projekt für Android. Derzeit gibt es Fehler, aber die Entwickler arbeiten kontinuierlich. 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 clone https://code.google.com/p/dolphin-player/ " in einem Terminal aus. 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. Ich habe viel Zeit gebraucht, um das zu realisieren. Also dachte ich daran, es mit dir zu teilen.
Einige Grundlagen: Wenn wir eine Videodatei sagen, z. B. avi, ist dies 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 (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, sondern ein Container, der den Video-Codec von Mpeg4 und den Audio-Codec von mp2 verwendet.
Muxer / Demuxer wird verwendet, um die Frames von einer Datei zu kombinieren / zu trennen, die beim Codieren / Decodieren verwendet wird.
Wenn Sie also das AVI-Format verwenden möchten, müssen Sie Videokomponenten + Audiokomponenten aktivieren.
Beispiel: Für avi müssen Sie Folgendes aktivieren. mpeg4 Encoder, mpeg4 Decoder, mp2 Encoder, mp2 Decoder, AVI Muxer, AVI Demuxer.
phewwwwwww ...
Programmatisch sollte build.sh den folgenden Code enthalten:
Hoffe, ich habe dich nach all dem nicht mehr verwirrt ...
Vielen Dank. Wenn Sie Hilfe benötigen, lassen Sie es mich bitte wissen.
quelle
Die einfachste und benutzerfreundlichste Implementierung, die ich gefunden habe, wurde vom Team von guardianproject erstellt: https://github.com/guardianproject/android-ffmpeg
quelle
Ich habe ein kleines Projekt durchgeführt, um X264 und FFMPEG mit dem Android NDK zu konfigurieren und zu erstellen. Die Hauptsache, die fehlt, ist eine anständige JNI-Schnittstelle, um sie ü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 zu nutzen, werde ich das weiter vorantreiben.
Der Vorteil gegenüber dem Build-System von olvaffe besteht darin, dass zum Erstellen der Bibliotheken keine Android.mk-Dateien erforderlich sind, sondern lediglich die regulären Makefiles und die Toolchain verwendet werden. Dies macht es viel weniger wahrscheinlich, dass Sie nicht mehr funktionieren, wenn Sie neue Änderungen von FFMPEG oder X264 abrufen.
https://github.com/halfninja/android-ffmpeg-x264
quelle
x264_param_parse': common.c:(.text+0x2864): undefined reference to
_DefaultRuneLocale 'collect2: ld hat 1 Exit-Status zurückgegeben: *** [x264] Fehler 1Nach vielen Recherchen ist dies derzeit die aktuellste kompilierte Bibliothek für Android, die ich gefunden habe:
https://github.com/bravobit/FFmpeg-Android
FFmpeg release n4.0-39-gda39990
quelle
Für meine FFMPEG-Anwendung habe ich dieses Projekt verwendet ( https://github.com/hiteshsondhi88/ffmpeg-android-java) zu erstellen, habe ), sodass ich nichts kompilieren muss. Ich denke, es ist die einfache Möglichkeit, FFMPEG in unseren Android-Anwendungen zu verwenden.
Weitere Informationen unter http://hiteshsondhi88.github.io/ffmpeg-android-java/
quelle
Inspiriert von vielen anderen FFmpeg-Implementierungen für Android (hauptsächlich dem Guadian-Projekt ), fand ich eine Lösung (auch mit Lame-Unterstützung).
(lahm und FFmpeg: https://github.com/intervigilium/liblame und http://bambuser.com/opensource )
FFmpeg aufrufen:
und um die Konsolenausgabe zu handhaben:
quelle
Seltsam, dass dieses Projekt nicht erwähnt wurde: AndroidFFmpeg von Appunite
Es enthält ziemlich detaillierte Schritt-für-Schritt-Anweisungen zum Kopieren / Einfügen in die Befehlszeile, für faule Leute wie mich))
quelle
Ich hatte das gleiche Problem, ich fand die meisten Antworten hier veraltet. Am Ende habe ich einen Wrapper auf FFMPEG geschrieben, um von Android mit einer einzigen Codezeile darauf zuzugreifen.
https://github.com/madhavanmalolan/ffmpegandroidlibrary
quelle
Fügen Sie zunächst die Abhängigkeit der FFmpeg-Bibliothek hinzu
Laden Sie dann die Aktivität ein
Verwenden Sie auch eine andere Funktion von FFmpeg
quelle