Android 上的 FFmpeg with Rubberband

FFmpeg on Android with Rubberband

当我尝试 link librubberband.a 我得到: libavfilter/af_rubberband.c:236:错误:未定义对 'rubberband_set_pitch_scale'

的引用
  1. 我为 armv7a 编译了 rubberband,并创建了一个静态库 (rubberband.a)。 我检查了库,它包含所需的符号(使用 nm)。

  2. 我验证了 librubberband.a 在 libpath (-L)

  3. 我验证了 extern C 存在于 rubberband.c.h 文件中。

有什么想法吗?

错误发生在link阶段。确保 link 目录已添加到编译器的 -L 参数中。

-L/directory/of/your/lib

并使用 -l 选项指定库。

因此,在构建支持 rubberbandffmpeg 时,请确保为您的编译器设置选项 -L/directory/of/your/lib -lrubberband

如果你没有使用pkg-config添加库。您可以使用选项 --extra-ldflags 在构建前配置 ffmpeg 时添加。

./configure \
# some configure options
--extra-ldflags="-L/directory/of/your/lib -lrubberband" \
# more configure options

如果您使用 pkg-config 查找库。只需将 library.pc 目录添加到 PKG_CONFIG_PATH,然后让构建系统完成剩余的工作。

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/directory/to/your/rubberband.pc

已更新

最后确保你 link 反对你的库的相同架构。

$ arm-linux-androideabi-readelf -h librubberband.a |grep 'Class\|Machine

对于armeabi-v7a,应该是ELF32ARM

已更新

我已经从 https://bitbucket.org/breakfastquay/rubberband

克隆了 rubberband 的源代码

并且发现函数调用 rubberband_set_pitch_scale 定义在 src/rubberband-c.cpp,当为 Android 构建时,此文件不包含在 Android.mk 中(为什么?)。

所以你必须添加这个文件来构建。

RUBBERBAND_SRC_FILES = ... \
    $(RUBBERBAND_SRC_PATH)/rubberband-c.cpp

构建完成后,您需要创建如下目录结构

    .
├── include
│   └── rubberband
│       ├── RubberBandStretcher.h
│       └── rubberband-c.h
└── lib
    ├── librubberband.a
    └── pkgconfig
        └── rubberband.pc

文件 rubberband.pc 是从 rubberband.in.pc 复制而来的,有一些小改动。

prefix=/path/to/rubberband/install/root
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: rubberband
Version: 1.8.1
Description: 
Libs: -L${libdir} -lrubberband -L/path/to/android/ndk/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a -lgnustl_static
Cflags: -I${includedir} 

然后添加

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/path/to/rubberband/install/root

./configure 之前告诉 ffmpeg 通过 pkg-config.

找到 rubberband

我试过最新的 ffmpeg,它可以工作。