在带有Rubberband的Android上使用FFmpeg

时间:2017-06-28 06:38:55

标签: ffmpeg android-ffmpeg

当我尝试链接librubberband.a时,我得到: libavfilter / af_rubberband.c:236:错误:未定义引用'rubberband_set_pitch_scale'

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

  2. 我确认librubberband.a位于libpath(-L)

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

  4. 有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

-L/directory/of/your/lib

并使用-l选项指定库。

因此,在-L/directory/of/your/lib -lrubberband支持ffmpeg时,请确保为编译器设置了rubberband选项。

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

./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

更新

最后确保链接到图书馆的相同架构。

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

对于armeabi-v7a,它应为ELF32ARM

更新

我从https://bitbucket.org/breakfastquay/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之前通过rubberband告诉ffmpeg查找pkg-config

我尝试过最新的ffmpeg,它确实有用。