avcodec_find_encoder(AV_CODEC_ID_H264) gibt null zurück
Baue ich ein android-Anwendung, die verschlüsselt aufgenommene Bild von der Kamera-Vorschau und später entschlüsseln. Ich bin mit dem ffmpeg-Bibliothek zum codieren und decodieren. Bauen statische Bibliothek mit x264 habe ich dieses tutorial verwendet. http://dl.dropbox.com/u/22605641/ffmpeg_android/main.html. Als source-code von ffmpeg, wenn ich das eine heruntergeladen aus dem link im tutorial kann ich es eingebaut, aber kann Sie nicht bauen-Bibliothek, wenn ich Quellcode hier herunterladen git clone git://source.ffmpeg.org/ffmpeg.git-ffmpeg. Ich habe in integrierten Bibliothek in ubuntu und in windows 7 in Eclipse. Da Brauch ich nur h264-encoder und-decoder benutzt habe ich folgenden code für ffmpeg, leicht abgewandelt von der Anleitung.
#!/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 Aufbau der Bibliothek, die ich in der Lage gewesen zu bauen android-ndk. Ein kleiner Teil meiner JNI code 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 mein java-source-code, der Aufrufe initencoder() erhalte ich -1 als Rückgabewert und logcat druckt "nicht gefunden". Das bedeutet, dass avcodec_find_encoder() gibt null zurück, und wenn der Zustand ist ok. Ich weiß nicht, was falsch ist. Warum ist diese Funktion null zurückgeben? Ich habe gesucht, eine Menge, aber fand keine Lösung, könnte mich auf richtige Richtung. einige, sagt zu avcodec_init(). Aber ndk-build-Befehl schlägt fehl, und zeigt Fehlermeldung undefined reference to 'avcodec_init()'. Ich habe angefangen mit Bibliothek bauen, weil ich dachte, vielleicht habe ich Unrecht getan, die erste Etappe. Habe ich einen Fehler in der Bibliothek Gebäude wie nicht zu aktivieren, die Dinge, die ich sollte? Bitte helfen Sie mir hier. Das ist ziemlich dringend für mich.
- Bitte Bearbeiten Sie Ihre post, so dass es enthält eine spezielle Frage. Dadurch wird es einfacher für uns, Ihnen zu helfen.
- Ich habe das exakt gleiche Problem. Soweit ich weiß,
avcodec_register_all()
sollte aufgepasst habe, aber es hat nicht. Funktioniert gut auf Ubuntu, aber funktioniert nicht auf Android. Sie waren in der Lage, das Problem zu lösen? - Das gleiche Problem.Ist jemand lösen?
- Scheint h264 ist nur ein decoder, kein encoder.
- Habe das gleiche Problem auf Android, mit h264 zusammengestellt als encoder.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Problem: avcodec_find_encoder NULL zurück;
Mögliche Ursachen:
Meinem Fall war es beides. Ich hatte "--enable-libx264" im Konfigurations-option, aber hatten keine Pfade zu android kompatibel libx264-library-und include-Verzeichnisse, so dass die Bibliothek kompiliert werden, ohne x264-Unterstützung.
Hoffe, das spart jemand Zeit.
Lösung
Nach dem kompilieren x264-mit der entsprechenden toolchain und macht Sie verfügbar, um ffmpeg auf ffmpeg Zusammenstellung Zeit, indem Sie --extracflags und die Platzierung selbst kompiliert x264-libs und includes in jni-Ordner, hörte es auf NULL zurückgeben zumindest.
Mein ffmpeg build-Skript:
Meine x264 build-Skript:
Löste ich dieses problem durch die Wiederverwendung der Funktion
bevor
Die Funktionalität ist veraltet, aber es funktionierte für mich.
Also nicht setzen avcodec_register_all();