Wie kompiliere ich FFmpeg mit libfdkaac in eine einzige statische Binärdatei? [geschlossen]

9

Mein Ziel ist es, eine einzelne statische FFmpeg-Binärdatei mit libfdkaac- und x264-Unterstützung für OSX und Linux zu erstellen. Zuerst habe ich versucht, eine unter OSX zu erstellen. Ich folge den Anweisungen im FFmpeg-Web: https://trac.ffmpeg.org/wiki/CompilationGuide/MacOSX

Hier sind die Konfigurationseinstellungen, die ich angewendet habe, um eine statische Binärdatei zu erstellen:

./configure pkg_config='pkg-config --static' --prefix=/usr/local --extra-version=ntd_20150126 --disable-shared --enable-static --enable-gpl --enable-pthreads --enable-nonfree --enable-fontconfig --enable-libfreetype --enable-libass --enable-libfdk-aac  --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-filters --enable-runtime-cpudetect

Nach dem Erstellungsprozess beträgt FFmpeg etwa 14 MB, was bedeutet, dass die Bibliotheken von Drittanbietern nicht enthalten sind. Tatsächlich muss eine Verknüpfung zu dynamischen Bibliotheken hergestellt werden, die sich unter befinden /usr/local/lib. Wenn ich diese dynamischen Bibliotheken entfernt habe, zeigt das FFmpeg einen Fehler wie:

dyld: Library not loaded: /usr/local/lib/libSDL-1.2.0.dylib
Referenced from: /usr/local/bin/ffmpeg
Reason: image not found
Trace/BPT trap: 5

Ist es der richtige Weg, alle externen Bibliotheken zu einer einzigen statischen Binärdatei zu machen?

Ich würde mich sehr über Ihre Hilfe freuen!

Ellis Shen
quelle
1
Ich habe es endlich herausgefunden. Der Grund dafür, dass dynamische Bibliotheken weiterhin verknüpft sind, liegt darin, dass der ffmepg-Erstellungsprozess für die Verwendung dynamischer Bibliotheken eine höhere Priorität hat. Tatsächlich habe ich sowohl dynamische als auch statische Bibliotheken im Präfixordner erstellt. Nachdem ich alle * .dylib-Dateien aus dem Präfixordner entfernt hatte, nahm der Erstellungsprozess eine statische Bibliothek und erstellte erfolgreich eine einzelne Binärdatei.
Ellis Shen
Beantworten Sie Ihre eigene Frage für andere, die das gleiche Problem haben.
Stib
Hat OS X nicht den lddBefehl, die dynamischen Bibliotheksabhängigkeiten einer Binärdatei anzuzeigen? Oder nur ein fileBefehl mit Ausgabe, der enthält, ob eine Binärdatei statisch oder dynamisch verknüpft wurde?
Peter Cordes
Außerdem sollte ja --disable-shared --enable-staticeine statische Binärdatei erstellen. Ich denke, es funktioniert unter Linux oder beim Cross-Compilieren für Windows. Es klingt also wie ein Fehler in den ffmpeg-Build-Skripten unter OS X
Peter Cordes
Hoppla, habe gerade mein eigenes FFmpeg (unter GNU / Linux) aktualisiert und --enable-statickeine statischen Binärdateien erstellt. Es macht die libav*von ffmpeg gebaut Bibliotheken (und durch die verwendeten Binärdateien) statisch oder nicht. Ffmpeg verwendet keine statischen Versionen externer Bibliotheken. Was Sie also sehen, ist das Standardverhalten für ffmpeg.
Peter Cordes

Antworten:

4

In meinem CentOS 5.11 und FFmpeg 3.0 muss ich Optionen verwenden

--pkg-config-flags="--static"
--extra-cflags="-I$HOME/ffmpeg/include -static"
--extra-ldflags="-L$HOME/ffmpeg/lib -static"

--enable-static weist einen Complier an, die "statischen Bibliotheken" (libav * .a) zu erstellen. Wir können die FFmpeg-API in der anderen eigenständigen (statischen) Anwendung kombinieren.

--disable-shared weist einen Complier an, die "dynamisch verknüpften gemeinsam genutzten Objektbibliotheken" (libav * .so) nicht zu erstellen. Diese Arten von Bibliotheken können von der anderen Anwendung geladen und die FFmpeg-API verwendet werden.

Diese beiden Optionen erfüllen FFmpeg nicht als eigenständige statische ausführbare Datei.

Boontawee nach Hause
quelle
9

Danke für den Vorschlag von stib. Ich lasse meine Antwort hier.

Der FFmepg-Erstellungsprozess hat eine höhere Priorität für die Verwendung der dynamischen Bibliothek, selbst wenn statische Bibliotheken bereit sind. Daher habe ich zuerst einige externe Bibliotheken aus der Build-Konfiguration entfernt und sichergestellt, dass alle externen Bibliotheken nur statisch sind (entfernen Sie * .dylib aus dem Präfix / usr / local / lib). Erstellen Sie es dann mit dem folgenden Befehl neu:

./configure --pkg-config-flags="--static" --libdir=/usr/local/lib --extra-version=ntd_20150128 --disable-shared --enable-static --enable-gpl --enable-pthreads --enable-nonfree  --enable-libass --enable-libfdk-aac  --enable-libmp3lame  --enable-libx264 --enable-filters --enable-runtime-cpudetect

Denken Sie daran --pkg-config-flags="--static", den Erstellungsprozess zu definieren und ihn zu bitten, die statische Bibliothek zu verwenden. Dann erhalten wir eine einzelne ausführbare FFmpeg-Binärdatei!

PS: Ich habe die libass- Unterstützung aus der Konfiguration entfernt, da libass von der Fontconfig-Bibliothek abhängt, für die nur eine dynamische Bibliothek verfügbar ist. Ich werde die libass-Unterstützung zurücksetzen, sobald ich herausgefunden habe, wie eine statische Bibliothek von fontconfig erstellt wird.

Vielen Dank.

Ellis Shen
quelle
"--Enable-static" ist also nicht notwendig?!
Dr.jacky
3
Ich denke - Enable-Static ist immer noch erforderlich
Ellis Shen
1
Omg, du hast mein Leben gerettet, ich habe fast zwei Wochen an diesem Problem gearbeitet und im Internet nach einer Lösung gesucht. Und das ist es. Vielen Dank !
YoannM