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.
Bitte bearbeiten Sie Ihre Post, so dass es eine spezifische Frage enthält. Dies wird es uns erleichtern, Ihnen zu helfen. –
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
Das gleiche Problem.Ist jemand zu lösen? – jerry