ffmpeg android版本中的libx264编码器错误

ffmpeg android版本中的libx264编码器错误,android,ffmpeg,h.264,armv7,libx264,Android,Ffmpeg,H.264,Armv7,Libx264,现在,我有一个ffmeg构建脚本,它可以识别libx264并成功编译。我还编译了x264并获得了libx264.a库。ffmpeg和libx264都是从源代码构建的。我也可以在没有libx264的情况下成功构建ffmpeg。下面是我的脚本,它试图用libx264构建ffmpeg #!/bin/bash NDK=~/Android_NDK_r7b PLATFORM=$NDK/platforms/android-8/arch-arm/ PREBUILT=$NDK/toolchains/arm-lin

现在,我有一个ffmeg构建脚本,它可以识别libx264并成功编译。我还编译了x264并获得了libx264.a库。ffmpeg和libx264都是从源代码构建的。我也可以在没有libx264的情况下成功构建ffmpeg。下面是我的脚本,它试图用libx264构建ffmpeg

#!/bin/bash
NDK=~/Android_NDK_r7b
PLATFORM=$NDK/platforms/android-8/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
alitan=~/x264/ndk7_build
function build_one
{
./configure --target-os=linux \
--prefix=$PREFIX \
--enable-cross-compile \
--extra-libs="-lgcc " \
--arch=arm \
--cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
--nm=$PREBUILT/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--extra-cflags=" -I$alitan/include" \
--disable-shared \
--enable-static \
--extra-ldflags=" -L$alitan/lib " \
--enable-version3 \
--enable-gpl \
--disable-doc \
--disable-everything \
--enable-libx264 \
--enable-encoder=libx264 \
$ADDITIONAL_CONFIGURE_FLAG

make clean
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 -soname libffmpeg.so -shared -nostdlib -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a
}

#arm v7vfpv3
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
PREFIX=./DONE/$CPU
ADDITIONAL_CONFIGURE_FLAG=
build_one
上面的脚本没有在ffmpeg输出构建中提供libx264.a。 如果启用x264编码器,则会在x264.c(在libavcodec中)中得到一些变量的未定义引用错误。 如果在ffmpeg配置中启用shared,则会出现一个错误,表明它无法cd到我的前缀目录(顺便说一下,没有权限问题)

我正在使用最新版本的ffmpeg和x264(今天克隆了git)以及ndk 7。Ubuntu运行在VM上,安装在Windows7上。有关我将ffmpeg/x264移植到Android的更多细节,请参阅

如何将libx264与ffmpeg一起使用?我继续用不同的配置尝试这个脚本,删除了所有ffmpeg x264文件夹并重新安装了它们,但没有用

先谢谢你

编辑 下面是我的x264构建脚本。它构建得很好,给了我静态库和标题

export ARM_ROOT=/home/mehmet/Android_NDK_r7b
export ARM_INC=$ARM_ROOT/platforms/android-8/arch-arm/usr/include/
export ARM_LIB=$ARM_ROOT/platforms/android-8/arch-arm/usr/lib/
export ARM_TOOL=$ARM_ROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
export ARM_LIBO=$ARM_TOOL/lib/gcc/arm-linux-androideabi/4.4.3
export PATH=$ARM_TOOL/bin:$PATH
export PATH=$ARM_TOOL/arm-linux-androideabi/bin:$PATH
export ARM_PRE=arm-linux-androideabi
#tries to build for 4.4.3 toolchain

./configure --prefix=./ndk7_build \
--disable-gpac \
--extra-cflags=" -I$ARM_INC -fPIC -DANDROID -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -DANDROID -Wa,--noexecstack -MMD -MP " \
--extra-ldflags=" -nostdlib -Bdynamic -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,nocopyreloc -Wl,-soname,/system/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$ARM_LIB -nostdlib $ARM_LIB/crtbegin_dynamic.o $ARM_LIB/crtend_android.o -lc -lm -ldl -lgcc " \
--cross-prefix=${ARM_PRE}- \
--disable-asm \
--enable-static \
--host=arm-linux \
这就是当我启用libx264编码器时终端上发生的情况

