2012-02-03 10 views
5

He estado yendo en esto, literalmente por días. Estoy intentando construir FFmpeg con libmp3lame para usar en una aplicación de Android. El script de construcción establece un indicador --sysroot que apunta al directorio Android NDK necesario para construir estas bibliotecas de forma que Android pueda usarlas.¿Cómo puedo obtener FFmpeg para localizar las bibliotecas instaladas cuando --sysroot apunta a otro directorio?

El problema aparece cuando agrego la marca a --enable-libmp3lame; Obtengo ERROR: libmp3lame >= 3.98.3 not found durante el inicio de compilación. Sé que LAME y sus bibliotecas están instaladas, porque puedo ejecutar ./configure --enable-libmp3lame manualmente y la configuración se inicia sin problemas y muestra que libmp3lame está habilitado para esta compilación. Sin embargo, construir así simplemente no funcionará para lo que necesito, ya que necesito que el NDK de Android haga algo de trabajo.

He rastreado el problema hasta el hecho de que este script de construcción está declarando la sysroot, ya través de algunas investigaciones, he intentado añadir -Luser/include, -L/user/include a los cflags adicionales, y ldflags (que he leído es la ubicación de búsqueda predeterminada para gcc). También he intentado varias otras cosas, pero confío en que alguien aquí pueda ayudarme con este problema específico. Toda esta escritura de la estructura es la siguiente:

Información adicional:

  • Build OS: Ubuntu 11.10
  • FFmpeg Ver: Lo último de git
  • LAME Ver: 3.9.x
  • Android NDK: R7

build.sh

#!/bin/bash 

if [ "$NDK" = "" ]; then 
    echo NDK variable not set, assuming ${HOME}/android-ndk 
    export NDK=${HOME}/android-ndk 
fi 

SYSROOT=$NDK/platforms/android-3/arch-arm 
# Expand the prebuilt/* path into the correct one 
TOOLCHAIN=`echo $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/*-x86` 
export PATH=$TOOLCHAIN/bin:$PATH 

rm -rf build/ffmpeg 
mkdir -p build/ffmpeg 
cd ffmpeg 

# Don't build any neon version for now 
for version in armv5te armv7a; do 

     DEST=../build/ffmpeg 
     FLAGS="--target-os=linux --cross-prefix=arm-linux-androideabi- --arch=arm" 
     FLAGS="$FLAGS --sysroot=$SYSROOT" 
     FLAGS="$FLAGS --soname-prefix=/data/data/net.smartnotes/lib/" 
     FLAGS="$FLAGS --enable-shared --disable-symver" 
     FLAGS="$FLAGS --enable-small --optimization-flags=-O2" 
     FLAGS="$FLAGS --disable-everything --enable-protocol=file" 
     FLAGS="$FLAGS --enable-libmp3lame --enable-encoder=nellymoser" 

     case "$version" in 
       neon) 
        EXTRA_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon" 
        EXTRA_LDFLAGS="-Wl,--fix-cortex-a8" 
        # Runtime choosing neon vs non-neon requires 
        # renamed files 
        ABI="armeabi-v7a" 
        ;; 
       armv7a) 
        # I have tried many things here. 
        EXTRA_CFLAGS="-march=armv7-a -mfloat-abi=softfp" 
        EXTRA_LDFLAGS="" 
        ABI="armeabi-v7a" 
        ;; 
       *) 
        # I have tried many things here. 
        EXTRA_CFLAGS="-Luser/include" 
        EXTRA_LDFLAGS="" 
        ABI="armeabi" 
        ;; 
     esac 
     DEST="$DEST/$ABI" 
     FLAGS="$FLAGS --prefix=$DEST" 

     mkdir -p $DEST 
     echo $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" > $DEST/info.txt 
     ./configure $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" | tee $DEST/configuration.txt 
     [ $PIPESTATUS == 0 ] || exit 1 
     make clean 
     make -j4 || exit 1 
     make install || exit 1 

done 

Respuesta

1

En lugar de cambiar las rutas de inclusión, ¿por qué no intenta copiar todos los archivos libmp3lame que fueron creados por 'make install' en el directorio relevante donde la secuencia de comandos los buscará. Inserte las declaraciones de ECHO para descubrir exactamente qué PATH/CFLAGS/LDFLAGS están en el punto donde obtiene el error, y copie los archivos allí para que los encuentre.

+0

Realmente no sé dónde se instalaron los archivos libmp3lame reales. Intenté/user/include y había un archivo cojo/lame.h que estaba allí, y lo puse en [..] android-ndk/platforms/android-3/arch-arm/user/include/Lame dir, sin embargo eso no ha ayudado. Tengo la molesta sospecha de que el archivo de encabezado por sí solo no será suficiente para cortarlo. También intenté copiar y pegar una carpeta llena de encabezados LAME y archivos C en el directorio anterior, también. –

+0

