Estoy compilando FFMPEG desde la fuente usandola guía para ubuntuque he usado antes con éxito.
Estoy compilando en una máquina virtual Vagrant en VirtualBox en el servidor Ubuntu 14.04. Puedes clonar el proyecto vagrant up
y tendrás FFMPEG instalado en el cuadro:github.com/rfkrocktk/vagrant-ffmpeg.
Estoy usando Ansible para automatizar la compilación, para que puedas ver todos los pasos.aquí:
---
- 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
Con suerte, incluso si no conoce Ansible, debería quedar claro lo que hace.
El problema que tengo es que incluso después de que todo esto se haya ejecutado correctamente, cuando lo ejecuto ffmpeg
desde la máquina, aparece el siguiente error:
ffmpeg: error while loading shared libraries: libx265.so.77: cannot open shared object file: No such file or directory
Puedo encontrar claramente el archivo:
$ find /usr -iname libx265.so.77
/usr/local/lib/libx265.so.77
¿Por qué no se encuentra esto? ¿Me falta algo en la guía de compilación? Me gustaría que mis binarios fueran lo más portátiles posible.
Editar
salida de 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)
salida de 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
no está definido en las variables de entorno.
También esto:
$ grep -r local /etc/ld.so.conf.d/
/etc/ld.so.conf.d/libc.conf:/usr/local/lib
Mi teoría de trabajo es que debido a que el command
módulo Ansible elimina las variables de entorno, todo se estropea.
Estoy pensando que hay algún problema con la compilación FFMPEG o x265. Eliminé --enable-libx265
el comando de configuración de FFMPEG y ahora tengo un FFMPEG en funcionamiento.
Respuesta1
Mi problema radica en el hecho de que nunca ejecuté ldconfig
después de instalar todo.
Para que las bibliotecas de objetos compartidos se encuentren en Debian, debe ejecutar sudo ldconfig
para reconstruir el caché de la biblioteca compartida.