Compilando o FFMPEG da fonte: não é possível encontrar a biblioteca compartilhada

1

Estou compilando o FFMPEG a partir do código-fonte usando o guia para o Ubuntu que usei antes com sucesso.

Estou compilando em uma máquina virtual Vagrant no VirtualBox no servidor Ubuntu 14.04. Você pode clonar o projeto e vagrant up , e você terá o FFMPEG instalado na caixa: github.com/rfkrocktk/vagrant-ffmpeg .

Estou usando o Ansible para automatizar a compilação, para que você possa ver todas as etapas aqui :

---
- 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

Espero que, mesmo que você não saiba Ansible, deve ficar claro o que isso está fazendo.

O problema que estou tendo é que mesmo depois de tudo isso funcionar com sucesso, quando eu executo ffmpeg de dentro da máquina, recebo o seguinte erro:

ffmpeg: error while loading shared libraries: libx265.so.77: cannot open shared object file: No such file or directory

Eu posso encontrar claramente o arquivo:

$ find /usr -iname libx265.so.77
/usr/local/lib/libx265.so.77

Por que isso não está sendo encontrado? Estou faltando alguma coisa no guia de compilação? Eu gostaria que meus binários fossem tão portáteis quanto humanamente possível.

Editar

saída 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)

saída 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 é indefinido em variáveis de ambiente.

Também isso:

 $ grep -r local /etc/ld.so.conf.d/
 /etc/ld.so.conf.d/libc.conf:/usr/local/lib

Minha teoria de trabalho é que, como o módulo Ansible command remove as variáveis de ambiente, tudo quebra.

Estou pensando que há algo errado com o build do FFMPEG ou do x265. Eu removi --enable-libx265 do comando configure do FFMPEG e agora tenho um FFMPEG funcionando.

    
por Naftuli Kay 04.11.2015 / 18:33

1 resposta

2

Meu problema reside no fato de que eu nunca executei ldconfig depois de instalar tudo.

Para que bibliotecas de objetos compartilhados sejam encontradas no Debian, você deve executar sudo ldconfig para reconstruir o cache da biblioteca compartilhada.

    
por 05.11.2015 / 23:34