Kamigawa
Anmeldungsdatum: 28. April 2007
Beiträge: 84
|
Ich habe schon öfter FFmpeg (trunk aus dem Subversionrepository) mit x264 (head aus dem GIT-Repository) kompiliert. Allerdings ist die libx264 seit einigen Wochen in der Versionsnummer von 79 auf 80 gestiegen. Das heißt, dass wenn ich jetzt das selbstkompilierte x264 installiere, ich im Ordner /usr/lib die Datei "libx264.so.80" anstatt wie vorher "libx264.so.79" vorfinde. So weit so gut, eine höhere Versionsnummer ist ja eigentlich nicht schlimm. Wenn ich FFmpeg jetzt aber mit "--enable-libx264" konfiguriere und dann "make" ausführe dauert es ein paar Minuten, bis der Kompiliervorgang mit folgender Meldung abbricht:
gcc -L"/home/daniel/ffmpeg/buildnew"/libavcodec -L"/home/daniel/ffmpeg/buildnew"/libavdevice -L"/home/daniel/ffmpeg/buildnew"/libavfilter -L"/home/daniel/ffmpeg/buildnew"/libavformat -L"/home/daniel/ffmpeg/buildnew"/libavutil -L"/home/daniel/ffmpeg/buildnew"/libpostproc -L"/home/daniel/ffmpeg/buildnew"/libswscale -Wl,--warn-common -Wl,--as-needed -Wl,-rpath-link,"/home/daniel/ffmpeg/buildnew"/libpostproc -Wl,-rpath-link,"/home/daniel/ffmpeg/buildnew"/libswscale -Wl,-rpath-link,"/home/daniel/ffmpeg/buildnew"/libavfilter -Wl,-rpath-link,"/home/daniel/ffmpeg/buildnew"/libavdevice -Wl,-rpath-link,"/home/daniel/ffmpeg/buildnew"/libavformat -Wl,-rpath-link,"/home/daniel/ffmpeg/buildnew"/libavcodec -Wl,-rpath-link,"/home/daniel/ffmpeg/buildnew"/libavutil -Wl,-Bsymbolic -o ffmpeg_g ffmpeg.o cmdutils.o -lavfilter -lpostproc -lavdevice -lavformat -lavcodec -lavutil -lswscale -lz -pthread -lm -lfaac -lfaad -lgsm -lmp3lame -lm -lopenjpeg -lschroedinger-1.0 -lpthread -loil-0.3 -lm -lrt -lspeex -ltheoraenc -ltheoradec -logg -lvorbisenc -lvorbis -logg -lx264 -lm -lxvidcore -ldc1394 -lraw1394 -lasound -ljack -ldl -lasound -ljack -lX11 -lXext -lXfixes -lasound
/home/daniel/ffmpeg/buildnew/libavcodec/libavcodec.so: undefined reference to `x264_encoder_open_79'
collect2: ld returned 1 exit status
make: *** [ffmpeg_g] Error 1 Da findet sich also wieder die Referenz auf die Version 79 der Bibliothek. Zuerst dachte ich mir, die FFmpeg-Quellen seien einfach noch nicht an die neue x264-Version angepasst worden, allerdings besteht dieser Zustand jetzt schon seit Wochen. Außerdem habe ich die Dateien des FFmpeg-Quelltextes mal nach der Zahl "79" durchsuchen lassen und habe nur eine Stelle im Zusammenhang mit libx264 gefunden, nämlich eine Überprüfung, ob eine Version ">=79" installiert ist, diese Überprüfung wird ja während des "./configure" auch unbeschadet überstanden. Woher kommt also diese in der Fehlermeldung erwähnte "reference" auf eine 79er-Version? Kann es sein, dass "ld", oder "ldconfig" (von denen ich allerdings nicht weiß wozu genau sie gut sind) noch irgendwo veraltete Informationen über die libx264 haben? Im Voraus schon einmal Danke für alle Antworten!
|
20100801
Anmeldungsdatum: 3. Januar 2007
Beiträge: 1050
|
Wenn ich FFmpeg jetzt aber mit "--enable-libx264" konfiguriere und dann "make" ausführe dauert es ein paar Minuten, bis der Kompiliervorgang mit folgender Meldung abbricht:
Funktioniert mit x264 core:80 r1376 3feaec2 FFmpeg version SVN-r20986, Copyright (c) 2000-2009 Fabrice Bellard, et al.
built on Dec 31 2009 13:43:15 with gcc 4.4.1
configuration: --enable-gpl --enable-version3 --enable-libdirac --enable-libschroedinger --enable-nonfree --enable-postproc --enable-pthreads --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-avfilter --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-x11grab --enable-libdc1394 --enable-runtime-cpudetect --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex
libavutil 50. 7. 0 / 50. 7. 0
libavcodec 52.45. 0 / 52.45. 0
libavformat 52.44. 0 / 52.44. 0
libavdevice 52. 2. 0 / 52. 2. 0
libavfilter 1.12. 0 / 1.12. 0
libswscale 0. 7. 2 / 0. 7. 2
libpostproc 51. 2. 0 / 51. 2. 0
Ich gehe mal davon aus, alle Abhängigkeiten sind erfüllt und libx264-dev ist deinstalliert. git clone git://git.videolan.org/x264.git cd /x264 ./configure --enable-shared --prefix=/usr --enable-mp4-output --enable-pthread --enable-visualize --enable-pic
make
svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg cd /ffmpeg sudo ldconfig ./configure --enable-gpl --enable-version3 --enable-libdirac --enable-libschroedinger --enable-nonfree --enable-postproc --enable-pthreads --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-avfilter --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-x11grab --enable-libdc1394 --enable-runtime-cpudetect --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex
make
|
Kamigawa
(Themenstarter)
Anmeldungsdatum: 28. April 2007
Beiträge: 84
|
Danke für deine Antwort Henrikx! Ich habe x264 noch einmal neu kompiliert, weil ich sonst nie die Optionen "--enable-pthread --enable-visualize --enable-pic" benutzt habe. Meine Version ist genau wie deine die "x264 core:80 r1376 3feaec2". Dann habe ich FFmpeg noch einmal neu konfiguriert, auch ein "sudo ldconfig" ausgeführt, aber immer noch dasselbe Problem bei "make". Danach habe ich versucht libx264-dev zu installieren (was ich bisher allerdings auch noch nie brauchte um FFmpeg mit libx264 zu kompilieren), was aber nicht ging, da mein selbstkompiliertes x264 Dateien enthält, die auch in libx264-dev sind. Dann habe ich das gesamte ffmpeg-Quellverzeichnis gelöscht und noch einmal neu runtergeladen, es hätte ja sein können, dass eine irgendwann einmal automatisch erstellte Datei vielleicht Schuld an der ganzen Sache ist, aber das brachte auch nichts. Ich weiß wirklich nicht mehr weiter. Eine Info vielleicht noch: Ich hatte mal libx264.so.79 (selbstkompiliert) installiert, dann habe ich Ubuntu neu installiert, allerdings ohne "/" zu formatieren, d. h. die alten Systemdateien wurden einfach überschrieben. Nach der Neuinstallation von Ubuntu (ich habe vorher nicht daran gedacht mein libx264 zu deinstallieren) habe ich die alten vorhandenen Dateien von libx264 per Hand entfernt und x264 neu kompiliert (libx264.so.80). Aber - scheinbar? - steckt irgendwo noch ein Hinweis auf die 79er Version. Als allerletzte Lösung müsste ich Ubuntu nochmal neu installieren und "/" formatieren.
|
20100801
Anmeldungsdatum: 3. Januar 2007
Beiträge: 1050
|
Also bei mir finde ich nur unter /usr/lib eine libx264.so,libx264.so67, libx264.so80 Die erste hat als Verknüpfungziel libx264.so.80 Schau mal nach, wie das bei dir ist (Eigenschaften)
Dann habe ich FFmpeg noch einmal neu konfiguriert, auch ein "sudo ldconfig" ausgeführt, aber immer noch dasselbe Problem bei "make".
Eventuell Fehler weil vielleicht mit -shared konfiguriert Ich hatte bei ffmpeg öfters Probleme mit den "extra Libs", ich benutze nur die "normalen" Benötigte libs plus dev.
libavcodec
libavdevice
libavformat
libavutil
libpostproc
libswscale Installierst du x264 mit make install, oder machst du vorher ein Debian - Paket make install kann bei x264 schon mal an der Registrierung vorbeigehen, besser Debian Paket. make
sudo checkinstall --fstrans=no --install=yes --pkgname=x264 --pkgversion "1:0.svn`date +%Y%m%d`-1ubuntu6" --default
|
Kamigawa
(Themenstarter)
Anmeldungsdatum: 28. April 2007
Beiträge: 84
|
Henrikx schrieb: Also bei mir finde ich nur unter /usr/lib eine libx264.so,libx264.so67, libx264.so80 Die erste hat als Verknüpfungziel libx264.so.80 Schau mal nach, wie das bei dir ist (Eigenschaften)
Bei mir sieht die Situation fast genau so aus, lediglich die libx264.so.67 habe ich nicht, weil ich das Ubuntupaket libx264-67 nicht installiert habe (wozu auch mit einer selbstkompilierten libx264?). Henrikx schrieb: Eventuell Fehler weil vielleicht mit -shared konfiguriert
Ich habe bisher immer mit shared kompiliert, weil ich das ubuntueigene FFmpeg komplett durch mein selbstkompiliertes ersetze (so dass z. B. auch das Ubuntupaket libxine1-ffmpeg auf meine Version zugreift). Henrikx schrieb: Ich hatte bei ffmpeg öfters Probleme mit den "extra Libs", ich benutze nur die "normalen" Benötigte libs plus dev.
libavcodec
libavdevice
libavformat
libavutil
libpostproc
libswscale
Ich verstehe nicht ganz. Die genannten Pakete sind doch obsolet, wenn man FFmpeg selbst kompiliert. Denn alles was in diesen Paketen ist, wird ja auch bei der Kompilation von FFmpeg erstellt (ich habe diese Pakete z. B. garnicht installiert, sondern nur mein "eigenes" FFmpeg). Henrikx schrieb: Installierst du x264 mit make install, oder machst du vorher ein Debian - Paket
Ich erstelle immer ganz vorschriftsmäßig;-) ein Paket mit checkinstall. Auf jeden Fall noch einmal Danke für deine Antwort! Vielleicht gibt es ja doch noch eine Lösung und wenn nicht, kann ich Ubuntu ja immer noch neu installieren (auch wenn das natürlich nur für x264 vielleicht ein wenig übertrieben ist).
|
20100801
Anmeldungsdatum: 3. Januar 2007
Beiträge: 1050
|
Ich verstehe nicht ganz. Die genannten Pakete sind doch obsolet, wenn man FFmpeg selbst kompiliert.
Nein. sudo apt-get build-dep ffmpeg Schau mal ob alle Abhängigkeiten bei dir erfüllt sind..
|
Kamigawa
(Themenstarter)
Anmeldungsdatum: 28. April 2007
Beiträge: 84
|
Henrikx schrieb: sudo apt-get build-dep ffmpeg Schau mal ob alle Abhängigkeiten bei dir erfüllt sind.
Wenn du im Quelltextverzeichnis von FFmpeg mal nachschaust, dann siehst du, dass es unter anderem die Ordner "libavcodec" "libswscale" "libpostproc" etc. gibt, weil diese Bibliotheken nämlich bei FFmpeg dabei sind. Wenn du also (ohne es anders eingerichtet zu haben) FFmpeg kompilierst und installierst, dann werden diese Bibliotheken auch installiert, dazu benötigt man nicht die devel-Pakete von Ubuntu. Beim ubuntueigenen Paket FFmpeg wird es etwas anders gemacht. Da werden die Dateien von FFmpeg nicht als ein Paket "ffmpeg" geliefert, sondern in viele Pakete aufgesplittet (ffmpeg, libavutil, libavcodec, libavcodec-dev, libswscale, libpostproc...). So wird es nämlich möglich z. B. für vlc nur den libavcodec-Teil von FFmpeg zu installieren, ohne das Programm "ffmpeg" oder die header installieren zu müssen. Aus diesem Grund sagt build-dep dir auch, dass für FFmpeg solche Pakete wie libavcodec-dev etc. nötig sind, obwohl das (zumindest wenn man den gesamten Quelltext aus Subversion hat) garnicht nötig ist. So habe ich FFmpeg ja auch bereits einige male erfolgreich kompiliert, allerdings scheint in meinem System irgendwo noch ein Hinweis auf die Version 79 der libx264 zu stecken, aber ich weiß nicht wo.
|
Kamigawa
(Themenstarter)
Anmeldungsdatum: 28. April 2007
Beiträge: 84
|
Ich habe noch etwas nachgeforscht und bin glaube ich auf den Grund des Linkerfehlers während des "make" gestoßen. Wenn man sich die /usr/include/x264.h mal anschaut, dann findet man folgende Zeilen:
| /* Force a link error in the case of linking against an incompatible API version.
* Glue #defines exist to force correct macro expansion; the final output of the macro
* is x264_encoder_open_##X264_BUILD (for purposes of dlopen). */
#define x264_encoder_glue1(x,y) x##y
#define x264_encoder_glue2(x,y) x264_encoder_glue1(x,y)
#define x264_encoder_open x264_encoder_glue2(x264_encoder_open_,X264_BUILD)
/* x264_encoder_open:
* create a new encoder handler, all parameters from x264_param_t are copied */
x264_t *x264_encoder_open( x264_param_t * );
|
Der passende git-commit dazu findet sich unter http://mailman.videolan.org/pipermail/x264-devel/2009-September/006261.html.
Wie dort beschrieben soll der geänderte Code davor schützen, dass ein "miscompiled ffmpeg" (anscheinend erkannt anhand der "incompatible API version") mit der libx264 gelinkt wird. Ich könnte natürlich einfach den Code in der /usr/include/x264.h händisch zurück ändern, aber der ist ja sicherlich nicht ohne Grund hinzugekommen. Wieso entscheidet die x264.h also, dass mein selbstkompiliertes FFmpeg eine inkompatible API-Version verwendet? Für den aktuellen x264-build müsste der Aufruf "x264_encoder_open_80" heißen, in der Fehlermeldung (die im ersten Post des Threads steht) wird allerdings die Referenz "x264_encoder_open_79" benutzt. Allerdings konnte ich keine Stelle im FFmpeg-Code finden, die irgendwo im Zusammenhang mit libx264 eine hartcodierte Version 79 verwendet. Hoffentlich kennt jemand erfahreneres als ich sich mit solchen Problemen aus, für eine Antwort wäre ich sehr dankbar!
|
Kamigawa
(Themenstarter)
Anmeldungsdatum: 28. April 2007
Beiträge: 84
|
Ich habe im Quelltext von x264 zum Test einfach mal die Versionskonstante von 80 auf 79 geändert und siehe da: der "make"-Schritt von ffmpeg läuft fehlerfrei durch. Allerdings ist das natürlich nur ein schmutziger Trick, der sich heimzahlt, sobald ich ffmpeg mit dem x264-Codec benutzen möchte, dann kommt es nämlich zu einem Segfault. Nur frage ich mich eins: Henrikx hat ja geschrieben, er habe FFmpeg mit der neuesten libx264 kompiliert. Aber wieso funktioniert das dann bei mir nicht? Kann jemand anders eventuell bestätigen, dass auch er FFmpeg mit der Version 80 der libx264 kompilieren kann, bzw. bestätigen, dass es bei ihm auch nicht funktioniert?
|
connedy
Anmeldungsdatum: 8. September 2007
Beiträge: Zähle...
|
Versuche nun seit einigen Tagen, ffmpeg mit x264 und amr_nb zu kompilieren, hatte immer denselben Fehler (x264). Hab es gerade nochmals versucht und siehe da ... alles lief durch, als hätte es nie ein Problem gegeben. Das muss ich jetzt nicht verstehen ... hab keine "schmutzigen Tricks" verwendet und auch sonst nichts geändert. Bin übrigens bei allen Versuchen dieser Anleitung im Wiki gefolgt, plötzlich gehts. ^^
|
CDrewing
Anmeldungsdatum: 6. November 2007
Beiträge: 549
|
Ich hänge mich einfach mal an diesen Thread ran, ist ja unnötig einen neuen aufzumachen. Ich habe mir ffmpeg als Source runtergeladen und auch kompiliert; ging alles recht gut. Nur jetzt will er das mit checkinstall erstellte deb-Paket nicht installieren:
Habe schon versucht, betroffene Datein in _old umzubenennen. Dennoch meckert er immer noch. Dir libavformat52 einfach deinstallieren habe ich lieber nicht gemacht; da hängen zu viele andere Pakete und Applikationen hinten dran. Das hier waren meine ./configure Daten: cdrewing@cdrewing-laptop:~/Desktop/ffmpeg-0.5.1$ ./configure --enable-nonfree --enable-postproc --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-fastdiv --enable-runtime-cpudetect --enable-bzlib --enable-libdc1394 --enable-libfaac --enable-libfaad --enable-libfaadbin --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-zlib --enable-gprof --enable-extra-warnings --enable-gpl --enable-version3 --enable-libxvid --enable-muxer=mp4 --enable-muxer=matroska --prefix=/usr --libdir=/usr/lib --enable-shared
Danke für eure Hilfe! Gruss
Christian
|