Linux 下编译ffmpeg android so库

内容分享1周前发布
0 0 0

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/

Linux 下编译ffmpeg android so库

下载完成后解压

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

上面都解压完的效果:

Linux 下编译ffmpeg android so库

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

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

#!/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下

Linux 下编译ffmpeg android so库

Linux 下编译ffmpeg android so库

到此so库编译完成

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...