2012-01-11 23 views
10

Estoy intentando construir FFMPEG con libx264 para Android.Construye FFMPEG con x264 para Android

Puedo construir y usar FFMPEG para Android con éxito, pero me di cuenta de que necesito la capacidad de codificar, por lo tanto, estoy tratando de compilar FFMPEG con x264.

estoy usando este tutorial para construir FFmpeg para Android http://www.roman10.net/how-to-build-ffmpeg-for-android/

Cuando se trata de construir FFMPEG consigo un error:

"ERROR: libx264 not found"

Y en mi registro que dice:

"/usr/local/lib/libx264.a: could not read symbols: Archive has no index; run ranlib to add one..."

Tengo las últimas versiones de FFMPEG y x264. entiendo que FFMPEG busca la cabecera y las bibliotecas en usr/lib y usr/include, por lo que con el fin de hacer que encontrar x264 utilizo los cflags y ldflags:

  • --extra-cflags = "-I/usr/local/include "
  • --extra-ldflags =" -L/usr/local/lib "

he tratado x264 edificio con muchas opciones diferentes que otras personas en Internet han dicho que Necesito. p.ej. --enable-shared, --enable-static, --disable-pthreads etc. Algunos foros dicen habilitar esto, otros dicen que no deshabilitar eso.

Cualquier ayuda sería muy apreciada, Gracias

EDIT:

Si construyo FFmpeg con los comandos simples para incluir libx264 entonces funciona. es decir.

./configure --enable-gpl --enable-libx264 --extra-cflags="-I/usr/local/include" --extra-ldflags="-L/usr/local/lib" --enable-static --enable-shared 

Sin embargo, lo necesito para Android. El script que estoy usando es:

NDK=~/Desktop/android-ndk-r7 
PLATFORM=$NDK/platforms/android-8/arch-arm/ 
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86 
function build_one 
{ 
./configure --target-os=linux \ 
    --prefix=$PREFIX \ 
    --enable-cross-compile \ 
    --enable-shared \ 
    --enable-static \ 
    --extra-libs="-lgcc" \ 
    --arch=arm \ 
    --cc=$PREBUILT/bin/arm-linux-androideabi-gcc \ 
    --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \ 
    --nm=$PREBUILT/bin/arm-linux-androideabi-nm \ 
    --sysroot=$PLATFORM \ 
    --extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 $OPTIMIZE_CFLAGS -I/usr/local/include" \ 
    --extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L $PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog -L/usr/local/lib " \ 
    --enable-gpl \ 
    --enable-libx264 \ 
    --disable-everything \ 
    --enable-demuxer=mov \ 
    --enable-demuxer=h264 \ 
    --disable-ffplay \ 
    --enable-protocol=file \ 
    --enable-avformat \ 
    --enable-avcodec \ 
    --enable-decoder=rawvideo \ 
    --enable-decoder=mjpeg \ 
    --enable-decoder=h263 \ 
    --enable-decoder=mpeg4 \ 
    --enable-decoder=h264 \ 
    --enable-encoder=mjpeg \ 
    --enable-encoder=h263 \ 
    --enable-encoder=mpeg4 \ 
    --enable-encoder=h264 \ 
    --enable-parser=h264 \ 
    --disable-network \ 
    --enable-zlib \ 
    --disable-avfilter \ 
    --disable-avdevice \ 
    $ADDITIONAL_CONFIGURE_FLAG 

make clean 
make -j4 install 
$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o 
$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -soname libffmpeg.so -shared -nostdlib -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a 
} 

CPU=armv7-a 
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU " 
PREFIX=./android/$CPU 
ADDITIONAL_CONFIGURE_FLAG= 
build_one 

Supongo que alguna opción en mi comando configure está en conflicto con la activación de libx264

NOTA: Si quito enable-libx264 entonces funciona

+0

Si construyo tanto x264 y FFmpeg con --disable-estática y compartida --enable, entonces sigo teniendo el mismo error, pero esta vez en mi registro que hay más dice "... no podía leer símbolos ..." pero en su lugar dice "no puedo encontrar -lx264 ..." – Kage

