2013-04-04 4 views
6

Ich baue eine Android-Anwendung, die Bild aus der Kamera Vorschau erfasst und später dekodieren wird. Ich benutze ffmpeg Bibliothek zum Enkodieren und Dekodieren. Um eine statische Bibliothek mit x264 zu erstellen, habe ich dieses Tutorial benutzt. http://dl.dropbox.com/u/22605641/ffmpeg_android/main.html. Als ein Quellcode von ffmpeg, wenn ich den heruntergeladenen von dem Link benutze, den ich im Tutorial gegeben habe, kann ich ihn bauen, kann aber keine Bibliothek erstellen, wenn ich Quellcode von hier heruntergeladen habe git clone git: //source.ffmpeg.org/ffmpeg. git ffmpeg. Ich habe Bibliothek in Ubuntu gebaut und benutze es in Windows 7 in Eclipse. Da ich nur h264 Encoder und Decoder brauche, habe ich folgenden Code für ffmpeg verwendet, leicht modifiziert aus dem Tutorial.avcodec_find_encoder (AV_CODEC_ID_H264) gibt null zurück

#!/bin/bash 

NDK=~/Documents/android-ndk-r8e 
PLATFORM=$NDK/platforms/android-8/arch-arm 
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86 
PREFIX=/home/android-ffmpeg 

function build_one 
{ 
    ./configure --target-os=linux --prefix=$PREFIX \ 
    --enable-cross-compile \ 
    --enable-runtime-cpudetect \ 
    --disable-asm \ 
    --arch=arm \ 
    --cc=$PREBUILT/bin/arm-linux-androideabi-gcc \ 
    --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \ 
    --disable-stripping \ 
    --nm=$PREBUILT/bin/arm-linux-androideabi-nm \ 
    --sysroot=$PLATFORM \ 
    --enable-nonfree \ 
    --enable-version3 \ 
    --disable-everything \ 
    --enable-gpl \ 
    --disable-doc \ 
    --enable-avresample \ 
    --disable-ffplay \ 
    --disable-ffserver \ 
    --enable-ffmpeg \ 
    --disable-ffprobe \ 
    --enable-avcodec \ 
    --enable-libx264 \ 
    --enable-encoder=libx264 \ 
    --enable-encoder=libx264rgb \ 
    --enable-decoder=h263 \ 
    --enable-decoder=h264 \ 
    --enable-decoder=svq3 \ 
    --enable-zlib \ 
    --enable-gpl \ 
    --enable-pic \ 
    --disable-devices \ 
    --disable-avdevice \ 
    --extra-cflags="-I/home/android-ffmpeg/include -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a" \ 
    --extra-ldflags="-L/home/android-ffmpeg/lib" 
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 -L$PREFIX/lib -soname libffmpeg.so -shared -nostdlib -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavfilter/libavfilter.a libavresample/libavresample.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog -lx264 --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a 
} 

build_one 

Nach dem Aufbau der Bibliothek konnte ich android ndk bauen. Ein kleiner Teil meines JNI-Codes ist hier.

JNIEXPORT jint JNICALL Java_com_example_testjava_TestjniActivity_initencoder(JNIEnv* env,jobject obj){ 

    av_register_all(); 
    avcodec_register_all(); 
    codec = avcodec_find_encoder(AV_CODEC_ID_H264); 
    if (!codec) { 
     __android_log_write(ANDROID_LOG_INFO, "debug", "not found");     
     return -1; 
    } 
. 
. 
. 
} 

Wenn ich meine Java-Quellcode ausführen, die ich erhalten -1 als Rückgabewert und logcat prints „nicht gefunden“ initencoder() aufruft. Das bedeutet, avcodec_find_encoder() gibt null zurück und wenn die Bedingung in Ordnung ist. Ich weiss nicht, was falsch ist. Warum gibt diese Funktion null zurück? Ich habe viel gesucht, aber keine Lösung gefunden, die mich in die richtige Richtung lenken könnte. einige sagen, dass sie avcodec_init() verwenden sollen. Der Befehl ndk-build schlägt jedoch fehl und zeigt einen Fehler an, der besagt, dass der Verweis auf 'avcodec_init()' nicht definiert ist. Ich habe mit dem Bau von Bibliotheken begonnen, weil ich dachte, dass ich von der ersten Stufe an falsch liege. Habe ich im Bibliotheksbau einen Fehler gemacht, als hätte ich Dinge nicht aktiviert, die ich tun sollte? Bitte hilf mir hier. Das ist dringend für mich.

+0

Bitte bearbeiten Sie Ihre Post, so dass es eine spezifische Frage enthält. Dies wird es uns erleichtern, Ihnen zu helfen. –

