Android 集成 FFmpeg so库流程 (一)(Linux版本)

目前时间2023.02.27,时间太长可能参考价值就没有了mac版本可参考

一、版本准备

FFmpeg : 4.1.10
Android Ndk 20b(必须从官网下载,不能使用 as 自带ndk,备注:这个是其他博客说的,没有自己试过)
linux 环境(带有make命令的,没有安装过的需要自己安装一下) + XShell7 + Xftp7 (XShell7 & Xftp7 都可以免费申请)

二、效果 (国际惯例)

获取 FFmpeg 对应 Android 的so库
效果图:


三、步骤

3.1、下载 & 解压 (FFmpeg & Android ndk)

该步骤需要强调的的是有时候打不开加载页面时,有可能需要梯子帮你一把(>-<)!
效果:(ndk下载是zip ,需要使用 unzip 命令,ffmpeg下载是 gz ,需要使用 tar -zxvf 文件名 形式解压)

3.2、配置build.sh (名字可以自己定)

在ffmpeg文件目录下建立 build.sh 文件,可以使用 vim 命令创建,也可以先创建在本地,然后使用Xftp 图形化界面上传

#!/bin/bash
***NDK_HOME=/usr/work/ndk/android-ndk-r19c #NDK目录,自行修改***
#API=21
# arm aarch64 i686 x86_64  进行修改
#ARCH=aarch64 
# armv7a aarch64 i686 x86_64  进行修改
#PLATFORM=aarch64
#TARGET=$PLATFORM-linux-android  #请查看目录下对应文件名,这里是64位文件名
#TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin # 这里找到对应得文件


 build_one()
{

./configure \
--ln_s="cp -rf" \
--prefix=$PREFIX \
--cc=$TOOLCHAIN/$TARGET$API-clang \
--cxx=$TOOLCHAIN/$TARGET$API-clang++ \
--ld=$TOOLCHAIN/$TARGET$API-clang \
--nm=$NM \
--strip=$STRIP \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cross-prefix=$CROSS_PREFIX \
--disable-programs \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-avfilter \
--enable-cross-compile \
--disable-devices \
--disable-indevs \
--disable-outdevs \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-asm \
--disable-symver \
--disable-encoders \
--disable-programs \
--disable-htmlpages \
--disable-manpages \
--disable-podpages \
--disable-txtpages \
--disable-muxers \
--disable-debug \
--enable-shared \
--enable-small \
--enable-runtime-cpudetect \
--extra-cflags="-Os -fpic $CFLAGS" \
--extra-ldflags="$LDFLAGS"


make clean
make -j4
make install
}
#根据自己需要的版本生成对应的so库即可
#------------------armv7a------------------
API=16
CPU=armv7-a
ARCH=armv7a
PLATFORM=arm
TARGET=armv7a-linux-androideabi
TOOLCHAIN=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin
CROSS_PREFIX=$TOOLCHAIN/armv7a-linux-androideabi-
NM=$TOOLCHAIN/arm-linux-androideabi-nm
STRIP=$TOOLCHAIN/arm-linux-androideabi-strip
PREFIX=`pwd`/android/$PLATFORM
CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -mfpu=neon"
LDFLAGS="-march=armv7-a -Wl,--fix-cortex-a8"
#build_one
#---------------------------------------

#------------------arm64------------------
API=21
CPU=armv8-a
ARCH=aarch64
PLATFORM=aarch64
TARGET=aarch64-linux-android
TOOLCHAIN=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin
CROSS_PREFIX=$TOOLCHAIN/aarch64-linux-android-
NM=$TOOLCHAIN/aarch64-linux-android-nm
STRIP=$TOOLCHAIN/aarch64-linux-android-strip
PREFIX=`pwd`/android/$PLATFORM
CFLAGS=""
LDFLAGS=""
build_one
#------------------------------------
#------------------x86------------------
API=16
CPU=i686
ARCH=i686
PLATFORM=i686
TARGET=i686-linux-android
TOOLCHAIN=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin
CROSS_PREFIX=$TOOLCHAIN/i686-linux-android-
NM=$TOOLCHAIN/i686-linux-android-nm
STRIP=$TOOLCHAIN/i686-linux-android-strip
PREFIX=`pwd`/android/$PLATFORM
CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
LDFLAGS=""
#build_one
#------------------------------------
#------------------x86_64------------------
API=21
CPU=x86_64
ARCH=x86_64
PLATFORM=x86_64
TARGET=x86_64-linux-android
TOOLCHAIN=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin
CROSS_PREFIX=$TOOLCHAIN/x86_64-linux-android-
NM=$TOOLCHAIN/x86_64-linux-android-nm
STRIP=$TOOLCHAIN/x86_64-linux-android-strip
PREFIX=`pwd`/android/$PLATFORM
CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"
LDFLAGS=""
#build_one

具体参数含义可以到 ffmpeg 官网查看 或者 在 ffmpeg 目录下输入命令 ./configure --help 也可以查看每个参数意义

3.3、权限

在执行build.sh 时候可能会报 没有权限的错误 需要给 configure & build.sh 添加权限

//添加权限代码
chmod 777 build.sh
chmod 777 configure

看其他文章有的写需要修改 configure 源码,其中有一篇讲 ffmpeg 在4之后不需要自己修改configure,因为已经适配了Android ,只需要把traget 设置为 Android (build.sh 代码已经设置)就可以了,试了一下确实不需要需改 configure
权限添加之后在命令行显示高亮在这里插入图片描述

3.4、执行 build.sh
#两个都可以,但是第一个有时会执行不成功,暂时没有找到原因> <
./build.sh 
sh build.sh

执行时间可能会较长,这个会看服务器的运行速度了,快一点的几分钟,慢一点的半个小时。(我这边实际测试只需要几分钟)
运行成功截图(可能会不一样,没有报错就可以,哈哈哈)在这里插入图片描述

3.5、踩过的坑
3.5.1 mac版的build.sh 不能 照搬到linux

这个是我时间主要花的地方,因为是第一次搞 linux ,对于 .sh 文件看不懂,大致看了一下相同,复制上来直接使用,结果就是报一个野指针的错误,然后发现大家没有碰到过,当时看到的 mac 版本(当然mac电脑环境的话这个还是可以使用的,之前实习的时候自己电脑没搞出来,用公司的mac试了下可以生成的) ,结果报错 “getenv()” 函数指向 NULL,一直以为是ndk版本 & ffmpeg版本 不匹配导致的,试了3个版本的ndk * 3个版本的ffmpeg ,都是报相同的错误,大致对比了一下,在 ./configure 里面的参数有几个不同,可能有一些是环境独有的参数。

四、写在后面(无关技术 > – <)

目前被京城某四字大厂实习踢掉的一个多月了,之前一直想写一些博客,奈何自己没有很好的总结能力,刚好今天在搞毕设的时候遇到了一个问题,忙了一天,算是初步打包成功了,(其实一天的工作都没有效果,最后还是抄的课程)(手动狗头)(手动狗头),虽然最后没有留下,但是实习还是学到了很多,这篇博客也是从那时的习惯保持来的,第一次写博客,不知所言,不喜勿碰,不喜勿碰,不喜勿喷

转自:
https://blog.csdn.net/qq_49242830/article/details/129250003