+0

¿Cómo instalaste x264? ¿Lo instaló descargando la fuente y haciendo './configure', 'make', 'make install', o hizo otra cosa? Además, ¿cuál es su sistema de compilación - * nix o Windows (con cygwin/msys)? – sashoalm

+0

He descargado la fuente y he utilizado .configure, make, make install Im en un mac (10.7) – Kage

Respuesta

3

Yo tuve el mismo problema. Pero después de degradar NDK a la versión 5c funciona como lo describe halfninja. (ubuntu 64bit). parece que hay algunos cambios en la cadena de herramientas de 5 a 7.

[email protected]:/tmp/android-ffmpeg-x264/Project/jni$ ndk-build 
Compile thumb : ffmpeg <= ffmpeg.c 
Compile thumb : ffmpeg <= cmdutils.c 
Executable  : ffmpeg 
Install  : ffmpeg => libs/armeabi/ffmpeg 
Compile thumb : videokit <= uk_co_halfninja_videokit_Videokit.c 
Compile thumb : videokit <= ffmpeg.c 
Compile thumb : videokit <= cmdutils.c 
SharedLibrary : libvideokit.so 
Install  : libvideokit.so => libs/armeabi/libvideokit.so 
+0

¿Cómo puedo usar esto para ejecutar comandos ffmpeg en android? ¿Tengo que elegir la opción "agregar soporte nativo" en eclipse para usar estas bibliotecas? –

1

he descubierto la opción --enable-estática no tiene ningún efecto sobre el comportamiento de ffmpeg libx264 vinculación. Me las arreglé para construir una copia de ffmpeg con libx264 incluye de manera estática mediante la edición del config.mak después de que me había corrido ./configure x264

  • Construir desde la fuente en otro directorio
  • Añadir libx264.a a la línea de EXTRALIBS config.mak
  • Eliminar -lx264 de la línea EXTRALIBS en config.MAK

Antes

EXTRALIBS=-ldl -lX11 -lx264 etc. 

Después

EXTRALIBS=/home/adam/x264sourcebuild/libx264.a -ldl -lX11 etc. 
3

El código fuente ffmpeg parece estar actualizada, y pude compilar ffmpeg con x264 para Android NDK como el siguiente.

1 Descargar archivo git android-ffmpeg-x264 del halfninja de https://github.com/halfninja/android-ffmpeg-x264

2 En el directorio "halfninja-android-ffmpeg-x264-fe12be0/Proyecto/JNI", modificar "configure_ffmpeg.sh" vincular "libgcc .a "para resolver un problema que no puede resolver" __aeabi_f2uiz ".

./configure $DEBUG_FLAG --enable-cross-compile \ 
--arch=arm5te \ 
--enable-armv5te \ 
--target-os=linux \ 
--disable-stripping \ 
--prefix=../output \ 
--disable-neon \ 
--enable-version3 \ 
--disable-shared \ 
--enable-static \ 
--enable-gpl \ 
--enable-memalign-hack \ 
--cc=arm-linux-androideabi-gcc \ 
--ld=arm-linux-androideabi-ld \ 
--extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -I../x264 -Ivideokit" \ 
$featureflags \ 
--disable-ffmpeg \ 
--disable-ffplay \ 
--disable-ffprobe \ 
--disable-ffserver \ 
--disable-network \ 
--enable-filter=buffer \ 
--enable-filter=buffersink \ 
--disable-demuxer=v4l \ 
--disable-demuxer=v4l2 \ 
--disable-indev=v4l \ 
--disable-indev=v4l2 \ 
--extra-ldflags="-L../x264 -L../toolchain/lib/gcc/arm-linux-androideabi/4.4.3" \ 
--extra-libs="-lgcc" 

3 Modificar "Android.mk" para vincular la nueva biblioteca "libswresample.a".

