音视频系列六 Linux 编译ffmpeg链接openssl

编译openssl

去官网(或者github)下载openssl,解压。
进入解压后的openssl根目录,创建一个build_android_openssl.sh文件,粘贴以下代码

#!/bin/bash
export ANDROID_NDK_HOME=/PublicData/LinuxAndroidSdk/ndk/21.3.6528147 # 修改自己本地的ndk路径

build() {
API=29
CPU=$1
PLATFORM=$2
make clean
rm -rf $(pwd)/android/$CPU
PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_HOME/toolchains/$PLATFORM-4.9/prebuilt/linux-x86_64/bin:$PATH
./Configure android-$CPU -D__ANDROID_API__=$API no-shared no-ssl2 no-ssl3 no-comp no-hw no-engine --prefix=$(pwd)/android/$CPU --openssldir=$(pwd)/android/$CPU

make
make install
}

# build armv7
build arm arm-linux-androideabi

# build armv8
build arm64 aarch64-linux-android

根据自己需求,参考openssl根目录下的NOTES.ANDROID文件进行微调。给执行权限然后运行。等待编译完成。需要注意的是ndk版本和API一定要跟编译ffmpeg的相同。不然后面很大概率会出现openssl not found.

编译ffmpeg

在原先的编译基础上增加下面两个配置打开openssl开关

    --enable-openssl \
    --enable-nonfree \

同时在extra-cflags和extra-cflags中指定上面编译好后的openssl的头文件位置和库位置,如下

    --extra-cflags="-I/PublicData/openssl/openssl_1_1_1l/android/$ARCH/include -fPIE -pie -Os -fpic $OPTIMIZE_CFLAGS" \
    --extra-ldflags="-L/PublicData/openssl/openssl_1_1_1l/android/$ARCH/lib $ADDI_LDFLAGS" \

完整的编译脚本示例如下

#!/bin/bash

NDK=/PublicData/LinuxAndroidSdk/ndk/21.3.6528147
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT="$TOOLCHAIN/sysroot"
API=29

function build_android
{
echo "Compiling FFmpeg for $CPU"
CC="$TOOL_PREFIX$API-clang"
CXX="$TOOL_PREFIX$API-clang++"
PREFIX="${PWD}/android/$OUTPUT_FOLDER"
rm -rf $PREFIX
make clean
./configure \
    --prefix=$PREFIX \
    --libdir=$LIB_DIR \
    --enable-shared \
    --enable-jni \
	--enable-gpl \
    --enable-openssl \
    --enable-nonfree \
    --disable-doc \
    --disable-static \
	--disable-ffmpeg \
	--disable-ffplay \
	--disable-ffprobe \
    --disable-symver \
    --disable-programs \
    --target-os=android \
    --arch=$ARCH \
    --cpu=$CPU \
    --cc=$CC \
    --cxx=$CXX \
    --enable-cross-compile \
	--cross-prefix=$CROSS_PREFIX \
    --sysroot=$SYSROOT \
    --disable-asm \
    --disable-x86asm \
    --extra-cflags="-I/PublicData/openssl/openssl_1_1_1l/android/$ARCH/include -fPIE -pie -Os -fpic $OPTIMIZE_CFLAGS" \
    --extra-ldflags="-L/PublicData/openssl/openssl_1_1_1l/android/$ARCH/lib $ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make -j10
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}

# armv8-a
OUTPUT_FOLDER="arm64-v8a"
ARCH=arm64
CPU="armv8-a"
TOOL_PREFIX="$TOOLCHAIN/bin/aarch64-linux-android"

CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
OPTIMIZE_CFLAGS="-march=$CPU"
build_android

# # armv7-a
OUTPUT_FOLDER="armeabi-v7a"
ARCH=arm
CPU="armv7-a"
TOOL_PREFIX="$TOOLCHAIN/bin/armv7a-linux-androideabi"

CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
OPTIMIZE_CFLAGS="-march=$CPU"
build_android

可以先注释掉make和make install,只运行configure看看配置有没有什么问题。
如果出现openssl not found,然后确认前面的配置没有问题,那就打开ffmpeg根目录下的configure文件,搜索下openssl not found,然后参考下最新版本的ffmpeg,看看两者有什么不同,看情况修改。我的配置如下

...
enabled openssl           && { check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl ||
                               check_pkg_config openssl openssl openssl/ssl.h SSL_library_init ||
                               check_lib openssl openssl/ssl.h OPENSSL_init_ssl -lssl -lcrypto ||
                               check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto ||
                               check_lib openssl openssl/ssl.h SSL_library_init -lssl32 -leay32 ||
                               check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 ||
                               die "ERROR: openssl not found"; }
...

我是在原先的配置上多加了

check_lib openssl openssl/ssl.h OPENSSL_init_ssl -lssl -lcrypto ||

这一行,是新版本的openssl改变导致的。
其他问题自行百度,以此类推。

你可能感兴趣的:(音视频,linux,android)