前言:
程序员开发工具的尽头一定是Mac!
编译前的准备
1、ubantu18.0.4LTS 安装以及可视化;
2、FFmpeg源码:github.com/FFmpeg/FFmp… 此次编译使用的4.2版本的分支,主要是因早前编译过4.2版本对ExoPlayer的FFmpeg扩展支持;
3、Openssl源码:github.com/openssl/ope… 或者官网下载直接下载:www.openssl.org/source/, 选择1.1.1版本
3、ndk版本:android-ndk-r21,dl.google.com/android/rep…
ubantu安装以及可视化处理
1、打开windows自带的Microsoft Store,搜索输入ubantu,选择下载安装18.04 LTS
安装好后在启动栏点击打开若是提示disable,则需要设置一下windows的环境:
点击系统的开始键选择设置,点击更新和安全,选择开发选项,选择开发人员模式,然后返回上一级,选择点击应用,后再点击右边栏的程序与功能,进入到如下页面:
最后点击启用或者关闭windows功能,在弹出的窗口勾选适用于Linux的windows子系统:
接下来是对ubantu进行可视化,网上教程很多,可自行谷歌搜索一下,可视化主要是为了编译方便。大体流程如下:
打开ubantu,依次输入以下输入命令:
更新源:
sudo apt-get update;
安装xorg:sudo apt-get install xorg;
安装xfce4:sudo apt-get install xfce4;
安装xrdp:sudo apt-get install xrdp;
配置xrdp的端口:sudo sed -i 's/port=3389/port=3390/g' /etc/xrdp/xrdp.ini
向xsession中写入xfce4-session:sudo echo xfce4-session >~/.xsession;
最后重启xrdp服务:sudo service xrdp restart。
通过远程桌面连接到Linux系统桌面:
右键win的开始键,选择运行,输入mstsc后确定:
在看到如下页面时,输入地址和端口以及用户名:
点击连接,我们就会看到如下页面了:
编译准备以及脚本编写
1、在ubantu的home文件夹下分别新建名为ndk和ffmpeg的文件夹,通过火狐浏览器下载好源码并解压,ffmpeg的目录结构如下:
首先修改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_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl ||
添加下面这一句
check_lib openssl openssl/ssl.h OPENSSL_init_ssl -lssl -lcrypto ||
添加编译的脚本:
openssl编译脚本build_android_openssl.sh:
#!/bin/bash
cd openssl-1.1.1
#需要替换到自己的目录路径
export ANDROID_NDK_ROOT=/home/qisan/ndk/android-ndk-r21
export PATH=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
export ANDROID_NDK_HOME=$ANDROID_NDK_ROOT
./config
function build
{
echo "begin build openssl for $PLATFORM_ABI "
make clean
./Configure $PLATFORM_ABI -D__ANDROID_API__=$PLATFORM_API no-threads no-shared no-ssl3 no-comp no-hw no-engine --prefix=$PREFIX
make
make install
rm -r $PREFIX/bin
rm -r $PREFIX/share
rm -r $PREFIX/ssl
rm -r $PREFIX/lib/engines-1.1
echo "build openssl for $PLATFORM_ABI completed "
}
#arm-v7a
PLATFORM_ABI=android-arm
PLATFORM_API=19
PREFIX=/home/qisan/ffmpeg/openssl-1.1.1/android/arm
PATH=$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH
build
#arm64 先在openssl-1.1.1目录新建好android/arm64 其他亦是
PLATFORM_ABI=android-arm64
PLATFORM_API=21
PREFIX=/home/qisan/ffmpeg/openssl-1.1.1/android/arm64
PATH=$ANDROID_NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin:$PATH
build
#x86
PLATFORM_ABI=android-x86
PLATFORM_API=19
PREFIX=/home/qisan/ffmpeg/openssl-1.1.1/android/x86
PATH=$ANDROID_NDK_ROOT/toolchains/x86-4.9/prebuilt/linux-x86_64/bin:$PATH
build
#x86_64
PLATFORM_ABI=android-x86_64
PLATFORM_API=21
PREFIX=/home/qisan/ffmpeg/openssl-1.1.1/android/x86_64
PATH=$ANDROID_NDK_ROOT/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin:$PATH
build
ffmpeg编译脚本build_android_ffmpeg.sh:
#! /bin/bash
#替换自身的环境路径
OUTPUT=/home/qisan/ffmpeg/ffmpeg-4.2/android
NDK=/home/qisan/ndk/android-ndk-r21
#这里是引用openssl的库
SSL=/home/qisan/ffmpeg/openssl-1.1.1/android
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
cd ffmpeg-4.2
function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
--prefix=$PREFIX \
--disable-x86asm \
--disable-asm \
--disable-hwaccels \
--disable-gpl \
--disable-postproc \
--enable-shared \
--enable-jni \
--disable-mediacodec \
--disable-decoder=h264_mediacodec \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--enable-openssl \
--enable-protocols \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS $SSL_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS $SSL_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
# --enable-openssl 可以使用openssl --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS $SSL_CFLAGS" 引用openssl的头文件,
# --extra-ldflags="$ADDI_LDFLAGS $SSL_LDFLAGS" 引用openssl静态库
make clean
make
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}
#armv7-a 输出目录先在ffmpeg源码目录添加好
function build_arm
{
ARCH=arm
CPU=armv7-a
API=19
SSL_CFLAGS=-I$SSL/$ARCH/include
SSL_LDFLAGS=-L$SSL/$ARCH/lib
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$OUTPUT/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
build_android
}
#armv8-a
function build_arm64
{
ARCH=arm64
CPU=armv8-a
API=21
SSL_CFLAGS=-I$SSL/$ARCH/include
SSL_LDFLAGS=-L$SSL/$ARCH/lib
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$OUTPUT/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
}
#x86
function build_x86
{
ARCH=x86
CPU=x86
API=19
SSL_CFLAGS=-I$SSL/$ARCH/include
SSL_LDFLAGS=-L$SSL/$ARCH/lib
CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
PREFIX=$OUTPUT/$CPU
OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
build_android
}
#x86_64
function build_x86_64
{
ARCH=x86_64
CPU=x86-64
API=21
SSL_CFLAGS=-I$SSL/$ARCH/include
SSL_LDFLAGS=-L$SSL/$ARCH/lib
CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
PREFIX=$OUTPUT/$CPU
OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
build_android
}
function dash
{
echo '------------------------------------------------------------'
echo '------------------------------------------------------------'
echo '------------------------------------------------------------'
}
build_arm
dash
build_arm64
dash
build_x86
dash
build_x86_64
在ffmpeg目录下Open Terminal,在执行ffmpeg脚本前要先执行命令:./configure --disable-x86asm,这是因为xmakefile文件没有生成,为了不被权限问题困扰,再分别对两个脚本执行以下命令:
chmod 777 build_android_openssl.sh
chmod 777 build_android_ffmpeg.sh
执行编译脚本
./build_android_openssl.sh
./build_android_ffmpeg.sh
先等openssl脚本执行完,再去执行ffmpeg,执行的时间会比较长,最后得到如下的库:
至此,编译成功!