+1

Ich habe genau das gleiche Problem. Soweit ich weiß, hätte 'avcodec_register_all()' sich darum kümmern müssen, hat es aber nicht getan. Funktioniert gut unter Ubuntu, funktioniert aber nicht unter Android. Konnten Sie das Problem lösen? – BVB

+0

Das gleiche Problem.Ist jemand zu lösen? – jerry

Antwort

-1
av_register_all(); already calls avcodec_register_all() inside it. 

Also nicht avcodec_register_all();

+0

Das mag so sein, aber es löst das Problem nicht. –

0

Problem: avcodec_find_encoder gibt NULL zurück;

Mögliche Ursachen:

  1. libx264 etwas ging während der Kompilierung oder Konfigurationsprozess falsch.
  2. libx264 wurde nicht in apk verpackt oder ordnungsgemäß geladen.

Mein Fall, es war beides. Ich hatte "--enable-libx264" in der Konfigurationsoption, hatte aber keine Pfade zu androidkompatibler libx264-Bibliothek und Include-Verzeichnissen angegeben, daher wurde die Bibliothek ohne x264-Unterstützung kompiliert. Hoffe, dass dies jemand Zeit sparen wird.

Lösung

Nach x264 mit dem entsprechenden Toolchain kompilieren und macht sie verfügbar bei ffmpeg Kompilierung ffmpeg von --extracflags und Platzierung selbst erstellte x264 Libs und enthält in jni Ordner einstellen, hielt es NULL mindestens Rückkehr .

Mein ffmpeg Build-Skript:

NDK=$HOME/Android/Sdk/ndk-bundle 
SYSROOT=$NDK/platforms/android-19/arch-arm/ 
TOOLCHAIN=$HOME/Android/Sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 
CPREFIX=$TOOLCHAIN/bin/arm-linux-androideabi- 

CPU=arm 
PREFIX=$(pwd)/android/$CPU 
ADDI_CFLAGS="-marm" 

ADDI_CFLAGS="$ADDI_CFLAGS -I${NDK}/sources/x264 -I${NDK}/sources/x264/android/arm/include -L${NDK}/sources/x264/android/arm/lib -DANDROID -I${NDK}/sources/cxx-stl/system/include" 
# -mfloat-abi=softfp -mfpu=neon" 

ADDI_LDFLAGS="$ADDI_LDFLAGS -L${NDK}/sources/x264/android/arm/lib" 
#--extra-cxxflags='-Wno-multichar -fno-exceptions -fno-rtti' 

function build_it { 
./configure \ 
    --prefix=$PREFIX \ 
    --disable-static \ 
    --enable-shared  \ 
    --disable-doc  \ 
    --disable-ffmpeg \ 
    --disable-ffplay \ 
    --disable-ffprobe \ 
    --disable-ffserver \ 
    --disable-avdevice \ 
    --disable-doc  \ 
    --disable-symver \ 
    --cross-prefix=$CPREFIX \ 
    --target-os=linux \ 
    --arch=arm  \ 
    --enable-cross-compile \ 
    --enable-gpl  \ 
    --enable-libx264 \ 
    --sysroot=$SYSROOT \ 
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ 
    --extra-ldflags="$ADDI_LDFLAGS" \ 
    $ADDITIONAL_CONFIGURE_FLAG 


    make clean 
    make 
    make install 

    echo "build done run make install" 
} 


build_it 

Mein x264 Build-Skript:

#Android related 

NDK=$HOME/Android/Sdk/ndk-bundle 
SYSROOT=$NDK/platforms/android-19/arch-arm/ 
TOOLCHAIN=$HOME/Android/Sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 
CPREFIX=$TOOLCHAIN/bin/arm-linux-androideabi- 
CPU=arm 
PREFIX=$(pwd)/android/$CPU 
ADDI_CFLAGS="-marm" 

export PATH="$PATH:$TOOLCHAIN/bin" 

#PKG_CONFIG_PATH="$HOME/Android/Sdk/ndk-bundle/sources/FFmpeg/lib/pkgconfig" 

function build_it { 
./configure \ 
    --prefix=$PREFIX \ 
    --bindir=$HOME/Android/Sdk/ndk-bundle/sources/bin \ 
    --enable-static \ 
    --host=arm-linux \ 
    --enable-pic \ 
    --sysroot=$SYSROOT \ 
    --cross-prefix=arm-linux-androideabi- \ 
    --enable-shared \ 
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ 
    --extra-ldflags="$ADDI_LDFLAGS" \ 
    $ADDITIONAL_CONFIGURE_FLAG 
} 
build_it 
make 
make install