android - avcodec_find_encoder(AV_CODEC_ID_H264) 返回 null

标签 android ffmpeg x264 avcodec

我正在构建一个 android 应用程序,它将对从相机预览捕获的图像进行编码,然后对其进行解码。我正在使用 ffmpeg 库进行编码和解码。要使用 x264 构建静态库,我使用了本教程。 http://dl.dropbox.com/u/22605641/ffmpeg_android/main.html .作为 ffmpeg 的源代码,如果我使用从教程中给出的链接下载的源代码,我可以构建它,但如果我使用从此处 git clone git://source.ffmpeg.org/ffmpeg 下载的源代码,则无法构建库。混帐 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()”的引用。我已经开始构建库,因为我认为我可能从第一阶段就做错了。我在图书馆 build 中是否犯了任何错误,比如没有启用我应该启用的东西?请在这里帮助我。这对我来说有点紧急。

最佳答案

问题:avcodec_find_encoder返回NULL;

可能的原因:

  1. libx264 在编译或配置过程中出错。
  2. libx264 尚未打包到 apk 中或未正确加载。

我的情况是两者兼而有之。我在配置选项中有“--enable-libx264”,但没有提供与 android 兼容的 libx264 库和包含目录的路径,因此该库是在没有 x264 支持的情况下编译的。 希望这会节省一些人的时间。

解决方案

在使用适当的工具链编译 x264 并通过设置 --extracflags 并将自编译的 x264 库和包含在 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

关于android - avcodec_find_encoder(AV_CODEC_ID_H264) 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15801722/

相关文章:

带有渐变的Android形状边框

multithreading - 不同服务器配置的 MediaCodec 硬件解码器要慢得多?

ffmpeg连接: "Unsafe file name"

java - 如何终止通常使用 ProcessBuilder 创建的进程

ffmpeg - 突出显示的部分代表什么?

ffmpeg - ' wpredp' 参数在 x264(或 FFmpeg)中有什么作用?

python - x264 多次通过指定临时文件的位置?

android - 如何测试自定义sdk android单元测试的元素

android - Facebook Android SDK 3.5 中的自定义 Facebook 登录按钮图像

android - 如何为 Android App Architecture ViewModels 创建 Android UI 测试?