跳至主要內容

14.集成ffmpeg

约 1047 字大约 3 分钟

在linux下编译android需要的.so文件

安装ndk

# 下载
wget https://dl.google.com/android/repository/android-ndk-r26b-linux.zip?hl=zh-cn
# 解压
unzip android-ndk-r26b-linux.zip
# 配置ndk环境变量



下载ffmpeg并解压

wget --no-check-certificate http://ffmpeg.org/releases/ffmpeg-6.1.tar.gz
tar -zxvf ffmpeg-6.1.tar.gz
rm -rf ffmpeg-6.1.tar.gz

编译ffmpeg 编写编译脚本并执行

编写shell脚本armv8-a build.sh

#!/bin/bash
#Ffmpeg源码路径
SRC_DIR=/root/ndk/ffmpeg-6.1
#编译后文件安装位置
DST_DIR=/root/ndk/ffmpeg_out/armv8-a
#NDK路径
NDK_PATH=/root/ndk/android-ndk-r26b/toolchains/llvm/prebuilt/linux-x86_64
cd $SRC_DIR
##########################################################################
##########################################################################
##########################################################################
##########################################################################
echo ">> =============  开始编译, CPU: $CPU  请等待几分钟..."
./configure \
    --prefix=$DST_DIR \
    --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=$NDK_PATH/bin/aarch64-linux-android- \
    --target-os=android \
    --arch=arm64 \
    --cpu=armv8-a \
    --cc=$NDK_PATH/bin/aarch64-linux-android21-clang \
    --cxx=$NDK_PATH/bin/aarch64-linux-android21-clang++ \
    --nm=$NDK_PATH/bin/llvm-nm \
    --ar=$NDK_PATH/bin/llvm-ar \
    --ranlib=$NDK_PATH/bin/llvm-ranlib    \
    --strip=$NDK_PATH/bin/llvm-strip  \
    --pkg-config=/usr/bin/pkg-config  \
    --enable-cross-compile \
    --sysroot=$NDK_PATH/sysroot \
    --extra-cflags="-march=armv8-a" \
    --extra-ldflags="$ADDI_LDFLAGS"
make clean
make
make install
echo "<< =================  编译完成   "

编写shell脚本armv7-a build.sh

#!/bin/bash
#Ffmpeg源码路径
SRC_DIR=/root/ndk/ffmpeg-6.1
#编译后文件安装位置
DST_DIR=/root/ndk/ffmpeg_out/armv7-a
#NDK路径
NDK_PATH=/root/ndk/android-ndk-r26b/toolchains/llvm/prebuilt/linux-x86_64
cd $SRC_DIR
echo ">> =============  开始编译, CPU: $CPU  请等待几分钟..."
./configure \
--prefix=$DST_DIR \
--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=$NDK_PATH/bin/arm-linux-androideabi- \
--target-os=android \
--arch=arm \
--cpu=armv7-a \
--cc=$NDK_PATH/bin/armv7a-linux-androideabi21-clang \
--cxx=$NDK_PATH/bin/armv7a-linux-androideabi21-clang++ \
--nm=$NDK_PATH/bin/llvm-nm \
--ar=$NDK_PATH/bin/llvm-ar \
--ranlib=$NDK_PATH/bin/llvm-ranlib    \
--strip=$NDK_PATH/bin/llvm-strip  \
--pkg-config=/usr/bin/pkg-config  \
--enable-cross-compile \
--sysroot=$NDK_PATH/sysroot \
--extra-cflags="-Os -fpic -mfloat-abi=softfp -mfpu=vfp -marm -march=armv7-a " \
--extra-ldflags="$ADDI_LDFLAGS"

make clean
make
make install
echo "<< =================  编译完成   "

执行编译,完成后目录结构

对我们最重要的是include和lib。include用于存放头文件,lib用于存放静态库.a,或动态库.so。
FFmpeg 有六个常用的功能模块:
libavformat:多媒体文件或协议的封装和解封装库;
libavcodec:音视频编解码库;
libavfilter:音视频、字幕滤镜库;
libswscale:图像格式转换库;
libswresample:音频重采样库;
libavutil:工具库。

各个参数的含义

这里面最核心的就是编译这步,由于网上资料不全,在这里卡了好久,各种报错。
最核心的几个参数:
--cross-prefix=
--cc=
--cxx=
--nm=
--ar=
--ranlib=
--strip=
--pkg-config=
少了上面那几个参数,编译都编译不过去,
--cross-prefix用于指明交叉编译工具前缀,如v7下是:arm-linux-androideabi- ,而v8下是:aarch64-linux-android- ,这个可以通过查找ndk找到。
--cc用于配置 C 编译器,在这里我们是clang,
--cxx用于配置c++编译器,在这里我们是clang++。
--nm、--ar、--ranlib、--strip这几个选项由于ndk-r26中已经被替换成:llvm-nm、llvm-ar、llvm-ranlib、llvm-strip,所以我们编译时也要把这几个参数替换掉。
--pkg-config用于检查和获取库和头文件信息的工具,我们需要显示指明他的安装路径,不然编译或者make会报错,我们可以通过 “which pkg-config” 命令查找到路径,如果没安装的话,我们可以先通过 “apt-get update && apt-get install -y pkg-config” 安装。

然后是与我们最终生成lib库相关的几个重要参数:
--prefix= :用于指明我们最终生成文件的保存路径,注意需要提前创建目标文件夹并赋予写的权限。
--arch=   :如果我们需要生成的是32位,填arm,若是64位,则填arm64。
--cpu=    :如果我们需要生成的是32位,填armv7-a,若是64位,则填armv8-a。
--cc=     :如果我们需要生成的是32位,填armv7a-linux-androideabi21-clang,若是64位,则填aarch64-linux-android21-clang。android21代表最低支持android21版本,我们还可以根据需求用aarch64-linux-android34-clang。
--cxx=    :与--cc类似,不过他用的是clang++,比如:armv7a-linux-androideabi21-clang++
--extra-cflags=    :配置编译的架构信息,如果我们需要生成的是32位,填"-Os -fpic -mfloat-abi=softfp -mfpu=vfp -marm -march=armv7-a ",若是64位,则填"-march=armv8-a"。

然后其他参数是配置ffmpeg启用/禁用什么东西,比如:
--enable-shared  :代表生成动态库
--enable-static  :代表生成静态库