问题 使用librtmp为android构建FFMPEG


我正在尝试使用NDK r7b构建FFMPEG的一体化静态二进制文件,一切正常,直到我尝试使用RTMP支持构建它。

我是来源的 https://github.com/guardianproject/android-ffmpeg 使用librtmp2.4和这样的自定义配置

.configure \
--target-os=linux \
--cross-prefix=arm-linux-androideabi- \
--arch=arm \
--sysroot=/home/andrey/android-ndk-r7b/platforms/android-3/arch-arm \
--enable-static \
--disable-shared \
--disable-symver \
--enable-small \
--disable-devices \
--disable-avdevice \
--enable-gpl \
--enable-librtmp \
--prefix=../build/ffmpeg/armeabi \
--extra-cflags=-I../rtmpdump/librtmp \
--extra-ldflags=-L../rtmpdump/librtmp \

和rtmpdump目录位于与ffmpeg相同的级别。 据我所知,我的配置中的最后两个字符串说明编译器可能找到librtmp的来源。 但我得到的只是 ERROR: librtmp not found

我并没有对NDK进行过任何考验,而且我很遗憾地错过了一些重要的部分,但我自己找不到它。


4260
2018-03-09 13:02


起源



答案:


这很有挑战性,但我认为我有一个解决方案。配置时的问题是FFmpeg想要通过pkg-config管理系统检测正确的librtmp安装。

我假设你已经成功地在../rtmpdump引用的目录中交叉编译了librtmp。编辑FFmpeg配置脚本并搜索该行:

enabled librtmp    && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket

注释掉(在行的前面加上'#')。现在,重新运行configure,只进行以下修改:

--extra-cflags="-I/full/path/to/rtmpdump"

这里有一条绝对的路径可能会有所帮助。此外,最后省略/ librtmp /,因为#include指令已经使用librtmp /前缀头文件。下一个:

--extra-ldflags="-L/full/path/to/rtmpdump -lrtmp"

再次,绝对路径,并指定要链接的库,因为我们通过configure注释掉了逻辑。

现在,配置应该成功,交叉编译也应该很高兴。最终的ffmpeg二进制文件应报告协议下的RTMP模块系列:

ffmpeg -protocols
[...]
rtmp
rtmpe
rtmps
rtmpt
rtmpte

请注意,我没有NDK开发环境来测试它。但我通过编译librtmp(没有通过pkg-config安装软件包)在我的桌面Ubuntu系统上测试,然后执行上述步骤。


10
2018-03-09 22:52



有价值的信息,你能看看这个: stackoverflow.com/questions/9605757/... - iSun
我看到了这个问题,但我对Android NDK或Cygwin没有多少经验。 - Multimedia Mike
啊啊,无论如何谢谢你。 - iSun
谢谢你迈克!它现在在编译步骤上看起来不错,它确实适用于x86 Ubuntu。但我担心我现在有交叉编译librtmp的问题。我应该将其作为单独的主题发布。 - Andrew
迈克,谢谢。按照你的指示帮助我更进一步,但最终我的构建失败,出现错误,如“libavformat / librtmp.o:在函数rtmp_get_file_handle:libavformat / librtmp.c:190:错误:未定义引用'RTMP_Socket'” - 听起来像它找不到头文件,但肯定有。有什么指针吗? - elBradford


答案:


这很有挑战性,但我认为我有一个解决方案。配置时的问题是FFmpeg想要通过pkg-config管理系统检测正确的librtmp安装。

我假设你已经成功地在../rtmpdump引用的目录中交叉编译了librtmp。编辑FFmpeg配置脚本并搜索该行:

enabled librtmp    && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket

注释掉(在行的前面加上'#')。现在,重新运行configure,只进行以下修改:

--extra-cflags="-I/full/path/to/rtmpdump"

这里有一条绝对的路径可能会有所帮助。此外,最后省略/ librtmp /,因为#include指令已经使用librtmp /前缀头文件。下一个:

--extra-ldflags="-L/full/path/to/rtmpdump -lrtmp"

再次,绝对路径,并指定要链接的库,因为我们通过configure注释掉了逻辑。

现在,配置应该成功,交叉编译也应该很高兴。最终的ffmpeg二进制文件应报告协议下的RTMP模块系列:

ffmpeg -protocols
[...]
rtmp
rtmpe
rtmps
rtmpt
rtmpte

请注意,我没有NDK开发环境来测试它。但我通过编译librtmp(没有通过pkg-config安装软件包)在我的桌面Ubuntu系统上测试,然后执行上述步骤。


10
2018-03-09 22:52



有价值的信息,你能看看这个: stackoverflow.com/questions/9605757/... - iSun
我看到了这个问题,但我对Android NDK或Cygwin没有多少经验。 - Multimedia Mike
啊啊,无论如何谢谢你。 - iSun
谢谢你迈克!它现在在编译步骤上看起来不错,它确实适用于x86 Ubuntu。但我担心我现在有交叉编译librtmp的问题。我应该将其作为单独的主题发布。 - Andrew
迈克,谢谢。按照你的指示帮助我更进一步,但最终我的构建失败,出现错误,如“libavformat / librtmp.o:在函数rtmp_get_file_handle:libavformat / librtmp.c:190:错误:未定义引用'RTMP_Socket'” - 听起来像它找不到头文件,但肯定有。有什么指针吗? - elBradford