Linux 下编译ffmpeg android so库

本文详细介绍了如何在Linux系统下编译ffmpeg为适用于Android的SO库。首先,下载ffmpeg 4.2.2版本和NDK 21,并进行解压。接着,修改ffmpeg的configure文件,调整SO库的命名规则,去掉版本号。最后,创建并运行android_build.sh脚本,编译适用于arm和x86平台的SO库。
摘要由CSDN通过智能技术生成

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库编译完成

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值