FFmpeg编译Android so文件
说明:
FFmpeg可以用来进行音视频编解码,添加水印,rtmp推流等一系列处理,可以使用命令执行,或者使用api调用。
FFmpeg的音视频编码是一种软编码,可以支持各种编码器的设置。以下将基于fdk-aac音频和x264视频编码进行展开。其中,fdk-aac是对音频进行aac编码,x264是对视频进行h264编码,二者都需要跟ffmepg一起进行编译生成Android所需的so文件。
如下提供一份具体的编译脚本,只针对armv7a。
1.x264编译:
vi /etc/ld.so.conf
加入:/usr/local/lib
安装git: sudo apt-get install git
下载x264: git clone https://code.videolan.org/videolan/x264.git
创建build_x264文件: touch build_x264
vi build_x264
添加如下内容:
#!/bin/bash
export NDK=/home/work/ndk-dir/android-ndk-r13b
export SYSROOT=$NDK/platforms/android-22/arch-arm
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin
export ARCH=arm
export CPU=armv7a
export API=22
export TARGET=i686-linux-android
export PREFIX=/usr/local
export CROSS_PREFIX=$TOOLCHAIN/arm-linux-androideabi-
export ADDI_CLFAGS=""
./configure --prefix=$PREFIX \
--enable-shared \
--enable-static \
--enable-pic \
--cross-prefix=$CROSS_PREFIX \
--host=arm-linux \
--sysroot=$SYSROOT \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4
sudo make install
sudo ldconfig
修改so文件名:
vi configure
将libx264.so.$API 修改为libx264.so
执行编译: source build_x264
编译成功后文件位于/usr/local/include,/usr/local/lib
2.编译fdk-aac:
下载:
wget https://downloads.sourceforge.net/opencore-amr/fdk-aac-2.0.0.tar.gz
tar -xzf fdk-aac-2.0.0.tar.gz
创建build文件: touch build_fdk_aac
vi build_fdk_aac
添加以下内容:
#!/bin/bash
NDK=/home/hoo/work/ndk-dir/android-ndk-r13b
SYSROOT=$NDK/platforms/android-22/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin
API=22
export PREFIX=/usr/local #编译的so目录
CROSS_PREFIX=$TOOLCHAIN/arm-linux-androideabi-
ARM_INC=$SYSROOT/usr/include
ARM_LIB=$SYSROOT/usr/lib
LDFLAGS=" -L$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/arm-linux-androideabi/lib -L$ARM_LIB -lc -lgcc -lm -ldl "
export CXX="${CROSS_PREFIX}g++ --sysroot=${SYSROOT}"
export LDFLAGS="$LDFLAGS"
export CC="${CROSS_PREFIX}gcc --sysroot=${SYSROOT}"
./configure --prefix=$PREFIX \
--enable-shared \
--enable-static \
--host=arm-linux \
make clean
make -j8
sudo make install
sudo ldconfig
修改so文件名:
进入m4目录
vi libtool.m4
替换so.1为so
替换$versuffix为空
替换$major为空
全局替换命令,如:
:%s/$major//g
执行编译: source build_fdk_aac
编译成功后文件位于/usr/local/include,/usr/local/lib
3.ffmpeg,fdk-aac,x264一起编译
下载ffmpeg:
wget http://ffmpeg.org/releases/ffmpeg-4.1.4.tar.gz
tar -xzf ffmpeg-4.1.4.tar.gz
cd ffmpeg-4.1.4
vim 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_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
touch android_build.sh
vim android_build.sh
添加如下:
#!/bin/bash
make clean
export NDK=/home/hoo/work/ndk-dir/android-ndk-r20b
export SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin
export CPU=armv7a
export API=22
export TARGET=$CPU-linux-androideabi
export PREFIX=$(pwd)/android/$CPU
export CROSS_PREFIX=$TOOLCHAIN/arm-linux-androideabi-
export ADDI_CFLAGS="-D__ANDROID_API__=$API -U_FILE_OFFSET_BITS -DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD -Os -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=neon -marm -I/usr/local/include"
export ADD_LDFLAGS="-marm -L/usr/local/lib"
./configure \
--target-os=android \
--prefix=$PREFIX \
--cc=$TOOLCHAIN/$TARGET$API-clang \
--cxx=$TOOLCHAIN/$TARGET$API-clang++ \
--ld=$TOOLCHAIN/$TARGET$API-clang \
--disable-stripping \
--arch=arm \
--disable-doc \
--enable-neon \
--enable-shared \
--disable-static \
--disable-symver \
--enable-nonfree \
--enable-gpl \
--enable-libx264 \
--enable-encoder=libx264 \
--enable-libfdk-aac \
--enable-encoder=libfdk_aac \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--cross-prefix=$CROBOSS_PREFIX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="$ADDI_CFLAGS" \
--extra-ldflags="$ADD_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j8
make install
编译完成后so目录:/ffmpeg-4.1.4/android/armv7a
其中 --enable-neon 这一行设置后,测试发现编码速度会比不开快很多。
注: 以上脚本设置针对armv7a,其它架构可以进行相应修改。另外,上述脚本可以运行通过,编译后的so文件有些大,具体使用可以根据情况进行优化调整。
上一篇: 以太坊系列之五: p2p的nat模块--以太坊源码学习
下一篇: Android APK文件反编译
推荐阅读