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
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. –
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
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). [...] –