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.
Si prega di modificare il tuo messaggio in modo che contenga una domanda specifica. Questo renderà più facile per noi aiutarti. –
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
Lo stesso problema. Qualcuno risolve? – jerry