• Ubuntu 生成ffmpeg安卓全平台so



    前言

    做安卓开发的时候,需要实现拉流渲染视频之类的功能,使用ffmpeg比较方便。但是要生成ffmpeg的安卓库是有点麻烦的,需要使用ndk的工具链以及shell。但其实如果了解Linux上编译程序库以及bash,整个生成过程还是相对容易的。


    一、搭建环境

    1、下载NDK

    我们首先需要有NDK的工具链才能进行交叉编译,如果安装了AndroidSudio则找到NDK的目录即可。或者下载Linux版本的NDK:https://developer.android.google.cn/ndk/downloads/
    在这里插入图片描述

    2、下载ffmpeg源码

    http://ffmpeg.org/download.html
    比如当前最新版本5.0.1如下图所所示:
    在这里插入图片描述

    3、安装必要工具

    生成ffmpeg需要一些必要工具,通过如下语句安装。

    sudo apt install gcc make nasm yasm
    
    • 1

    在这里插入图片描述

    二、生成

    1、编写shell

    新建一个build.sh的文件在ffmpeg目录中。添加如下内容,注意换行不能有\r。

    (1)模板

    #!/bin/bash
    #ndk工具链路径 -可配置
    TOOLCHAIN=~/Downloads/android-ndk-r23c-linux/android-ndk-r23c/toolchains/llvm/prebuilt/linux-x86_64
    #ndk api版本 -可配置
    API=29
    SYSROOT=$TOOLCHAIN/sysroot
    function build_start() {
    make clean
    ./configure --target-os=android \
    --prefix=$PREFIX \
    --arch=$ARCH \
    --cpu=$CPU \
    --cc=$CC \
    --cxx=$CXX \
    --cpu=$CPU \
    --strip=$TOOLCHAIN/bin/llvm-strip \
    --nm=$TOOLCHAIN/bin/llvm-nm \
    --enable-shared \
    --disable-static \
    --enable-gpl \
    --cross-prefix=$CROSS_PREFIX \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
    make -j8
    make install 
    }
    CPU=armv7-a
    ARCH=arm
    CROSS_PREFIX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-
    CC=${CROSS_PREFIX}clang
    CXX=CC=${CROSS_PREFIX}clang++
    PREFIX=./android/${CPU}_${API}/
    OPTIMIZE_CFLAGS="-march=$CPU"
    build_start
    CPU=armv8-a
    ARCH=arm64	
    CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android$API-
    CC=${CROSS_PREFIX}clang
    CXX=CC=${CROSS_PREFIX}clang++
    PREFIX=./android/${CPU}_${API}/
    OPTIMIZE_CFLAGS="-march=$CPU"
    build_start
    CPU=x86
    ARCH=x86
    CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android$API-
    CC=${CROSS_PREFIX}clang
    CXX=CC=${CROSS_PREFIX}clang++
    PREFIX=./android/${CPU}_${API}/
    OPTIMIZE_CFLAGS="-march=i686"
    ADDITIONAL_CONFIGURE_FLAG=--disable-asm 
    build_start
    CPU=x86-64
    ARCH=x86_64
    CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android$API-
    CC=${CROSS_PREFIX}clang
    CXX=CC=${CROSS_PREFIX}clang++
    PREFIX=./android/${CPU}_${API}/
    OPTIMIZE_CFLAGS="-march=$CPU"
    build_start
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    (2)设置TOOLCHAIN

    参照模板的路径设置TOOLCHAIN,到linux-x86_64这一级目录。注意将反斜杠改为正斜杠。

    TOOLCHAIN=NDK TOOLCHAIN路径
    
    • 1

    (3)设置API

    根据需要设置API版本如:

    API=29
    
    • 1

    2、修改configure

    修改ffmpeg源码目录的configure文件将如下内如替换。

    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)'
    
    • 1
    • 2
    • 3
    • 4

    将上述内容替换成如下内容。

    SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
    SLIB_INSTALL_LINKS='$(SLIBNAME)'
    
    • 1
    • 2
    • 3
    • 4

    3、使用bash

    (1)打开控制台

    在ffmpeg源码目录打开控制台

    (2)调用shell

    bash ./build.sh
    
    • 1

    注:第一次生成出现如下报错是正常的,继续等待即可。
    在这里插入图片描述

    3、找到安装目录

    生成完成在ffmpeg源码目录的android文件夹下即可找到所有so
    在这里插入图片描述


    三、生成好的包

    已测试可用的生成好的包
    ffmpeg5.0.1安卓全平台so动态库


    总结

    总的来说在Unbuntu上生成ffmpeg还是不难的,网上也是有不少资料的,只不过大部分资料不是很完整,尤其是configure语句比较不通用,比如禁用了汇编对性能是有较大影响的,禁用了所有协议是无法打开任何类型输入流的等等。通常来说适用于大部分场景的应该尽量打开功能,至于x264在安卓一般都用不上,x264适合用于压制高质量视频,这种操作必然是放在pc才合适。fdkaac也类似,很可能大部分情况用不上。所以本文提供的方法,对于一般的常规使用是完全满足的。

  • 相关阅读:
    App逆向入门
    mysql-installer安装教程(详细图文)
    JVM篇---第十一篇
    Word2Vec 实践
    web服务之https超文本传输安全协议
    ETL之apache hop系列4-hop开发数据增量同步功能
    基于无线Mesh网络OLSR路由协议的MATLAB仿真
    服务器端优化、NIO、非阻塞的HTTP服务器
    Shell 脚本学习笔记
    并发与并行,线程的创建
  • 原文地址:https://blog.csdn.net/u013113678/article/details/125451768