【问题标题】:libx264 encoder error in ffmpeg android buildffmpeg android构建中的libx264编码器错误
【发布时间】:2012-08-26 16:33:46
【问题描述】:

现在,我有一个 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 配置中启用共享,我会收到一个错误,说它不能 cd 到我的前缀目录(顺便说一下,没有权限问题)。

我正在使用最新版本的 ffmpeg 和 x264(今天克隆了 git)和 ndk 7。Ubuntu 在 VM 上运行,安装在 Windows 7 上。有关我将 ffmpeg/x264 移植到 Android 的冒险的更多详细信息,您可以参考 @ 987654321@.

如何在 ffmpeg 中使用 libx264?我继续尝试使用不同配置的脚本,删除所有 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'

【问题讨论】:

  • @rogerdpack 我用我的 x264 构建脚本编辑了这个问题。
  • 我认为丢失 x264 符号的问题是要解决的正确方案。你能打印出 x264 缺失的符号吗?我问这个是因为我认为您需要将最新的 ffmpeg 用于最新的 x264。
  • 这些人似乎也遇到了类似的问题并解决了。看一看:stackoverflow.com/questions/8812827/…
  • 尝试查看stackoverflow.com/questions/8812827/… 一次。他们有同样的问题。
  • @av501 我也是这么想的,所以我今天才下载了最后一个版本的ffmpeg,以及x264的最新版本。我将再次使用 --enable-encoder=libx264 检查 config.log 并尝试查看问题所在。

标签: android ffmpeg h.264 armv7 libx264


【解决方案1】:

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

【讨论】:

【解决方案2】:

https://github.com/guardianproject/android-ffmpeg/blob/master/configure_ffmpeg.sh

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

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

【讨论】:

  • 如果我没记错的话,与我的脚本相比,您发布的配置脚本中的标志只是为 NEON 添加了一些优化,所以这不会造成问题。关于我的问题,我的赌注是我使用的 libx264 脚本中的标志。任何人都可以在我上面发布的 x264 脚本中发现任何内容? (即使它工作正常,也应该有问题,所以我在原帖中得到了错误)
  • --extra-ldflags=" -L$alitan/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?我理解正确吗?
猜你喜欢
  • 2018-05-09
  • 2015-02-10
  • 2021-05-10
  • 1970-01-01
  • 2014-06-10
  • 2012-02-15
  • 2012-11-11
  • 2018-04-04
  • 1970-01-01
相关资源
最近更新 更多