2012-01-11 17 views
10

Próbuję zbudować FFMPEG z libx264 dla Androida.Zbuduj FFMPEG z x264 dla Androida

Mogę z powodzeniem budować i używać FFMPEG dla Androida, ale zdałem sobie sprawę, że potrzebuję możliwości kodowania, dlatego próbuję zbudować FFMPEG z x264.

Używam tego samouczka zbudować FFmpeg dla Androida http://www.roman10.net/how-to-build-ffmpeg-for-android/

Gdy próbuje zbudować FFMPEG pojawia się błąd:

"ERROR: libx264 not found"

I w moim dzienniku jest napisane:

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

Mam najnowsze wersje zarówno FFMPEG, jak i x264. Rozumiem, że FFMPEG wygląda dla nagłówka i biblioteki w usr/lib i usr/include, tak aby uczynić go znaleźć x264 używam CFLAGS i LDFLAGS:

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

próbowałem budynek x264 z wielu różnych opcji, że inne osoby w internecie, powiedział, że potrzebuję. na przykład. --enable-shared, --enable-static, --disable-pthreads itp. Niektóre fora mówią: włącz to, inni mówią, że nie ma możliwości wyłączenia tego.

Każda pomoc będzie mile widziane, Dzięki

EDIT:

Gdybym budować FFmpeg z najprostszych poleceń obejmują libx264 to działa. tj.

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

Jednak potrzebuję go do pracy na Androida. Skrypt używam jest:

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 

Jestem zgadywania, że ​​niektóre opcja w moim poleceniem konfiguracyjnym jest sprzeczne z umożliwiając libx264

UWAGA: Jeśli usunąć --enable-libx264 to działa

+0

Jeśli budować zarówno x264 i FFmpeg z --disable-statyczne i --enable-shared, to wciąż ten sam błąd, ale tym razem w moim dzienniku nim nie już mówi "... nie mógł odczytać symboli ...", ale zamiast tego mówi "nie można znaleźć -lx264 ..." – Kage

+0

Jak zainstalowałeś x264? Czy zainstalowałeś go, pobierając źródło i wykonując "./configure", "make", "make install", czy zrobiłeś coś innego? Co to jest twój system kompilacji - * nix lub Windows (z cygwin/msys)? – sashoalm

+0

Pobrałem źródło i użyłem .configure, make, make install Jestem na komputerze Mac (10.7) – Kage

Odpowiedz

3

Miałem ten sam problem. Ale po obniżeniu NDK do wersji 5c działa tak, jak opisuje to półninja. (ubuntu 64bit). nie wydaje się być pewne zmiany w toolchain od 5 do 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

Jak mogę tego użyć, aby uruchamiać polecenia ffmpeg w systemie Android? Czy muszę użyć opcji "dodaj natywne wsparcie" w środowisku Eclipse, aby móc korzystać z tych bibliotek? –

1

odkryłem --enable-static opcji nie ma żadnego wpływu na ffmpeg łączącej zachowanie dla libx264. Udało mi się zbudować kopię ffmpeg z libx264 zawarte statycznie poprzez edycję config.mak po bym uruchomić ./configure x264

  • budować od źródła w innym katalogu
  • Dodaj libx264.a linii EXTRALIBS w config.mak
  • Usuń -lx264 z linii EXTRALIBS w config.mak

Przed

EXTRALIBS=-ldl -lX11 -lx264 etc. 

Po

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

Kod źródłowy FFmpeg wydaje się być na bieżąco i mogę skompilować ffmpeg z x264 Android NDK jak poniżej.

1 Pobierz halfninja Android-ffmpeg-x264 plik git z https://github.com/halfninja/android-ffmpeg-x264

2 przy "halfninja-android-ffmpeg-x264-fe12be0/Project/JNI" katalogu "modyfikować" configure_ffmpeg.sh na link „libgcc .a "w celu rozwiązania problemu, który nie może rozwiązać" __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 Modyfikuj "Android.mk" połączyć nową bibliotekę "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 Wymienić ffmpeg.c i cmdutils.c w katalogu videokit z nich w katalogu ffmpeg.

5 Wykonaj procedurę opisaną w README.textile.

+0

Jak mogę tego użyć, aby uruchamiać polecenia ffmpeg w systemie Android? Czy muszę użyć opcji "dodaj natywne wsparcie" w środowisku Eclipse, aby móc korzystać z tych bibliotek? –

+0

nie działa dla mnie, którego używasz NDK? – Guy

2

To są moje flagi pracy:

x264 (ostatnie stabilne):

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

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

Oczywiście trzeba będzie dostosować ścieżki .

2

Mam ułożyła Android system kompilacji dla ffmpeg + x264 tutaj: https://github.com/guardianproject/android-ffmpeg

pracujemy nad jakimś owijki Java też do biegania, ale to nie jest jeszcze bardzo użyteczny.

+0

Szkoda, że ​​to tylko do Debiana/Ubuntu, a co z mac? – shem

+0

Budowanie na Mac OS X i innych powinno być możliwe, łatki mile widziane :) dla nas po prostu łatwiej jest uruchomić natywne kompilacje Androida na Debianie/Ubuntu niż jakakolwiek inna platforma, w tym inne dystrybucje GNU/Linux. –

+0

Nie można skompilować go na komputerze mac, prawdopodobnie dlatego, że lib init powinieneś zrobić wcześniej. – shem

1

ja zanim spotkał ten sam problem, a ja próbowałem kilka razy, aby znaleźć przyczynę:

należy upewnić się, czy x264 i ffmpeg używasz sam sposób skompilować. na przykład: przy użyciu Android NDK. Korzystanie z tego samego kompilatora gcc.

Więc nie możesz skompilować ffmpeg za pomocą tego polecenia: "- cross-prefix = $ PREBUILT/darwin-x86_64/bin/arm-linux-androideabi-", ale skompiluj x264 bez tego. Oto mój x264 skrypt kompilacji:

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