Buduję aplikację dla systemu Android, która zakoduje obraz przechwycony z podglądu kamery, a następnie ją odkoduje. Używam biblioteki ffmpeg do kodowania i dekodowania. Aby zbudować bibliotekę statyczną z x264 skorzystałem z tego samouczka. http://dl.dropbox.com/u/22605641/ffmpeg_android/main.html. Jako kod źródłowy ffmpeg, jeśli korzystam z pobranego z linku podanego w samouczku, mogę go zbudować, ale nie mogę skompilować biblioteki, jeśli użyję kodu źródłowego pobranego stąd git clone git: //source.ffmpeg.org/ffmpeg. git ffmpeg. Zbudowałem bibliotekę w Ubuntu i używam jej w Windows 7 w Eclipse. Ponieważ potrzebuję tylko kodera i dekodera h264, użyłem następującego kodu dla ffmpeg, nieznacznie zmodyfikowanego z samouczka.avcodec_find_encoder (AV_CODEC_ID_H264) zwraca wartość 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
Po zbudowaniu biblioteki udało mi się zbudować androida ndk. Niewielka część mojego kodu JNI jest tutaj.
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;
}
.
.
.
}
Kiedy uruchomić mój kod źródłowy Java, który wywołuje initencoder() otrzymuję -1 jako wartości zwracanej i drukuje logcat "nie znaleziono". Oznacza to, że avcodec_find_encoder() zwraca wartość null i jeśli warunek jest w porządku. Nie wiem co jest źle. Dlaczego ta funkcja zwraca zero? Dużo szukałem, ale nie znalazłem żadnego rozwiązania, które poprowadziłoby mnie we właściwym kierunku. niektórzy mówią, że używają avcodec_init(). Komenda ndk-build kończy się niepowodzeniem i pokazuje błąd z informacją o niezdefiniowanym odwołaniu do "avcodec_init()". Zacząłem od budowy biblioteki, ponieważ myślałem, że robię źle od pierwszego etapu. Czy popełniłem błąd w budynku biblioteki, nie pozwalając na rzeczy, które powinienem? Proszę, pomóżcie mi tutaj. Jest to dla mnie bardzo pilne.
Proszę edytować swój post tak, że zawiera konkretne pytanie. Ułatwi nam to pomoc. –
Mam dokładnie ten sam problem. O ile mi wiadomo, "avcodec_register_all()" powinien zająć się nim, ale tak się nie stało. Działa dobrze na Ubuntu, ale nie działa na systemie Android. Czy byłeś w stanie rozwiązać problem? – BVB
Ten sam problem. Czy ktoś go rozwiązuje? – jerry