Windows平台下用ubantu编译android开发可用的FFmpeg静态库(包括openssl)

2,985 阅读3分钟

前言:

程序员开发工具的尽头一定是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

1641742366(1).png

安装好后在启动栏点击打开若是提示disable,则需要设置一下windows的环境:

点击系统的开始键选择设置,点击更新和安全,选择开发选项,选择开发人员模式,然后返回上一级,选择点击应用,后再点击右边栏的程序与功能,进入到如下页面:

1641743242(1).png

最后点击启用或者关闭windows功能,在弹出的窗口勾选适用于Linux的windows子系统:

1641743382(1).png

接下来是对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后确定:

1641745324(1).png

在看到如下页面时,输入地址和端口以及用户名:

1641745660(1).jpg

点击连接,我们就会看到如下页面了:

1641745738(1).png

编译准备以及脚本编写

1、在ubantu的home文件夹下分别新建名为ndk和ffmpeg的文件夹,通过火狐浏览器下载好源码并解压,ffmpeg的目录结构如下:

1641747822(1).png

首先修改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,执行的时间会比较长,最后得到如下的库:

1641749751(1).png

至此,编译成功!

感谢:www.jianshu.com/p/5b3cf2054… blog.csdn.net/qq_15260769…