C++ 2.FFmpeg-4.3.2 编译 Android 动态库 (ubuntu 18.04 , r21b)

453 阅读1分钟

C++ 2.FFmpeg-4.3.2 编译 Android 动态库 (ubuntu 18.04 , r21b)

qq群

编译环境

Linux 系统:

ubuntu18.04

NDK

ndk/android-ndk-r21b

FFmpeg

ffmpeg-4.3.2

ffmpeg 下载后的文件名

ffmpeg_4.3.2.orig.tar.xz

解压方式

tar xvJf ffmpeg_4.3.2.orig.tar.xz

在 root 权限下操作

编译

  • 4.3.2 版本不需要修改 configure 文件
  • 编写 Android 编译脚本

新建文件 build_android.sh

#!/bin/bash

# ndk路径
NDK=/home/build/workspace/hqq/vision/vision-app/ndk/android-ndk-r21b
# 编译工具链目录,ndk17版本以上用的是clang,以下是gcc
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# 版本号
API=21
# 交叉编译树的根目录(查找相应头文件和库用)
SYSROOT="${TOOLCHAIN}/sysroot"
# 定义执行configure的shell方法
function build_android() {
    ./configure \
        --prefix=$PREFIX \
        --enable-shared \
        --disable-static \
        --enable-jni \
        --enable-gpl \
        --enable-small \
        --disable-doc \
        --disable-programs \
        --disable-symver \
        --target-os=android \
        --arch=$ARCH \
        --cpu=$CPU \
        --cc=$CC \
        --cxx=$CXX \
        --enable-cross-compile \
        --cross-prefix=$CROSS_COMPILE \
        --sysroot=$SYSROOT \
        --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
        --extra-ldflags="" \
        --disable-asm \
        $COMMON_FF_CFG_FLAGS
    make clean
    make -j16
    make install
}


# arm
OUTPUT_FOLDER=arm
ARCH=arm
CPU=armv7-a
TOOL_CPU_NAME=armv7a
TOOL_PREFIX=$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-androideabi
OPTIMIZE_CFLAGS="-marm -march=$CPU"
PREFIX=${PWD}/android/$OUTPUT_FOLDER
CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
CC=${TOOL_PREFIX}${API}-clang
CXX=${TOOL_PREFIX}${API}-clang++
build_android

# arm64,这个指令集最低支持api21
OUTPUT_FOLDER=arm64-v8a
ARCH=aarch64
CPU=armv8-a
TOOL_CPU_NAME=aarch64
TOOL_PREFIX=$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android
OPTIMIZE_CFLAGS="-march=$CPU"
PREFIX=${PWD}/android/$OUTPUT_FOLDER
CROSS_COMPILE=$TOOLCHAIN/bin/aarch64-linux-android-
CC=${TOOL_PREFIX}${API}-clang
CXX=${TOOL_PREFIX}${API}-clang++
build_android

# x86
OUTPUT_FOLDER=x86
ARCH=x86
CPU=x86
TOOL_CPU_NAME=i686
TOOL_PREFIX=$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android
OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
PREFIX=${PWD}/android/$OUTPUT_FOLDER
CROSS_COMPILE=$TOOLCHAIN/bin/i686-linux-android-
CC=${TOOL_PREFIX}${API}-clang
CXX=${TOOL_PREFIX}${API}-clang++
build_android

# x86_64,这个指令集最低支持api21
OUTPUT_FOLDER=x86_64
ARCH=x86_64
CPU=x86-64
TOOL_CPU_NAME=x86_64
TOOL_PREFIX=$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android
OPTIMIZE_CFLAGS="-march=$CPU -mtune=intel -msse4.2 -mpopcnt -m64"
# 输出目录
PREFIX=${PWD}/android/$OUTPUT_FOLDER
CROSS_COMPILE=$TOOLCHAIN/bin/x86_64-linux-android-
# so的输出目录, --libdir=$LIB_DIR 可以不用指定,默认会生成在$PREFIX/lib目录中
#LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
# 编译器
CC=${TOOL_PREFIX}${API}-clang
CXX=${TOOL_PREFIX}${API}-clang++
build_android

修改文件权限

chmod 777 build_android.sh

执行 build_android.sh

可编译出 "armeabi-v7a", "arm64-v8a", "x86", "x86_64"

如果编译失败,在打开文件粘贴时

:set ff #查看文件的格式会看到fileformat=dos 或者 fileformat=unix

:set ff=unix #设置为unix格式

:wq #保存退出

编译后文件

在目录下 android 文件夹下 在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

取 .so 库放到 Android 项目中

在这里插入图片描述

github lib 库

android_ffmpeg_lib

github.com/taxiao213/a…

微信公众号 -->> 他晓 (欢迎加入)

公众号