我正在構建一個android應用程序,該應用程序將對從相機預覽捕獲的圖像進行編碼,然後對其進行解碼。我正在使用ffmpeg庫進行編碼和解碼。用x264構建靜態庫我已經使用了本教程。 http://dl.dropbox.com/u/22605641/ffmpeg_android/main.html。作爲ffmpeg的源代碼,如果我使用從教程中給出的鏈接下載的源代碼,我可以構建它,但如果我使用從此處下載的源代碼構建庫,git clone git://source.ffmpeg.org/ffmpeg。 git ffmpeg。我在ubuntu中構建了庫並在Eclipse中的Windows 7中使用它。由於我只需要h264編碼器和解碼器,我已經使用了ffmpeg的以下代碼,稍微修改了教程。avcodec_find_encoder(AV_CODEC_ID_H264)返回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
建立庫後,我已經能夠建立android ndk。我的JNI代碼的一小部分在這裏。
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;
}
.
.
.
}
當我運行調用initencoder()我得到-1的返回值和logcat的版畫「未找到」我的Java源代碼。這意味着avcodec_find_encoder()返回null,如果條件正常。我不知道什麼是錯的。爲什麼這個函數返回null?我搜查了很多,但沒有找到任何可以指導我走向正確方向的解決方案。有人說使用avcodec_init()。但是ndk-build命令失敗並顯示錯誤,說明'avcodec_init()'的未定義引用。我已經開始建立圖書館,因爲我認爲可能是我在第一階段做錯了。我是否在圖書館建設方面犯了一些錯誤,比如不讓我應該做的事情發生?請在這裏幫助我。這對我來說很緊急。
請編輯您的帖子,使其包含一個具體的問題。這會讓我們更容易幫助你。 – 2013-04-04 03:15:27
我有完全相同的問題。據我所知,'avcodec_register_all()'應該照顧它,但它沒有。在Ubuntu上運行得很好,但在Android上無法運行。你能解決這個問題嗎? – BVB 2013-06-27 20:08:01
同樣的問題。是否有人解決? – jerry 2013-11-15 07:23:26