Ich kompiliere FFMPEG aus dem Quellcode mitdie Anleitung für Ubuntudie ich zuvor mit Erfolg verwendet habe.
Ich kompiliere auf einer Vagrant-VM in VirtualBox auf Ubuntu Server 14.04. Sie können das Projekt klonen und vagrant up
, und FFMPEG ist in der Box installiert:github.com/rfkrocktk/vagrant-ffmpeg.
Ich verwende Ansible, um die Kompilierung zu automatisieren, sodass Sie alle Schritte sehen könnenHier:
---
- hosts: all
tasks:
# version control
- apt: name=git
- apt: name=mercurial
# build tools
- apt: name=build-essential
- apt: name=autoconf
- apt: name=automake
- apt: name=cmake
- apt: name=pkg-config
- apt: name=texinfo
- apt: name=yasm
# libraries
- apt: name=libass-dev
- apt: name=libfreetype6-dev
- apt: name=libsdl1.2-dev
- apt: name=libtheora-dev
- apt: name=libtool
- apt: name=libva-dev
- apt: name=libvdpau-dev
- apt: name=libvorbis-dev
- apt: name=libxcb1-dev
- apt: name=libxcb-shm0-dev
- apt: name=libxcb-xfixes0-dev
- apt: name=zlib1g-dev
- apt: name=libopus-dev
- apt: name=libmp3lame-dev
- apt: name=libx264-dev
# dependent libraries
# libx265
- name: clone libx265
command: hg clone https://bitbucket.org/multicoreware/x265 /usr/src/x265
args:
creates: /usr/src/x265
- name: configure libx265
command: cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/usr/local -DENABLED_SHARED:bool=off ../../source
args:
chdir: /usr/src/x265/build/linux
creates: /usr/src/x265/build/linux/Makefile
- name: compile libx265
command: make -j2
args:
chdir: /usr/src/x265/build/linux
creates: /usr/src/x265/build/linux/x265
- name: install libx265
command: make install
args:
chdir: /usr/src/x265/build/linux
creates: /usr/local/bin/x265
# libfdk-aac
- name: clone libfdk-aac
command: git clone https://github.com/mstorsjo/fdk-aac.git /usr/src/libfdk-aac
args:
creates: /usr/src/libfdk-aac
- name: autoconf libfdk-aac
command: autoreconf -fiv
args:
chdir: /usr/src/libfdk-aac
creates: /usr/src/libfdk-aac/configure
- name: configure libfdk-aac
command: /usr/src/libfdk-aac/configure --prefix=/usr/local --disable-shared
args:
chdir: /usr/src/libfdk-aac
creates: /usr/src/libfdk-aac/libtool
- name: compile libfdk-aac
command: make -j2
args:
chdir: /usr/src/libfdk-aac
creates: /usr/src/libfdk-aac/libFDK/src/FDK_core.o
- name: install libfdk-aac
command: make install
args:
chdir: /usr/src/libfdk-aac
creates: /usr/local/lib/libfdk-aac.a
# libvpx
- name: download libvpx
shell: wget -O - https://storage.googleapis.com/downloads.webmproject.org/releases/webm/libvpx-1.4.0.tar.bz2 | tar xjvf -
args:
chdir: /usr/src
creates: /usr/src/libvpx-1.4.0
- name: configure libvpx
command: ./configure --prefix=/usr/local --disable-examples --disable-unit-tests
args:
chdir: /usr/src/libvpx-1.4.0
creates: /usr/src/libvpx-1.4.0/Makefile
- name: compile libvpx
command: make -j2
args:
chdir: /usr/src/libvpx-1.4.0
creates: /usr/src/libvpx-1.4.0/libvpx.a
- name: install libvpx
command: make install
args:
chdir: /usr/src/libvpx-1.4.0
creates: /usr/local/lib/libvpx.a
# ffmpeg itself
- name: download ffmpeg
shell: wget -O - "https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2" | tar xjvf -
args:
chdir: /usr/src
creates: /usr/src/ffmpeg
- name: configure ffmpeg
shell: PKG_CONFIG_PATH=/usr/local/lib/pkgconfig /usr/src/ffmpeg/configure \
--prefix=/usr/local \
--pkg-config-flags='--static' \
--bindir=/usr/local/bin \
--enable-gpl --enable-version3 --enable-nonfree \
--enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame \
--enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx \
--enable-libx264 --enable-libx265
args:
chdir: /usr/src/ffmpeg
creates: /usr/src/ffmpeg/config.asm
- name: compile ffmpeg
command: make -j2
args:
chdir: /usr/src/ffmpeg
creates: /usr/src/ffmpeg/ffmpeg
- name: install ffmpeg
command: make install
args:
chdir: /usr/src/ffmpeg
creates: /usr/local/bin/ffmpeg
Auch wenn Sie Ansible nicht kennen, ist Ihnen hoffentlich klar, was hier passiert.
Mein Problem besteht darin, dass ich, selbst wenn dies alles erfolgreich ausgeführt wurde, beim Ausführen ffmpeg
innerhalb des Computers die folgende Fehlermeldung erhalte:
ffmpeg: error while loading shared libraries: libx265.so.77: cannot open shared object file: No such file or directory
Ich kann die Datei eindeutig finden:
$ find /usr -iname libx265.so.77
/usr/local/lib/libx265.so.77
Warum wird das nicht gefunden? Habe ich etwas in der Kompilierungsanleitung übersehen? Ich möchte, dass meine Binärdateien so portabel wie irgend möglich sind.
Bearbeiten
Ausgabe von ldd $(which ffmpeg)
:
linux-vdso.so.1 => (0x00007fff552ea000)
libva.so.1 => /usr/lib/x86_64-linux-gnu/libva.so.1 (0x00007f2fb3b45000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f2fb3926000)
libxcb-shm.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007f2fb3722000)
libxcb-xfixes.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-xfixes.so.0 (0x00007f2fb351b000)
libxcb-shape.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shape.so.0 (0x00007f2fb3317000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f2fb2fe1000)
libasound.so.2 => /usr/lib/x86_64-linux-gnu/libasound.so.2 (0x00007f2fb2cf1000)
libSDL-1.2.so.0 => /usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0 (0x00007f2fb2a5b000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2fb2754000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2fb2536000)
libx265.so.77 => not found
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f2fb232d000)
libx264.so.142 => /usr/lib/x86_64-linux-gnu/libx264.so.142 (0x00007f2fb1f97000)
libvorbisenc.so.2 => /usr/lib/x86_64-linux-gnu/libvorbisenc.so.2 (0x00007f2fb1ac8000)
libvorbis.so.0 => /usr/lib/x86_64-linux-gnu/libvorbis.so.0 (0x00007f2fb189a000)
libtheoraenc.so.1 => /usr/lib/x86_64-linux-gnu/libtheoraenc.so.1 (0x00007f2fb165a000)
libtheoradec.so.1 => /usr/lib/x86_64-linux-gnu/libtheoradec.so.1 (0x00007f2fb1441000)
libopus.so.0 => /usr/lib/x86_64-linux-gnu/libopus.so.0 (0x00007f2fb11f8000)
libmp3lame.so.0 => /usr/lib/x86_64-linux-gnu/libmp3lame.so.0 (0x00007f2fb0f6b000)
libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f2fb0cc8000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f2fb0aae000)
libass.so.4 => /usr/lib/x86_64-linux-gnu/libass.so.4 (0x00007f2fb088a000)
libvdpau.so.1 => /usr/lib/x86_64-linux-gnu/libvdpau.so.1 (0x00007f2fb0686000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2fb02bf000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2fb00bb000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f2fafeb7000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f2fafcb0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2fb3d66000)
libpulse-simple.so.0 => /usr/lib/x86_64-linux-gnu/libpulse-simple.so.0 (0x00007f2fafaac000)
libpulse.so.0 => /usr/lib/x86_64-linux-gnu/libpulse.so.0 (0x00007f2faf862000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f2faf650000)
libcaca.so.0 => /usr/lib/x86_64-linux-gnu/libcaca.so.0 (0x00007f2faf383000)
libogg.so.0 => /usr/lib/x86_64-linux-gnu/libogg.so.0 (0x00007f2faf179000)
libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f2faef53000)
libfribidi.so.0 => /usr/lib/x86_64-linux-gnu/libfribidi.so.0 (0x00007f2faed3b000)
libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f2faeaff000)
libenca.so.0 => /usr/lib/x86_64-linux-gnu/libenca.so.0 (0x00007f2fae8cc000)
libpulsecommon-4.0.so => /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-4.0.so (0x00007f2fae664000)
libjson-c.so.2 => /lib/x86_64-linux-gnu/libjson-c.so.2 (0x00007f2fae45a000)
libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007f2fae214000)
libslang.so.2 => /lib/x86_64-linux-gnu/libslang.so.2 (0x00007f2fade84000)
libncursesw.so.5 => /lib/x86_64-linux-gnu/libncursesw.so.5 (0x00007f2fadc50000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f2fada26000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f2fad7fc000)
libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007f2fad5f1000)
libsndfile.so.1 => /usr/lib/x86_64-linux-gnu/libsndfile.so.1 (0x00007f2fad389000)
libasyncns.so.0 => /usr/lib/x86_64-linux-gnu/libasyncns.so.0 (0x00007f2fad183000)
libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007f2facf68000)
libFLAC.so.8 => /usr/lib/x86_64-linux-gnu/libFLAC.so.8 (0x00007f2facd37000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f2facb1b000)
Ausgabe von file /usr/local/lib/libx265.so.77
:
/usr/local/lib/libx265.so.77: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=f91388281cc2dba1dfe37797324dc6b3898d8d1b, not stripped
LD_LIBRARY_PATH
ist in Umgebungsvariablen nicht definiert.
Auch das:
$ grep -r local /etc/ld.so.conf.d/
/etc/ld.so.conf.d/libc.conf:/usr/local/lib
Meine Arbeitstheorie ist, dass command
alles kaputt geht, weil das Ansible-Modul Umgebungsvariablen entfernt.
Ich denke, dass mit dem FFMPEG- oder x265-Build etwas nicht stimmt. Ich habe --enable-libx265
den FFMPEG-Konfigurationsbefehl entfernt und habe jetzt ein funktionierendes FFMPEG.
Antwort1
Mein Problem lag darin, dass ich ldconfig
nach der Installation von allem nie lief.
Damit gemeinsam genutzte Objektbibliotheken unter Debian gefunden werden können, müssen Sie sudo ldconfig
den Cache der gemeinsam genutzten Bibliotheken neu erstellen.