Ubuntu18.04编译ffmpeg so(一)

千帆过境方解油盐非易事

青丝渐白才知岁月不饶人

编译

因为在windows下编译ffmepg老出问题,所以还是选择ubuntu来编译ffmpeg来编译成so文件放到Android中使用

环境和准备工作

  1. AndroidStudio用来检验和使用so库
  2. Ubuntu18.04系统(可以使用虚拟机安装)
  3. FFmpeg 4.2.2
  4. NDK(android-ndk-r20b)
  5. make(编译脚本中需要使用)

安装make工具

打开终端输入:

sudo apt-get install make

image.png

因为我这边已经安装了就不演示了(这个一般不会有问题)

安装NDK

ndk下载路径
大家可以自己选择自己对应ndk的版本(我这里选择20b的)
`注意:要下载linux版本的

直接解压,或者使用命令:

tar -jxvf android-ndk-r20b.zip

配置ndk环境

打开终端输入:

sudo gedit ~/.bashrc
进入编辑,在文档最后添加配置

export NDK=/home/xx/Downloads/android-ndk-r20b

export PATH=$PATH:$NDK

image.png

最后保存,然后再终端输入:
source ~/.bashrc

接着测试下是否安装完成:
ndk-build

image.png

下载ffmpeg

打开终端:

  • 下载 ffmpeg-4.2.2

wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.bz2

  • 解压 FFmpeg

tar -jxvf ffmpeg-4.2.2.tar.bz2

配置configure脚本

  • 新增cross_prefix_clang参数

进入到ffmpeg-4.2.2目录下,打开configure文件,搜索CMDLINE_SET就可以找到,在里面新增一条

CMDLINE_SET="
    $PATHS_LIST
    ar
    arch
    as
    assert_level
    build_suffix
    cc
    objcc
    cpu
    cross_prefix
    cross_prefix_clang
    custom_allocator

    ...省略
复制代码
  • 修改编译工具路径

搜搜 ar_default="${cross_prefix}${ar_default}"修改注释中间的两行

ar_default="${cross_prefix}${ar_default}"
#------------------------------------------------
cc_default="${cross_prefix_clang}${cc_default}"
cxx_default="${cross_prefix_clang}${cxx_default}"
#------------------------------------------------
nm_default="${cross_prefix}${nm_default}"
pkg_config_default="${cross_prefix}${pkg_config_default}"

复制代码

这个部分可以参考下大佬的文章,也可以选择用旧版的gcc进行编译,新版本的是支持clang了

新增ffmpeg编译脚本

ffmpeg-4.2.2根目录下新建shell脚本,build_ffmpeg_for_android.sh


#!/bin/bash

echo ">>>>>>>>> 编译硬件解码版本 <<<<<<<<"
echo ">>>>>>>>> 注意:该编译环境目前只在 NDK20b + ffmpeg4.2.2 测试过 <<<<<<<<"
echo ">>>>>>>>> 注意:该编译环境目前只在 NDK20b + ffmpeg4.2.2 测试过 <<<<<<<<"

#你自己的NDK路径.
export NDK=/home/hmh/Downloads/android-ndk-r20b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64


function build_android
{


echo "开始编译 $CPU"

./configure \
--prefix=$PREFIX \
--enable-neon  \
--enable-hwaccels  \
--enable-gpl   \
--enable-postproc \
--enable-shared \
--disable-debug \
--enable-small \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--disable-static \
--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
make install

echo "编译成功 $CPU"

}

#armv8-a
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

#armv7-a
ARCH=arm
CPU=armv7-a
API=16
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 "

build_android
复制代码
  • 注意上面配置修改你的ndk。

编译遇到的坑:

  • armv7a-linux-androideabi-clang is unable to create an executable file

解决方案:查找发现原先的ffmpeg是默认支持gcc的,在4.2.2版本则默认支持clang。这个也可能是我早起选择版本问题。

打开configure配置文件,搜索"$target_os"


if test "$target_os" = android; then 
    # cc_default="clang" 
    cc_default="gcc" 
fi
复制代码
  • make未安装导致无法编译(这一部分忘记截图了)

解决:安装make工具sudo apt-get install make

  • 静态库和动态库切换
    #开启动态库
--enable-shared \
#关闭静态库
--disable-static \

复制代码

编译完成

image.png

image.png

编译的文件

阿里云盘

总结

之前在windows下编译各种问题和配置,最后还是虚拟机安装ubuntu来编译快一些。ffmpeg编译到此结束了,Android的集成案例放到下一篇,怕文章太长影响耐性。小白刚入音视频的坑,有不对的地方还希望大佬指点。

感谢

开发的猫

字节流动

DevYK

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享