Linux 下编译ffmpeg android so库

1、下载ffmpeg和NDK

ffmpeg使用4.2.2为例,先下载到linux

wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.gz

解压到当前目录

tar -zxvf ffmpeg-4.2.2.tar.gz

更多版本

NDK使用21Linux版本

在这个地址使用手动下载 完成后再放到linux中

https://developer.android.google.cn/ndk/downloads/


下载完成后解压

unzip android-ndk-r21e-linux-x86_64.zip

上面都解压完的效果:


2、配置文件

1、修改so文件的命名规则,默认so库命名:文件名+.so+三段版本号的格式比如 libavformat.so.57.0.101,这样的格式我们无法直接使用,所以需要修改成xxx.so样式,去掉后面的版本

进入到ffpemg目录,修改configure文件

cd ffmpeg-4.2.2

vim configure

打开configure文件后可以使用 /+关键字搜索定位到下面内容位置(我使用/SLIBNAME_WITH_MAJOR进行定位)

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)'

这样就修改了so的命名

3、新增编译文件

新建一个用了编译so库的文件android_build.sh

vim android_build.sh

把下面内容复制进去,下面包含了arm\x86平台的编译,一次只能编译一个,通过注释完成不同平台的编译

#!/bin/bash

NDK=/home/mirrer/work/ffmpeg/android-ndk-r21e #这个是ndk目录根据前面下载的目录修改

HOST_TAG=linux-x86_64

#HOST_TAG 的值根据系统修改

#macOS  darwin-x86_64

#Linux  linux-x86_64

#32-bit Windows  windows

#64-bit Windows  windows-x86_64

TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG

API=21

function build_android

{

echo "Compiling FFmpeg for $CPU and prefix is $PREFIX" #这里会打印出编译后so库的目录

./configure \

    --prefix=$PREFIX \ #配置so库编译后的目录

    --disable-x86asm \

    --disable-neon \

    --disable-hwaccels \

    --disable-gpl \

    --disable-postproc \

    --enable-shared \ #打开编译成动态库

    --enable-jni \  #打开jni 通过 jni 调用 java 调用 硬解码

    --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 \ #编译完成后在android系统中运行

    --arch=$ARCH \  #指定CPU架构

    --cpu=$CPU \ #指定CPU指令集

    --cc=$CC \  #指定编译器

    --cxx=$CXX \

    --enable-cross-compile \

    --sysroot=$SYSROOT \

    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \

    --extra-ldflags="$ADDI_LDFLAGS" \

    $ADDITIONAL_CONFIGURE_FLAG

# make clean

# make -j2

# make install

echo "The Compilation of FFmpeg for $CPU is completed"

}

# arm64-v8a  aarch64-linux-android

# ARCH=arm64

# CPU=armv8-a

# TRIPLE=aarch64-linux-android

# STRIP=aarch64-linux-android

# OPTIMIZE_CFLAGS="-march=$CPU"

# armeabi-v7a armv7a-linux-androideabi

ARCH=arm

CPU=armv7-a

TRIPLE=armv7a-linux-androideabi

STRIP=arm-linux-androideabi

OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "

echo "set arm cup"

# # x86 i686-linux-android

# ARCH=x86

# CPU=x86

# TRIPLE=i686-linux-android

# STRIP=i686-linux-android

# OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"

# x86-64  x86_64-linux-android

# ARCH=x86_64

# CPU=x86-64

# TRIPLE=x86_64-linux-android

# STRIP=x86_64-linux-android

# OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"

CC=$TOOLCHAIN/bin/$TRIPLE$API-clang

CXX=$TOOLCHAIN/bin/$TRIPLE$API-clang++

SYSROOT=$NDK/toolchains/llvm/prebuilt/$HOST_TAG/sysroot

CROSS_PREFIX=$TOOLCHAIN/bin/$STRIP-

PREFIX=$(pwd)/android/$CPU

function build

{

  build_android

  echo "start make"

  make clean

  make -j4

  echo "start make install"

  make install

  echo "make finish"

}

build

等待编译完成后 so文件默认会在当前目录/android/armv7-a下


到此so库编译完成

你可能感兴趣的:(Linux 下编译ffmpeg android so库)