Copiar solo 1 archivo o 1 carpeta no funcionará, por supuesto. Debe estar seguro de haber copiado absolutamente todos los archivos y carpetas necesarios, en los lugares correctos. Si recuerdo correctamente, 'make install' debería imprimir todos los archivos que ha copiado, para que pueda reconstruir LAME y cuando haga 'make install' tome nota de todos los nombres y carpetas de los archivos. – sashoalm

+0

Gracias, lo hice al descargar LAME source y lo extraje en un directorio. Cuando llamé a 'configure' lo hice --prefix = (especificó el directorio en el que se deberían generar estos archivos). Completó la instalación make y tomó el directorio include y lib, y lo guardó en el directorio de inclusión y lib de Android NDK, respectivamente. Todavía no pude hacer que esto funcione. Dejé de intentar usar FFmpeg para manejar LAME para mí, y volví a usar una versión nativa de LAME en mi aplicación (que puedo ponerme a trabajar, pero la salida de audio no es correcta). [...] –

1

vi que estaba utilizando el proyecto ubicado en http://bambuser.com/opensource

que tenía el mismo problema y resuelto de esta manera:

  1. compilar cojo para android usando https://github.com/intervigilium/liblame
  2. este es un pequeño diff entre el original build.sh de "bambuser.com" y el que utilicé:

    3c3,6 
    < export NDK=${HOME}/downloads/android-ndk # r8d 
    --- 
    > if [ "$NDK" = "" ]; then 
    >  echo NDK variable not set, assuming ${HOME}/android-ndk 
    >  export NDK=${HOME}/android-ndk 
    > fi 
    15,16c18 
    < #for version in armv5te armv7a; do 
    < for version in   armv7a; do 
    --- 
    > for version in armv5te armv7a; do 
    24c26 
    <  FLAGS="$FLAGS --disable-everything --enable-libmp3lame" 
    --- 
    >  FLAGS="$FLAGS --disable-everything" 
    
  3. del proyecto "intervigilium" copia de la carpeta liblame/jni/lame a PATH_TO_NDK/platforms/android-3/arch-arm/usr/include

  4. de copia del proyecto "intervigilium" liblame/libs/armeabi-v7a/liblame.so a PATH_TO_NDK/platforms/android-3/arch-arm/usr/libs y RENAME en libmp3lame.so.
  5. finalmente ejecuta build.sh.
  6. que debe estar bien:

    install prefix   ../build/ffmpeg/armeabi-v7a 
    source path    /home/samuele/downloads/ffmpeg/ffmpeg-android/ffmpeg 
    C compiler    arm-linux-androideabi-gcc 
    ARCH      arm (generic) 
    big-endian    no 
    runtime cpu detection  no 
    ARMv5TE enabled   yes 
    ARMv6 enabled    yes 
    ARMv6T2 enabled   yes 
    ARM VFP enabled   yes 
    IWMMXT enabled   no 
    NEON enabled    no 
    debug symbols    yes 
    strip symbols    yes 
    optimizations    small 
    static     yes 
    shared     yes 
    postprocessing support no 
    new filter support  yes 
    network support   yes 
    threading support   pthreads 
    SDL support    no 
    Sun medialib support  no 
    AVISynth enabled   no 
    frei0r enabled   no 
    libdc1394 support   no 
    libdirac enabled   no 
    libfaac enabled   no 
    libgsm enabled   no 
    **libmp3lame enabled  yes** 
    libnut enabled   no 
    libopencore-amrnb support no 
    libopencore-amrwb support no 
    libopencv support   no 
    libopenjpeg enabled  no 
    librtmp enabled   no 
    libschroedinger enabled no 
    libspeex enabled   no 
    libtheora enabled   no 
    libvorbis enabled   no 
    libvpx enabled   no 
    libx264 enabled   no 
    libxavs enabled   no 
    libxvid enabled   no 
    zlib enabled    no 
    bzlib enabled    no 
    
    Enabled decoders: 
    
    Enabled encoders: 
    mpeg2video  nellymoser 
    
    Enabled hwaccels: 
    
    Enabled parsers: 
    
    Enabled demuxers: 
    
    Enabled muxers: 
    
    Enabled protocols: 
    
    Enabled filters: 
    buffer 
    
    Enabled bsfs: 
    
    Enabled indevs: 
    
    Enabled outdevs: 
    
    License: LGPL version 2.1 or later 
    Creating config.mak and config.h... 
    libavutil/avconfig.h is unchanged 
    

Tenga en cuenta, todavía tengo que probar la acumulación FFmpeg resultante. A decir verdad, ahora tengo que aprender cómo a usarlo en mi aplicación ...;)

EDIT: He intentado quitar --disable-everything y se construye Aceptar la misma, con una gran cantidad de codificadores, decodificadores, etc. , pero aumentando a ~ 40MB para el build dir.

Cuestiones relacionadas