samedi 31 janvier 2009
[Ffmpeg] Compilation en full static de ffmpeg sous Ubuntu
Par david techer, samedi 31 janvier 2009 à 01:01 :: Multiméda sous GNU/Linux
Un peu comme les distributions binaires de ffmpeg sous Windows qui existent pour ffmpeg, il est également possible decompiler ce dernier en static afin de se passer des dépendances par rapport aux librairies. Certes on perd en espace disque mais celà  permer de le tester!
Afin de pouvoir utiliser le couple ffmepg/ffserver pour faire du serveur, j'ai descendu ma révision de SVN à  celle de la 16676! C'est en effet la seule que j'ai pu compilé sans que ffserver bloque toute génération de flux de ffserver (ffmpeg -i ...http://...:..../feed1.ffm).
Intérêt: Mon serveur à  Montpellier est sous Ubuntu et ffmpeg est compilé sur ce dernier. Etant sur Antibes, je pourrais donc faire mes manipulations vidéos uniquement sur mes deux binaires fétiches sans avoir besoin d'installer les dépendances au niveaux des librairies sur mon portable à  Antibes
Le couple ffmepg/ffserver est disponible à  http://www.davidgis.fr/download/ffmpeg-fullstatic-r16676.tar.bz2.
1. Pour la récupération du dépà ´t par SVN et patch pour libswscale
svn checkout -r 16676 svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg-SVNR16676
Pour la compilation, j'ai opté pour pour
cd ffmpeg-SVNR16676 LDFLAGS="-L/mnt/ffmpeg-repository/tools/lib/" CFLAGS="-I/mnt/ffmpeg-repository/tools/include/"\ ./configure --enable-gpl --enable-pthreads --enable-libgsm --enable-debug --disable-shared \ --enable-static --enable-libmp3lame --enable-libfaac --enable-libfaad --enable-swscale \ --enable-libtheora --enable-libvorbis --enable-zlib --enable-bzlib --enable-libx264 --enable-libxvid --enable-libamr-nb --enable-libamr-wb --enable-nonfree \ --prefix=/opt/ffmpeg-svn-16676 --enable-small --enable-libspeex
Afin de ne pas avoir l'erreur
libswscale/swscale.c: In function ‘sws_format_name’: libswscale/swscale.c:461: erreur: ‘PIX_FMT_VDPAU_WMV3’ undeclared (first use in this function) libswscale/swscale.c:461: erreur: (Each undeclared identifier is reported only once libswscale/swscale.c:461: erreur: for each function it appears in.) libswscale/swscale.c:463: erreur: ‘PIX_FMT_VDPAU_VC1’ undeclared (first use in this function) libswscale/swscale.c:971:20: attention : « HAVE_AMD3DNOW » n'est pas défini libswscale/swscale.c:979:7: attention : « HAVE_AMD3DNOW » n'est pas définiJ'ai opté pour un petit patch maison
root@olivia:~/ffmpeg-SVNR16676# wget -q http://www.davidgis.fr/download/ffmpeg-svn16676-libswscale.patch root@olivia:~/ffmpeg-SVNR16676# patch -p0 < ffmpeg-svn16676-libswscale.patch patching file libswscale/rgb2rgb.c patching file libswscale/rgb2rgb_template.c patching file libswscale/swscale.c patching file libswscale/swscale_internal.h patching file libswscale/swscale_template.c patching file libswscale/yuv2rgb.c patching file libswscale/yuv2rgb_template.c
Remarque: Pour les diverses dépendances, il faut se rendre sur divers sites de compilation que propose le Web - chose que je ne détaille pas ici.
Avant de continuer, il est nécessaire de modifier une ligne dans le fichier config.mak en remplaçant la ligne
EXTRALIBS= /mnt/ffmpeg-repository/tools/lib/libz.a /mnt/ffmpeg-repository/tools/lib/libbz2.a \ -pthread -lm /mnt/ffmpeg-repository/tools/lib/libamrnb.a -lm /mnt/ffmpeg-repository/tools/lib/libamrwb.a \ -lm /mnt/ffmpeg-repository/tools/lib/libfaac.a /mnt/ffmpeg-repository/tools/lib/libgsm.a \ /mnt/ffmpeg-repository/tools/lib/libmp3lame.a -lm /mnt/ffmpeg-repository/tools/lib/libspeex.a \ /mnt/ffmpeg-repository/tools/lib/libtheora.a /usr/lib/libogg.a /usr/local/lib/libx264.a -lm\ /usr/local/lib/libxvidcore.a /usr/lib/libvorbis.a /usr/lib/libvorbisfile.a /usr/lib/libvorbisenc.a \ /usr/lib/libfaad.a -ldl -ldl
make
2. Dépendances envers les librairies
Juste avant de faire make instal
l, un petit ldd
nous confirme les dépendances aux niveaux des librairies
root@olivia:/mnt/sources/ffmpeg-svn-16676# ldd ffmpeg ffserver ffmpeg: linux-gate.so.1 => (0xffffe000) libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7ef2000) libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7eee000) libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7ed5000) libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7d8b000) /lib/ld-linux.so.2 (0xb7f32000) ffserver: linux-gate.so.1 => (0xffffe000) libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7f83000) libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7f7f000) libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7f66000) libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e1c000) /lib/ld-linux.so.2 (0xb7fc3000)
Trop de la bombe !
En comparaison par rapport à  la même version que j'ai de compilée et d'installée (dans /opt/ffmpeg) dépendances aux niveaux des librairies (option --enable-shared), on voit de suite la différence
root@olivia:~/ffmpeg-SVNR16676# LD_LIBRARY_PATH=/opt/ffmpeg/lib ldd /opt/ffmpeg/bin/ffmpeg linux-gate.so.1 => (0xffffe000) libswscale.so.0 => /opt/ffmpeg/lib/libswscale.so.0 (0xb7ef8000) libavdevice.so.52 => /opt/ffmpeg/lib/libavdevice.so.52 (0xb7ef1000) libavformat.so.52 => /opt/ffmpeg/lib/libavformat.so.52 (0xb7e03000) libavcodec.so.52 => /opt/ffmpeg/lib/libavcodec.so.52 (0xb75a4000) libavutil.so.49 => /opt/ffmpeg/lib/libavutil.so.49 (0xb7595000) libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7557000) libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb753f000) libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb73f4000) libdc1394_control.so.13 => /usr/lib/libdc1394_control.so.13 (0xb73e5000) libz.so.1 => /usr/lib/libz.so.1 (0xb73d0000) libbz2.so.1.0 => /lib/libbz2.so.1.0 (0xb73c0000) libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb73bc000) libamrnb.so.3 => /usr/local/lib/libamrnb.so.3 (0xb737f000) libamrwb.so.3 => /usr/local/lib/libamrwb.so.3 (0xb7352000) libfaac.so.0 => /usr/lib/libfaac.so.0 (0xb7341000) libfaad.so.0 => /usr/lib/libfaad.so.0 (0xb72f9000) libgsm.so.1 => /usr/lib/libgsm.so.1 (0xb72e9000) libmp3lame.so.0 => /usr/local/lib/libmp3lame.so.0 (0xb7270000) libtheora.so.0 => /usr/lib/libtheora.so.0 (0xb7237000) libvorbisenc.so.2 => /usr/lib/libvorbisenc.so.2 (0xb713a000) libvorbis.so.0 => /usr/lib/libvorbis.so.0 (0xb7112000) libx264.so.66 => /usr/local/lib/libx264.so.66 (0xb7046000) /lib/ld-linux.so.2 (0xb7f2c000) libraw1394.so.8 => /usr/lib/libraw1394.so.8 (0xb7040000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb6f4d000) libmp4v2.so.0 => /usr/lib/libmp4v2.so.0 (0xb6ea7000) libogg.so.0 => /usr/lib/libogg.so.0 (0xb6ea2000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb6e97000)
En résumé
[ -d "$PWD/ffmpeg-SVNR16676" ] && rm -rf "$PWD/ffmpeg-SVNR16676"; svn checkout -r 16676 svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg-SVNR16676; cd ffmpeg-SVNR16676/; wget http://www.davidgis.fr/download/ffmpeg-svn16676-libswscale.patch patch -p0 < ffmpeg-svn16676-libswscale.patch LDFLAGS="-L/mnt/ffmpeg-repository/tools/lib/" CFLAGS="-I/mnt/ffmpeg-repository/tools/include/" \ ./configure --enable-gpl --enable-pthreads \ --enable-libgsm --enable-debug \ --disable-shared --enable-static --enable-libmp3lame --enable-libfaac \ --enable-swscale --enable-libtheora --enable-zlib --enable-bzlib \ --enable-libx264 --enable-libxvid --enable-libamr-nb --enable-libamr-wb \ --enable-nonfree --prefix=/opt/ffmpeg-svn-16676 --enable-libspeex\ --extra-libs="/mnt/ffmpeg-repository/tools/lib/libz.a /mnt/ffmpeg-repository/tools/lib/libbz2.a \ -pthread -lm /mnt/ffmpeg-repository/tools/lib/libamrnb.a -lm /mnt/ffmpeg-repository/tools/lib/libamrwb.a \ -lm /mnt/ffmpeg-repository/tools/lib/libfaac.a /mnt/ffmpeg-repository/tools/lib/libgsm.a /mnt/ffmpeg-repository/tools/lib/libmp3lame.a \ -lm /mnt/ffmpeg-repository/tools/lib/libspeex.a /mnt/ffmpeg-repository/tools/lib/libtheora.a /usr/lib/libogg.a /usr/local/lib/libx264.a \ -lm /usr/local/lib/libxvidcore.a /usr/lib/libvorbis.a /usr/lib/libvorbisfile.a /usr/lib/libvorbisenc.a /usr/lib/libfaad.a -ldl -ldl" make