我正在构建一个android应用程序,这将编码从相机预览捕获的图像,并稍后解码它。我正在使用ffmpeg库进行编码和解码。为了使用x264构建静态库,我使用了本教程。http://dl.dropbox.com/u/22605641/ffmpeg_android/main.html。作为ffmpeg的源代码,如果我使用从教程中给出的链接下载的源代码,我可以构建它,但如果我使用从此处下载的git克隆git://soure.ffmpeg.org/ffmpeg.git ffmpeg,则无法构建库。我已经在ubuntu中构建了库,并在Eclipse的windows7中使用它。因为我只需要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输出"not found“。这意味着avcodec_find_encoder()返回null,如果条件是ok的。我不知道出了什么问题。为什么这个函数返回null?我已经寻找了很多,但没有找到任何可以引导我走向正确方向的解决方案。有些人说要使用avcodec_init()。但ndk-build命令失败,并显示错误,指出未定义引用'avcodec_init()‘。我从库构建开始,因为我认为我可能在第一阶段就做错了。我在构建库的时候犯了什么错误,比如没有启用我应该支持的东西吗?请帮帮我。这对我来说有点紧急。
发布于 2017-02-28 18:24:27
问题: avcodec_find_encoder返回NULL;
可能的原因:
我的情况是,两者都有。我在配置选项中有"--enable- libx264“,但是没有提供android兼容libx264库的路径和包含目录,所以这个库是在没有x264支持的情况下编译的。希望这能节省一些人的时间。
解决方案
在使用适当的工具链编译x264,并通过设置--extracflags标志并将自编译的x264库和includes放在jni文件夹中,使它们在ffmpeg编译时可供ffmpeg使用后,它至少停止了返回NULL。
我的ffmpeg构建脚本:
NDK=$HOME/Android/Sdk/ndk-bundle
SYSROOT=$NDK/platforms/android-19/arch-arm/
TOOLCHAIN=$HOME/Android/Sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CPREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
ADDI_CFLAGS="$ADDI_CFLAGS -I${NDK}/sources/x264 -I${NDK}/sources/x264/android/arm/include -L${NDK}/sources/x264/android/arm/lib -DANDROID -I${NDK}/sources/cxx-stl/system/include"
# -mfloat-abi=softfp -mfpu=neon"
ADDI_LDFLAGS="$ADDI_LDFLAGS -L${NDK}/sources/x264/android/arm/lib"
#--extra-cxxflags='-Wno-multichar -fno-exceptions -fno-rtti'
function build_it {
./configure \
--prefix=$PREFIX \
--disable-static \
--enable-shared \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$CPREFIX \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--enable-gpl \
--enable-libx264 \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "build done run make install"
}
build_it我的x264构建脚本:
#Android related
NDK=$HOME/Android/Sdk/ndk-bundle
SYSROOT=$NDK/platforms/android-19/arch-arm/
TOOLCHAIN=$HOME/Android/Sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CPREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
export PATH="$PATH:$TOOLCHAIN/bin"
#PKG_CONFIG_PATH="$HOME/Android/Sdk/ndk-bundle/sources/FFmpeg/lib/pkgconfig"
function build_it {
./configure \
--prefix=$PREFIX \
--bindir=$HOME/Android/Sdk/ndk-bundle/sources/bin \
--enable-static \
--host=arm-linux \
--enable-pic \
--sysroot=$SYSROOT \
--cross-prefix=arm-linux-androideabi- \
--enable-shared \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
}
build_it
make
make install发布于 2019-10-18 20:42:47
我通过重用函数解决了这个问题
avcodec_register_all()在此之前
avcodec_find_encoder(codec_id);该功能已被弃用,但它在我身上工作。
发布于 2014-04-05 18:39:58
av_register_all(); already calls avcodec_register_all() inside it.所以不要把avcodec_register_all();
https://stackoverflow.com/questions/15801722
复制相似问题