ffmpeg是一个开源的,功能强大的音视频处理库,可以实现视频编解码,音频采集解码,现在很多的手机上的直播软件用的就是这个开源库。今天写一篇博客来记录自己编译的过程,以免忘记。
编译环境:
系统:Ubuntu 18.04.3 LTS(虚拟机 64位)
FFmpeg (4.1.3)
NDK(android-ndk-r15c)
make
集成步骤:
下载ffmpeg源码:ffmpeg下载地址
下载NDK工具:NDK下载地址
解压ffmpeg源码包,并改名为ffmpeg,同时解压NDK压缩包
修改配置文件
默认编译后的.so文件格式为:文件明+.so+三段版本号的格式比如libavformat.so.57.0.101。这样的文件格式不太符合我们的使用要求,而且即便是将这样的文件名称简单粗暴的删除.so后面的版本号,在实际使用时也无法编译。在ffmpeg目录下修改配置文件Configure 这个文件:
修改之前:
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_VERSION='$(SLINAME).$(LIBVERSION)'
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
配置修改完后开始编写编译脚本。
编写脚本:
在ffmpeg源码目录下创建一个.sh的编译脚本,脚本名称可以随意取,这里直接给出脚本内容:
make clean
NDK=../android-ndk-r17c
SYSROOT=$NDK/platforms/android-14/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
CPU=armv7-a
x264=./x264/
EXTRA_CFLAGS="-I./x264/include"
EXTRA_LDFLAGS="-L./x264/lib"
PREFIX=./libs
./configure \
--target-os=android \
--prefix=$PREFIX \
--arch=arm \
--cpu=armv7-a \
--disable-doc \
--disable-static \
--disable-asm \
--enable-cross-compile \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$SYSROOT \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--enable-version3 \
--enable-pthreads \
--disable-encoders \
--disable-decoders \
--disable-avdevice \
--disable-network \
--disable-symver \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-debug \
--enable-neon \
--enable-shared \
--enable-small \
--enable-libx264 \
--enable-gpl \
--enable-pic \
--enable-jni \
--enable-mediacodec \
--enable-encoder=aac \
--enable-encoder=gif \
--enable-encoder=libopenjpeg \
--enable-encoder=libmp3lame \
--enable-encoder=libwavpack \
--enable-encoder=mpeg4 \
--enable-encoder=pcm_s16le \
--enable-encoder=png \
--enable-encoder=mjpeg \
--enable-encoder=srt \
--enable-encoder=subrip \
--enable-encoder=yuv4 \
--enable-encoder=text \
--enable-decoder=aac \
--enable-decoder=acc_latm \
--enable-decoder=libopenjpeg \
--enable-decoder=mp3 \
--enable-decoder=mpeg4_mediacodec \
--enable-decoder=pcm_s16le \
--enable-decoder=flac \
--enable-decoder=flv \
--enable-decoder=gif \
--enable-decoder=png \
--enable-decoder=srt \
--enable-decoder=xsub \
--enable-decoder=yuv4 \
--enable-decoder=vp8_mediacodec \
--enable-decoder=h264_mediacodec \
--enable-decoder=hevc_mediacodec \
--enable-bsf=h264_mp4toannexb \
--enable-bsf=hevc_mp4toannexb \
--enable-protocols \
--extra-cflags="$ADDI_CFLAGS -I$NDK/sysroot/usr/include/arm-linux-androideabi -isysroot $NDK/sysroot -fPIC -marm -march=armv7-a $EXTRA_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS $EXTRA_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
echo "end!"
这里面包含了x264的合并到ffmpeg的操作,如果没有必要可以去掉。保存好文件,开始编译文件:
1、给文件授权:chmod 7777 xxxxx.sh(这个xxxx 是自己定义的编译文件名)
2、执行编译文件:./xxxxx.sh
3、执行 make 指令 (如果权限不足的情况下需要 执行 sudo make)
4、执行make install 指令 (如果权限不足的情况下需要 执行 sudo make install)
这四步就可以完成 ffmpeg 编译 成 so 动态库 生成的文件的路径就是编译文件中 PREFIX 这个值指定的位置
编译成功的文件就在lib这个目录下。到此ffmpeg编译成so就完成了。
这里补充 编译armv8-a 的编译文件
make clean
NDK=../android-ndk-r17c
SYSROOT=$NDK/platforms/android-21/arch-arm64
TOOLCHAIN=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
CPU=armv8-a
ARCH=arm64
x264=./x264/
EXTRA_CFLAGS="-I./x264/include"
EXTRA_LDFLAGS="-L./x264/lib"
PREFIX=$(pwd)/android/$CPU
./configure \
--target-os=android \
--prefix=$PREFIX \
--arch=$ARCH \
--cpu=$CPU \
--disable-doc \
--disable-static \
--disable-asm \
--enable-cross-compile \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$SYSROOT \
--cc=$TOOLCHAIN/bin/aarch64-linux-android-gcc \
--enable-version3 \
--enable-pthreads \
--disable-network \
--disable-symver \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-debug \
--enable-neon \
--enable-shared \
--enable-small \
--disable-libx264 \
--enable-gpl \
--enable-pic \
--enable-jni \
--enable-mediacodec \
--enable-encoder=aac \
--enable-encoder=gif \
--enable-encoder=libopenjpeg \
--enable-encoder=libmp3lame \
--enable-encoder=libwavpack \
--enable-encoder=mpeg4 \
--enable-encoder=pcm_s16le \
--enable-encoder=png \
--enable-encoder=mjpeg \
--enable-encoder=srt \
--enable-encoder=subrip \
--enable-encoder=yuv4 \
--enable-encoder=text \
--enable-decoder=aac \
--enable-decoder=acc_latm \
--enable-decoder=libopenjpeg \
--enable-decoder=mp3 \
--enable-decoder=mpeg4_mediacodec \
--enable-decoder=pcm_s16le \
--enable-decoder=flac \
--enable-decoder=flv \
--enable-decoder=gif \
--enable-decoder=png \
--enable-decoder=srt \
--enable-decoder=xsub \
--enable-decoder=yuv4 \
--enable-decoder=vp8_mediacodec \
--enable-decoder=h264_mediacodec \
--enable-decoder=hevc_mediacodec \
--enable-bsf=h264_mp4toannexb \
--enable-bsf=hevc_mp4toannexb \
--enable-protocols \
--enable-hwaccels \
--extra-cflags="$ADDI_CFLAGS -I$NDK/sysroot/usr/include/aarch64-linux-android -isysroot $NDK/sysroot -fPIC -march=$CPU" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
echo "end!"