module+ffmpeg搭建流媒体服务器笔记(八)

第八部分—FFmpeg移植到Android

最近这几天一直在搞FFmpeg的Android移植,我的目标是在Linux上对FFmpeg进行交叉编译最终得到可以push到Android目录下执行的ffmpeg可执行文件。

为了达到这个目的,完成对FFmpeg的移植,我可以说是查遍了几乎所有网络文章,试遍了网上的各种方法,但最终还是出现各种各样的错误,真是蛋蛋碎了一地阿!

刚刚开始试验的时候,在编译的时候小心脏还加速跳呢害怕失败出错,到后来试的多了,失败的多了直接没感觉了,想着反正没打算通过,很淡定了。说实话这活还是很让人纠结着急上火的。为什么人家可以顺利编译通过我就不行了呢。

好了,步入正题~~~~~~~~~~~~~~~

1、在此特意非常感谢网友Livingstone,感谢他的耐心帮助和指导。

没有Livingstone提供配置文件的话,我不可能在今天完成编译移植。

2、通过查阅网上的各种教程,我发现大家移植的最终目标大多数是要得到.so文件,然后将其放到Android工程中去,然后通过JNI调用FFmpeg的各种方法,在Android应用层上面调用FFmpeg的各种方法完成各种任务,比如视频格式转换等。

但是我目前的目标还没有定到通过JNI来调用FFmpeg的方法来完成相应的功能,我只是要得到能够在Android目录下用命令行可以执行的ffmpeg可执行文件就可以了,JNI包装的事情之后再讲。

根据这个目标我查看了一篇博文

FFmpeg在Android上的移植优化步骤

这篇文章达到的效果和我想要的基本是一样的,所以我就一步步按照他的方法来做,出现了一个个的错误,可能是我的环境问题还是什么的最终我没有按照他的方法成功。

由于他实现的效果和我想要的一样,我就一遍一遍的修改配置文件一遍一遍的试验用了好长的时间还是失败。有同样需求的可以参考这篇文章,感觉写的不错,没准你按照他的方法通过了呢。

3、昨天下午我在讨论群FFMPEG+Live555=H.264里问了下这个问题,好心的网友Livingstone曾经做过相似的工作,发给我一个他曾经用过的配置文件,经过我修改过NDK路径后如下build_bin_ffmpeg_1.sh:

NDK=/home/wangrui/java/android-ndk-r9dPLATFORM=$NDK/platforms/android-9/arch-arm/PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86CPU=armv7-aOPTIMIZE_CFLAGS="-mfloat-abi=softfp -marm -mcpu=cortex-a8"PREFIX=./android/$CPU./configure –target-os=linux \–prefix=$PREFIX \–enable-cross-compile \–arch=arm \–enable-nonfree \–enable-asm \–cpu=cortex-a8 \–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=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 $OPTIMIZE_CFLAGS " \–disable-shared \–enable-static \–extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -lz -ldl -llog -lavcodec -lavformat -lswscale -lavutil -lswresample" \–disable-ffmpeg \–disable-ffplay \–disable-ffprobe \–disable-ffserver \–enable-swscale \–disable-swresample \–enable-avformat \–enable-avcodec \–disable-optimizations \–disable-debug \–disable-doc \–disable-stripping \–enable-pthreads \–disable-yasm \–enable-zlib \–enable-pic \–enable-smallmake cleanmake -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 –dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.8/libgcc.a他当时移植的FFmpeg版本是2.5.3,我也用的这个版本,但结果又让我失望了:

libavcodec/opusdec.c:376: error: undefined reference to 'swr_is_initialized'libavcodec/opusdec.c:222: error: undefined reference to 'swr_is_initialized'libavcodec/opusdec.c:163: error: undefined reference to 'swr_init'libavcodec/opusdec.c:169: error: undefined reference to 'swr_convert'libavcodec/opusdec.c:236: error: undefined reference to 'swr_convert'libavcodec/opusdec.c:117: error: undefined reference to 'swr_convert'libavcodec/opusdec.c:408: error: undefined reference to 'swr_close'libavcodec/opusdec.c:563: error: undefined reference to 'swr_close'libavcodec/opusdec.c:585: error: undefined reference to 'swr_free'libavcodec/opusdec.c:638: error: undefined reference to 'swr_alloc'Livingstone他自己也遇到过这个问题,最终也没有解决,我想可能是FFmpeg版本的问题。

他介绍说FFmpeg的2.0版本的前后的编译移植方法可能不同,我想这也许就是试验网上的一些教程不成功的原因吧。NDK版本、FFmpeg版本都有可能影响到结果,所以要灵活点。

4、最后使用了一个开源项目的FFmpeg-android源码+上面的配置文件进行编译,居然没有出错误,真是激动的不行了。

开源项目地址是:

FFmpeg for Android

我记得之前查资料的时候看过这个项目也下载过,但是看了半天就是不知道该怎么用,后来就搁置了。没想到这次居然用到了。

(1)下载FFmpeg for Android项目的源码,地址我选择的是ffmpeg-2.1.4.android这个版本。

(2)将上面的build_bin_ffmpeg_1.sh文件内容copy到ffmpeg-2.1.4.android目录下。

(3)修改build_bin_ffmpeg_1.sh文件的权限

chmod 755 build_bin_ffmpeg_1.sh(4)执行配置文件

./build_bin_ffmpeg_1.sh(5)不出错的话,等待几分钟后会出现下面的画面:

收敛自己的脾气,偶尔要刻意沉默,

module+ffmpeg搭建流媒体服务器笔记(八)

相关文章:

你感兴趣的文章:

标签云: