编译FFmpeg+x264移植到安卓(一)
1.环境:Linxu 系统 个人使用深度Deepin 15.1.1,不用乌班图,因为deepin 更利于桌面操作 ,我们仅仅需要一个linux环境而已。
ffmpeg4.2.2 ,ndk 用 R21b 这个版本, x264 安装包,这个版本不讲究。
下载X264安装包 解压重名为X264文件夹:如安装在build 文件夹下
./configure --prefix=/home/dylan/Documents/ffmpegTool/x264/build --disable-asm --enable-static --enable-shared
make
make install
这里我们用脚本来安装,编写脚本前先修改 config 文件,先进入到x264目录,修改configure文件。定位到
else echo "SOSUFFIX=so" >> config.mak echo "SONAME=libx264.so.$API"
这几行,将"libx264.so.$API"替换为"libx264.so",文件名中就不要版本了。
编写脚本文件:build_x264.sh
build_x264.sh
#!/bin/bash
NDK=/home/dylan/Documents/ffmpegTool/android-ndk-r21b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
function build_android
{
#x264路径
x264Dir=/home/dylan/Documents/ffmpegTool/x264/android/$CPU
echo "Compiling FFmpeg for $CPU"
echo "加载x264:$x264Dir"
./configure \
--prefix=$PREFIX \
--enable-cross-compile \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
--extra-cflags="-I$x264Dir/include" \
--extra-ldflags="-L$x264Dir/lib" \
--enable-neon \
--enable-hwaccels \
--enable-gpl \
--enable-libx264 \
--enable-encoder=libx264 \
--enable-postproc \
--enable-shared \
--enable-jni \
--enable-mediacodec \
--disable-static \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--enable-avdevice \
--disable-doc \
--disable-symver \
make clean
make -j4
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}
#armv7-a
API=21
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -mfpu=neon -march=$CPU"
build_android
运行脚本后会生成android 目录,里面是X264 的静态库文件,include 和 lib 需要被 ffmpeg 引用。
安装FFmpeg ,和 x264 一样,要修改ffmpeg 的 config,
打开ffmpeg目录下的configure文件,找到如下一段:
SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'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)'
编写build_ffmpeg_withx264的脚本
#!/bin/bash
NDK=/home/dylan/Documents/ffmpegTool/android-ndk-r21b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
function build_android
{
#x264路径
x264Dir=/home/dylan/Documents/ffmpegTool/x264/android/$CPU
echo "Compiling FFmpeg for $CPU"
echo "加载x264:$x264Dir"
./configure \
--prefix=$PREFIX \
--enable-cross-compile \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
--extra-cflags="-I$x264Dir/include" \
--extra-ldflags="-L$x264Dir/lib" \
--enable-neon \
--enable-hwaccels \
--enable-gpl \
--enable-libx264 \
--enable-encoder=libx264 \
--enable-postproc \
--enable-shared \
--enable-jni \
--enable-mediacodec \
--disable-static \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--enable-avdevice \
--disable-doc \
--disable-symver \
make clean
make -j4
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}
#armv7-a
API=21
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -mfpu=neon -march=$CPU"
build_android
执行build_ffmpeg_withx264.sh, 若看到日志里面 有libx264,说明 ffmpeg 已经把x264 给引用进来了。
执行完后会生成库文件: