Ffmpeg 无处不在,自然android系统少不了它,折腾了不少时间完成 ndk编译ffmpeg,生成so库中引用了外部库librtmp,libx264。条条大路通罗马,
也许还有别的更好的方法去完成它,我没有仔细研究。我使用的方法完全可以达到我的预期目的。
一.选择编译环境
可以选择windows下cygwin,也可以选择linux系统,我建议选择后者。花了很多时间在cygwin下编译,configure时总是提示链接需要的so文件找不到。无奈
之下转到linux环境下编译。我用的版本是ubuntu16.04。编译android版本的ffmpeg注意注意的地方有三个:一是configure时带入的参数,二是放置将要用
到的第三方库(so),最后一个是修改configure文件。下面听我一一道来。
一. 创建一个shell脚本文件build_ffmpeg.sh用来引入configure参数,这个文件的格式是unix,如果文件是dos格式,可以用uedit转换格式。
创建的shell脚本内容如下:
#!/bin/sh CPU=arm PREFIX=$(pwd)/android/$CPU ADDI_CFLAGS="-marm" NDK=/home/wgg/wgg/android-ndk-r11c SYSROOT=$NDK/platforms/android-21/arch-arm/ TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 ./configure --prefix=$PREFIX --target-os=linux --enable-cross-compile --enable-runtime-cpudetect --disable-asm --arch=arm --enable-nonfree --enable-shared --enable-version3 --enable-gpl --disable-programs --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-doc --enable-avresample --disable-everything --enable-decoder=pcm_alaw --enable-decoder=pcm_mulaw --enable-decoder=mpeg4 --enable-decoder=h264 --enable-encoder=aac --enable-librtmp --enable-libx264 --enable-parser=aac --enable-parser=h264 --enable-parser=mpeg4video --enable-parser=mpegvideo --enable-parser=mpegaudio --enable-encoder=libx264 --enable-muxer=mpegts --enable-muxer=flv --enable-muxer=h264 --enable-muxer=flv --enable-muxer=mp4 --enable-muxer=data --enable-muxer=avi --enable-muxer=mpeg2video --enable-muxer=pcm_alaw --enable-muxer=pcm_mulaw --enable-demuxer=flv --enable-demuxer=mpegts --enable-demuxer=rtsp --enable-protocol=httpproxy --enable-protocol=crypto --enable-protocol=ftp --enable-protocol=unix --enable-protocol=pipe --enable-protocol=data --enable-protocol=file --enable-protocol=tcp --enable-protocol=http --enable-protocol=udp --enable-protocol=udplite --enable-protocol=rtp --enable-protocol=librtmp --enable-protocol=librtmpe --enable-protocol=librtmps --enable-protocol=librtmpt --enable-protocol=librtmpte --enable-protocol=async --enable-protocol=md5 --enable-protocol=cache --enable-protocol=mmst --enable-protocol=mmsh --sysroot=$SYSROOT --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- --enable-hwaccels --enable-zlib --disable-devices --disable-avdevice --extra-cflags="-Os -fpic $ADDI_CFLAGS" --extra-cflags="-I/home/wgg/wgg/ffmpeg/extern/include" --extra-ldflags="-L/home/wgg/wgg/ffmpeg/extern/lib"
NDK指定NDK包路径,SYSROOT是路径前缀,编译是编译器会去系统路径下(例如/usr/lib,/lib),定义了SYSROOT以后编译原系统路径前加上$SYSROOT,表达式
中android-21要根据实际android重新设定。configure 选项可以根据需要自行删减。--extra-cflags="-I/home/wgg/wgg/ffmpeg/extern/include" 指示外部库的头文件绝对路径,--extra-ldflags="-L/home/wgg/wgg/ffmpeg/extern/lib" 指示外部so库路径。
二. 放置外部库及头文件
将librtmp.so libx264 libcrypto.so libssl.so 后两个库是第一个库的依赖库放在/home/wgg/wgg/ffmpeg/extern/lib下面。将x264.h, x264_config.h以及rtmp文件夹放在/home/wgg/wgg/ffmpeg/extern/include目录下,rtmp文件夹中文件如下。
三.修改配置文件
将
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)' LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)' SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME
替换为
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS='$(SLIBNAME)'
enabled librtmp && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
修改成
enabled librtmp && require librtmp librtmp/rtmp.h RTMP_Socket -lrtmp
将
enabled libx264 && { use_pkg_config x264 "stdint.h x264.h" x264_encoder_encode || { require libx264 x264.h x264_encoder_encode -lx264 && warn "using libx264 without pkg-config"; } } && { check_cpp_condition x264.h "X264_BUILD >= 118" || die "ERROR: libx264 must be installed and version must be >= 0.118."; } && { check_cpp_condition x264.h "X264_MPEG2" && enable libx262; }
替换为
enabled libx264 && require libx264 x264.h x264_encoder_encode -lx264
修改build_ffmpeg.sh权限 chmod +x build_ffmpeg.sh
OK,所有的准备工作都做好了。首先./build_ffmpeg.sh,接着make 最后 make install.
注意:我这里用的ffmepg版本是3.0.2,librtmp,libx264基本不用改动,直接引用so不用再去编译了。获取外部引用库请加入QQ群
流媒体/Ffmpeg/音视频 127903734。