ffmpeg(1)-编译第一个so

550 阅读4分钟

1、前言

编译环境的说明:
1.  make
2.  git
3.  NDK(android-ndk-r14b-linux-x86_64.zip)
4.  FFmpeg(ffmpeg-3.2.1.tar.gz)
5.  Ubuntu系统

2、编译环境准备

2.1 环境安装

(1)安装make,后面编译时会用到:

sudo apt-get install make

ab3b1249-352c-437f-beeb-c1b341e5411c.bmp

(2)安装GIT

先安装起来,虽然本次没有使用,后面会继续使用

sudo apt-get install make

4d7fb6e7-9151-4320-8139-79553d819f73.bmp

(3)NDK的选择

NDK R15、R16-beta版本都验证过,编译不过,各种奇怪的错误,后来改为 NDK R14,为保证成功,建议使用 NDK R14

NDK 下载地址: 下载地址

NDK 解压: 使用 unzip 指令解压NDK到指定目录

(4)FFMPEG的选择

使用下面的指令下载ffmpeg3.2.1(我曾尝试过ffmpeg4.0版本,因为一些列元音未编译成功)

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

使用解压指令解压FFmpeg

unzip ffmpeg-3.2.1.tar.gz   

2.2 修改配置文件

默认编译后的.so文件格式为:文件明+.so+三段版本号的格式比如libavformat.so.57.0.101。这种的文件格式不太符合我们的使用要求,而且即便是将这样的文件名称简单粗暴的删除.so后面的版本号,在实际使用时也无法编译。所以修改如下

修改前

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

2.3 编写编译(.SH)脚本

创建编译脚本

在ffmpeg 根目录下创建build_ffmpeg.sh(名称随意): 定位到FFmpeg路径下,使用命令 touch build_ffmpeg.sh 即可创建文件

创建后,脚本如下所示:

89185fd6-93f5-41d8-9a99-24f486e59fe4.bmp

修改编译脚本内容

#!/bin/bash
make clean
#填写你具体的ndk解压目录
export NDK=/android/ndk/android-ndk-r13b
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
#编译后的文件会放置在 当前路径下的android/arm/下
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
 
 
#./configure 即为ffmpeg 根目录下的可执行文件configure
#你可以在ffmpeg根目录下使用./configure --hellp 查看 ./configure后可填入的参数。
 
./configure --target-os=linux \
    --prefix=$PREFIX --arch=arm \
    --disable-doc \
    --enable-shared \
    --disable-static \
    --disable-yasm \
    --disable-symver \
    --enable-gpl \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_CFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install

2.4 编译运行

1、修改.SH脚本文件权限,保证脚本可以正常执行

chmod +x build_ffmpeg.sh

2、运行.SH脚本

./build_ffmpeg.sh

3、开始进行编译

8d0a9d5f63a9e201abc60ed8f221f243.png

2.5 编译完成

编译时间较长 20分钟左右,之后在android目录下,可以看到生成的文件

84f75eea-32f9-4ee4-88d6-1971e5d5308a.bmp

83771e7e-734b-4157-8648-8761d47c3b71.bmp

3 FFmpeg重新编译

更新于2023-2.4号下午

前面的编译过程,虽然编译通过了,但是里面不含有静态文件.a,所以这里再次进行了尝试,找到比较新的NDK和FFmpeg版本。

主要过程还是参考这篇文章juejin.cn/post/720317…,替换下面一些资源即可

1、替换ndk、ffmpeg版本

1、android-ndk-r20b-linux-x86_64
2、ffmpeg-4.2.2

2、替换脚本build_ffmpeg.sh

#!/bin/bash

export NDK=/home/vivo/download/android-ndk-r20b-linux-x86_64/android-ndk-r20b #这里配置先你的 NDK 路径
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64


function build_android
{

./configure \
--prefix=$PREFIX \
--enable-neon  \
--enable-hwaccels  \
--enable-gpl   \
--disable-postproc \
--disable-debug \
--enable-small \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-static \
--enable-shared \
--disable-doc \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS"

make clean
make -j16
make install

echo "============================ build android arm64-v8a success =========================="

}

#arm64-v8a
ARCH=arm64
CPU=armv8-a
API=21
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"

build_android

编译成功后会在 android 目录下生成对应六个模块的静态库和动态库

88435c0c-a4bc-4936-8a5f-7f199efb9b1a.bmp

另外,若要编译成 32 位的库,则需修改对应的编译脚本:

#armv7-a
ARCH=arm
CPU=armv7-a
API=21
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "

至此,编译部分完成了