我正在构建一个 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 使用了以下代码,对教程稍作修改。
#!/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() 的 java 源代码时,我得到 -1 作为返回值,并且 logcat 打印“未找到”。这意味着 avcodec_find_encoder() 返回 null 并且如果条件正常。我不知道怎么了。为什么这个函数返回null?我进行了很多搜索,但没有找到任何可以引导我走向正确方向的解决方案。有人说要使用 avcodec_init()。但 ndk-build 命令失败并显示错误,说明未定义对 'avcodec_init()' 的引用。我已经开始构建库,因为我认为我可能从第一阶段就做错了。我在图书馆建设中是否犯了任何错误,比如没有启用我应该做的事情?请在这里帮助我。这对我来说有点紧迫。