2012-01-11 21 views
10

Sto provando a creare FFMPEG con libx264 per Android.Crea FFMPEG con x264 per Android

Posso creare e utilizzare FFMPEG per Android con successo ma mi sono reso conto che ho bisogno della codifica, quindi sto cercando di creare FFMPEG con x264.

Sto usando questo tutorial per costruire FFmpeg per Android http://www.roman10.net/how-to-build-ffmpeg-for-android/

Quando si cerca di costruire FFMPEG ho un errore:

"ERROR: libx264 not found"

E nel mio ceppo si dice:

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

Ho le ultime versioni di FFMPEG e x264. Capisco che FFMPEG cerca l'intestazione e le librerie in usr/lib e usr/include, così al fine di renderlo trovare x264 io uso CFLAGS e LDFLAGS:

  • --extra-CFLAGS = "-I/usr/local/include "
  • --extra-LDFLAGS =" -L/usr/local/lib "

ho cercato x264 edificio con molte diverse opzioni che le altre persone su internet hanno detto che ho bisogno. per esempio. --enable-shared, --enable-static, --disable-pthreads ecc. Alcuni forum dicono di abilitare questo, altri dicono no disable that.

Qualsiasi aiuto sarebbe molto apprezzato, Grazie

EDIT:

Se io costruisco FFmpeg con i comandi più semplici per includere libx264 allora funziona. ie.

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

Tuttavia, ho bisogno che funzioni per Android. Lo script che sto usando è:

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 

sto indovinando che qualche opzione nel mio comando configure è in conflitto con abilitazione libx264

NOTA: Se rimuovo --enable-libx264 allora funziona

+0

Se costruisco sia x264 e FFmpeg con --disable-statica e --enable-shared, poi ho ancora ottenere lo stesso errore, ma questa volta nel mio ceppo di essa non dice più "... could not read symbols ..." ma dice "non riesci a trovare -lx264 ..." – Kage

+0

Come hai installato x264? L'hai installato scaricando il sorgente e facendo './configure', 'make', 'make install', o hai fatto qualcos'altro? Inoltre, qual è il tuo sistema di compilazione - * nix o Windows (con cygwin/msys)? – sashoalm

+0

Ho scaricato l'origine e utilizzato .configure, make, make install Im su un mac (10.7) – Kage

risposta

3

Ho avuto lo stesso problema. Ma dopo aver effettuato il downgrade di NDK alla versione 5c, funziona come descritto da halfninja. (ubuntu 64 bit). ci sembrano essere alcuni cambiamenti nella toolchain da 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

Come posso usarlo per eseguire i comandi ffmpeg in Android? Devo andare per l'opzione "aggiungi supporto nativo" in eclipse per utilizzare queste librerie? –

1

ho scoperto l'opzione --enable-static non ha alcun effetto sul comportamento ffmpeg collegamento per libx264. Sono riuscito a costruire una copia di ffmpeg con libx264 incluso staticamente modificando il config.mak dopo mi piacerebbe correre ./configure x264

  • build da sorgenti in un'altra directory
  • Aggiungi libx264.a alla linea EXTRALIBS in config.mak
  • Rimuovere -lx264 dalla riga EXTRALIBS in config.mak

Prima

EXTRALIBS=-ldl -lX11 -lx264 etc. 

Dopo

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

Il codice sorgente ffmpeg sembra essere aggiornato, e ho potuto compilare ffmpeg con x264 per Android NDK come il seguente.

1 Scarica il file git android-ffmpeg-x264 del halfninja da https://github.com/halfninja/android-ffmpeg-x264

2 Alla directory "halfninja-android-ffmpeg-x264-fe12be0/progetto/JNI", modificare al link "libgcc "configure_ffmpeg.sh" .a "per risolvere un problema che non può risolvere" __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 Modifica "Android.mk" per collegare nuova "libswresample.a" libreria.

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 Sostituire ffmpeg.c e cmdutils.c nella directory videokit con quelli nella directory ffmpeg.

5 Seguire una procedura descritta in README.textile.

+0

Come posso usarlo per eseguire i comandi ffmpeg in Android? Devo optare per l'opzione "aggiungi supporto nativo" in eclissi per utilizzare queste librerie? –

+0

non funziona per me, quale NDK stai usando? – Guy

2

Queste sono le mie bandiere di lavoro:

x264 (un recente stabili):

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

ffmpeg (rilascio/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" 

Ovviamente si dovrà regolare i percorsi .

2

Ho messo insieme un sistema di compilazione Android per ffmpeg + x264 qui: https://github.com/guardianproject/android-ffmpeg

Stiamo lavorando su alcuni involucro Java troppo per la sua esecuzione, ma che non è ancora veramente utilizzabile.

+0

peccato che sia solo per Debian/Ubuntu, che ne dici di mac? – shem

+0

Costruire su Mac OS X e altri dovrebbe essere possibile, le patch sono benvenute :) abbiamo trovato molto più semplice eseguire build nativi Android su Debian/Ubuntu di qualsiasi altra piattaforma, incluse altre distribuzioni GNU/Linux. –

+0

Impossibile compilarlo su mac, probabilmente perché la init di lib che dovresti fare prima. – shem

1

ho incontrato lo stesso problema prima, e ho cercato più volte di scoprire il motivo:

È necessario assicurarsi che la x264 e ffmpeg utilizzano allo stesso modo per la compilazione. come: usando Android NDK. Utilizzando lo stesso compilatore gcc.

Quindi non è possibile compilare ffmpeg con questo comando: "- prefisso incrociato = $ PREBUILT/darwin-x86_64/bin/arm-linux-androideabi-", ma compilare x264 senza quello. Qui è la mia x264 sceneggiatura di compilazione:

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