STRIP   ffmpeg
INSTALL install-progs-yes
INSTALL ffmpeg
INSTALL ffprobe
libavcodec/libavcodec.a(libx264.o): In function `X264_frame':
/home/mehmet/ffmpeg/libavcodec/libx264.c:158: undefined reference to `x264_picture_init'
/home/mehmet/ffmpeg/libavcodec/libx264.c:178: undefined reference to `x264_encoder_reconfig'
/home/mehmet/ffmpeg/libavcodec/libx264.c:189: undefined reference to `x264_encoder_encode'
/home/mehmet/ffmpeg/libavcodec/libx264.c:195: undefined reference to `x264_encoder_delayed_frames'
libavcodec/libavcodec.a(libx264.o): In function `encode_nals':
/home/mehmet/ffmpeg/libavcodec/libx264.c:100: undefined reference to `x264_bit_depth'
libavcodec/libavcodec.a(libx264.o): In function `X264_close':
/home/mehmet/ffmpeg/libavcodec/libx264.c:230: undefined reference to `x264_encoder_close'
libavcodec/libavcodec.a(libx264.o): In function `X264_init':
/home/mehmet/ffmpeg/libavcodec/libx264.c:283: undefined reference to `x264_param_default'
/home/mehmet/ffmpeg/libavcodec/libx264.c:291: undefined reference to `x264_param_default_preset'
/home/mehmet/ffmpeg/libavcodec/libx264.c:313: undefined reference to `x264_param_parse'
/home/mehmet/ffmpeg/libavcodec/libx264.c:448: undefined reference to `x264_param_apply_fastfirstpass'
/home/mehmet/ffmpeg/libavcodec/libx264.c:451: undefined reference to `x264_param_apply_profile'
/home/mehmet/ffmpeg/libavcodec/libx264.c:494: undefined reference to `x264_encoder_open_125'
/home/mehmet/ffmpeg/libavcodec/libx264.c:505: undefined reference to `x264_encoder_headers'

查看上面的链接,以及eighthave如何在其/ffmpeg/configure中包含L..X264


如果你在ffmpeg上的配置步骤的搜索链中找到了正确的库,那么所有未定义的引用都会消失

好吧,多亏了罗伯特的git,我已经检查过了,效果还不错。我不知道为什么,但使用SYSROOT风格的构建和添加armv7优化标志是有效的。我已经为链接到x264的ffmpeg生成了一个二进制文件,支持编码器x264。感谢您的帮助。

@rogerdpack我用x264构建脚本编辑了这个问题。我认为缺少x264符号的问题是需要解决的正确方案。您能打印x264缺少的符号吗。我问这个问题是因为我认为最新的x264需要使用最新的ffmpeg。而且这些家伙似乎也面临着类似的问题并解决了它。看一看:试着看一次。他们也有同样的问题。@av501我也考虑过这个问题,这就是为什么我今天下载了ffmpeg的最新版本,以及x264的最新版本。我将再次使用--enable encoder=libx264检查config.log,并尝试查看出了什么问题。如果我没有错,则与我的脚本相比,您发布的配置脚本中的标志只是为NEON添加了一些优化,所以这不会导致问题。关于我的问题,我打赌我使用的是libx264脚本中的标志。任何人都可以在我上面发布的x264脚本中发现任何东西?(即使它工作正常,但应该是出了问题,因此我在原始帖子中得到了错误)——extra ldflags=“-L$alitan/lib”\这是您的链接器lib表达式。链接器如何包含-L..X264?我试图在不同的文件夹(分别是$alitan/include和/lib)中搜索libx264头和静态库,而您发布的脚本在parentdirectory/X264中查找它们,对吗?我还制作了安装的x264版本,所以我在输出版本文件夹中查找它,即x264/alitan。老实说,我看不出有什么区别。在我看来,您的x264构建将静态库输出到./configure--prefix=./android2\。您不需要将该目标与后续构建步骤协调吗?即链接器在config_ffmpeg步骤中搜索的库?因此我假设您说我需要向链接器传递一个选项,例如“-wl,-rpath link=$alitan/lib-L$alitan/lib”应该添加到ldflags中吗?我理解对了吗?嗯。。。如果你喜欢别人提供给你的答案,请随意“接受”它