Android 上的 FFmpeg with Rubberband
FFmpeg on Android with Rubberband
当我尝试 link librubberband.a 我得到:
libavfilter/af_rubberband.c:236:错误:未定义对 'rubberband_set_pitch_scale'
的引用
我为 armv7a 编译了 rubberband,并创建了一个静态库 (rubberband.a)。
我检查了库,它包含所需的符号(使用 nm)。
我验证了 librubberband.a 在 libpath (-L)
我验证了 extern C 存在于 rubberband.c.h 文件中。
有什么想法吗?
错误发生在link阶段。确保 link 目录已添加到编译器的 -L
参数中。
-L/directory/of/your/lib
并使用 -l
选项指定库。
因此,在构建支持 rubberband
的 ffmpeg
时,请确保为您的编译器设置选项 -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
,应该是ELF32
和ARM
。
已更新
我已经从 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,它可以工作。
当我尝试 link librubberband.a 我得到: libavfilter/af_rubberband.c:236:错误:未定义对 'rubberband_set_pitch_scale'
的引用我为 armv7a 编译了 rubberband,并创建了一个静态库 (rubberband.a)。 我检查了库,它包含所需的符号(使用 nm)。
我验证了 librubberband.a 在 libpath (-L)
我验证了 extern C 存在于 rubberband.c.h 文件中。
有什么想法吗?
错误发生在link阶段。确保 link 目录已添加到编译器的 -L
参数中。
-L/directory/of/your/lib
并使用 -l
选项指定库。
因此,在构建支持 rubberband
的 ffmpeg
时,请确保为您的编译器设置选项 -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
,应该是ELF32
和ARM
。
已更新
我已经从 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,它可以工作。