2013-04-04 26 views
6

Sto costruendo un'applicazione Android che codificherà l'immagine acquisita dall'anteprima della telecamera e successivamente la decodificherà. Sto usando la libreria ffmpeg per codificare e decodificare. Per costruire una libreria statica con x264 ho usato questo tutorial. http://dl.dropbox.com/u/22605641/ffmpeg_android/main.html. Come codice sorgente di ffmpeg se uso quello scaricato dal link fornito nel tutorial posso costruirlo ma non posso costruire la libreria se uso il codice sorgente scaricato da qui git clone git: //source.ffmpeg.org/ffmpeg. git ffmpeg. Ho costruito la libreria in Ubuntu e l'ho usata in Windows 7 in Eclipse. Poiché ho bisogno solo del codificatore e decodificatore h264, ho usato il seguente codice per ffmpeg, leggermente modificato dal tutorial.avcodec_find_encoder (AV_CODEC_ID_H264) restituisce null

#!/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 

Dopo aver creato la libreria, sono riuscito a creare Android ndk. Una piccola parte del mio codice JNI è qui.

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; 
    } 
. 
. 
. 
} 

Quando eseguo il mio codice sorgente Java che chiama initencoder() ottengo -1 come valore di ritorno e stampe logcat "non trovato". Ciò significa che avcodec_find_encoder() restituisce null e se la condizione è ok. Non so cosa c'è che non va. Perché questa funzione restituisce null? Ho cercato molto ma non ho trovato nessuna soluzione che potesse guidarmi nella giusta direzione. alcuni dicono di usare avcodec_init(). Ma il comando ndk-build fallisce e mostra un errore che dice riferimento non definito a 'avcodec_init()'. Ho iniziato con la build della libreria perché pensavo che stavo sbagliando dal primo stadio. Ho fatto qualche errore nella costruzione di una biblioteca come se non avessi abilitato le cose che dovrei? Per favore aiutami qui. Questo è un po 'urgente per me.

+0

Si prega di modificare il tuo messaggio in modo che contenga una domanda specifica. Questo renderà più facile per noi aiutarti. –

+1

Ho lo stesso identico problema. Per quanto ne so, 'avcodec_register_all()' avrebbe dovuto occuparsene, ma non è così. Funziona bene su Ubuntu, ma non funziona su Android. Sei riuscito a risolvere il problema? – BVB

+0

Lo stesso problema. Qualcuno risolve? – jerry

risposta

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

Quindi non mettere avcodec_register_all();

+0

Potrebbe essere così, ma non risolve il problema. –

0

Problema: avcodec_find_encoder restituisce NULL;

Possibili cause:

  1. libx264 qualcosa è andato storto durante la compilazione o processo di configurazione.
  2. libx264 non è stato pacchettizzato in apk o caricato correttamente.

Il mio caso, era entrambi. Avevo "--enable-libx264" nell'opzione di configurazione, ma non avevo fornito percorsi alla libreria libx264 compatibile con Android e includevo le directory, quindi la libreria era stata compilata senza il supporto x264. Spero che questo salvi il tempo di qualcuno.

Soluzione

Dopo aver compilato x264 con la toolchain appropriata e rendendoli disponibili a ffmpeg al momento della compilazione ffmpeg impostando --extracflags e l'immissione librerie x264 auto-compilato e include nella cartella JNI, si è fermato tornando NULL almeno .

mio ffmpeg script di build:

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 

mio x264 script di build:

#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