FFMPEG_LIBS := $(addprefix ffmpeg/, \ 
libavdevice/libavdevice.a \ 
libavformat/libavformat.a \ 
libavcodec/libavcodec.a \ 
libavfilter/libavfilter.a \ 
libswscale/libswscale.a \ 
libavutil/libavutil.a \ 
libswresample/libswresample.a \ 
libpostproc/libpostproc.a) 

4 Reemplazar ffmpeg.c y cmdutils.c en el directorio videokit con los de directorio ffmpeg.

5 Siga el procedimiento descrito en README.textile.

+0

¿Cómo puedo usar esto para ejecutar comandos ffmpeg en android? ¿Tengo que ir a la opción "agregar soporte nativo" en eclipse para usar estas bibliotecas? –

+0

no funciona para mí, ¿qué NDK estás usando? – Guy

2

Estos son mis banderas de trabajo:

x264 (una reciente estables):

./configure --cross-prefix=arm-linux-androideabi- \ 
--enable-pic \ 
--enable-static \ 
--disable-cli \ 
--disable-asm \ 
--host=arm-linux 

ffmpeg (liberación/0,10):

./configure --enable-cross-compile \ 
--arch=arm5te \ 
--enable-armv5te \ 
--target-os=linux \ 
--disable-stripping \ 
--prefix=../output \ 
--disable-neon \ 
--enable-version3 \ 
--disable-shared \ 
--enable-static \ 
--enable-gpl \ 
--enable-memalign-hack \ 
--cc=arm-linux-androideabi-gcc \ 
--ld=arm-linux-androideabi-gcc \ 
--extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated" \ 
--disable-everything \ 
--enable-decoder=h264 \ 
--enable-demuxer=mov \ 
--enable-muxer=mp4 \ 
--enable-encoder=libx264 \ 
--enable-libx264 \ 
--enable-protocol=file \ 
--enable-decoder=aac \ 
--enable-encoder=aac \ 
--disable-ffmpeg \ 
--disable-ffplay \ 
--disable-ffprobe \ 
--disable-ffserver \ 
--disable-network \ 
--enable-filter=buffer \ 
--enable-filter=buffersink \ 
--enable-filter=scale \ 
--disable-demuxer=v4l \ 
--disable-demuxer=v4l2 \ 
--disable-indev=v4l \ 
--disable-indev=v4l2 \ 
--extra-cflags="-I../x264" \ 
--extra-ldflags="-L../x264" \ 
--extra-libs="-lgcc" 

Obviamente tendrá que ajustar los caminos .

2

He creado un sistema de construcción para Android ffmpeg + x264 aquí: https://github.com/guardianproject/android-ffmpeg

Estamos trabajando en alguna capa Java demasiado para ejecutarlo, pero que aún no es realmente utilizable.

+0

es una lástima que solo sea para Debian/Ubuntu, ¿qué tal mac? – shem

+0

Sobre la base de Mac OS X y otros deberían ser posibles, los parches son bienvenidos :) simplemente nos resulta mucho más fácil ejecutar versiones nativas de Android en Debian/Ubuntu que en cualquier otra plataforma, incluidas otras distribuciones de GNU/Linux. –

+0

Error al compilarlo en mac, probablemente porque la lib init deberia hacer antes. – shem

1

he conocido el mismo problema antes, y yo intentado varias veces para averiguar la razón:

Debe asegurarse de que el x264 y la están usando ffmpeg misma manera para compilar. como: usando Android NDK. Usando el mismo compilador gcc.

Así que no puedes compilar ffmpeg con este comando: "- prefijo cruzado = $ PREBUILT/darwin-x86_64/bin/arm-linux-androideabi-", pero compila el x264 sin eso. Aquí es mi x264 script de compilación:

./configure --prefix=$PREFIX \ 
--enable-static \ 
--enable-pic \ 
--disable-asm \ 
--disable-cli \ 
--host=arm-linux \ 
--cross-prefix=$PREBUILT/darwin-x86_64/bin/arm-linux-androideabi- \ 
--sysroot=$PLATFORM 

make 
sudo make install 
sudo ldconfig 
Cuestiones relacionadas