当前位置:   article > 正文

Android NDK 编译 FFmpeg:从下载源码到生成库的全过程_ndk ffmpeg

ndk ffmpeg

准备工作

1. 准备 Linux 环境

搭建 Linux 环境,网上已有很多的教程。本文使用的是 WSL2(Windows Subsystem for Linux) 环境,感兴趣的读者可在最后一章参考资料中了解更多信息。

2. 下载 FFmpeg 源码

3. 下载 ndk 工具

4. 配置系统环境变量

  • 拷贝解压后的 android-ndk-r26c-linux 目录到 ~/ndk 路径下
  • 命令行输入 vim ~/.bashrc 编辑 bashrc 文件
  • 在 bashrc 文件末尾追加以下内容后保存并退出:
export NDK_PATH=~/ndk/android-ndk-r26c
export PATH=$NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64/bin/:$PATH
  • 1
  • 2
  • 命令行输入 source ~/.bashrc

编译 FFmpeg 源码

1. 编译选项简介

FFmpeg 源码使用 configure 脚本进行编译前配置,使用 ./configure --help 可以查看支持的编译配置选项。
标准选项: 这些选项用于配置基本的编译和安装参数。例如,–prefix=PREFIX 选项用于指定安装路径。
授权选项: 这些选项用于控制 FFmpeg 的许可证。例如,–enable-gpl 选项允许使用 GPL 许可的代码。
编译和连接选项: 这些选项用于控制 FFmpeg 的编译配置。例如,–disable-static 选项用于禁用静态库的构建,–enable-shared 选项用于启用动态库的构建。
可执行程序控制选项: 这些选项用于控制是否构建特定的程序。例如,–disable-ffmpeg 选项用于禁用 ffmpeg 程序的构建。
文档选项: 这些选项用于控制是否构建文档。例如,–disable-doc 选项用于禁用文 档的构建。
组件控制选项: 这些选项用于控制是否构建特定的组件。例如,–disable-avdevice。

2. 编写编译脚本

新版 ndk 已放弃 gcc,转而使用更高效的 clang,下述脚本以 clang 为例编译 FFmpeg 源码。

 #!/bin/bash

 # NDK目录
 TOOLCHAIN=$NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64
 # 最低支持的android sdk版本
 API=21

 function build_android
 {
 echo "Compiling FFmpeg for $CPU"

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

 make clean
 make -j4
 make install

 echo "The Compilation of FFmpeg for $CPU is completed"
 }

 function print_supported_cpus
 {
     echo "Supports the following CPUs:"
     echo "1. armv7-a"
     echo "2. armv8-a"
 }

 function print_usage
 {
     echo "Usage: $0 [CPU]"
     echo "Example: $0 armv7-a"
     print_supported_cpus
 }

 # 传入CPU参数
 CPU=$1

 if [ -z "$CPU" ]; then
     print_usage
     exit 1
 elif [ "$CPU" = "help" ]; then
     print_usage
 elif [ "$CPU" = "armv7-a" ]; then
     ARCH=arm
     CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
     CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
     SYSROOT=$TOOLCHAIN/sysroot
     CROSS_PREFIX=$TOOLCHAIN/bin/llvm-
     PREFIX=$(pwd)/android/$CPU
     ADDI_LDFLAGS=" "
     OPTIMIZE_CFLAGS="-mfloat-abi=softfp -march=$CPU"
     build_android
 elif [ "$CPU" = "armv8-a" ]; then
     ARCH=arm64
     CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
     CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
     SYSROOT=$TOOLCHAIN/sysroot
     CROSS_PREFIX=$TOOLCHAIN/bin/llvm-
     PREFIX=$(pwd)/android/$CPU
     OPTIMIZE_CFLAGS="-march=$CPU"
     build_android
 else
     echo "Unsupported CPU: $CPU"
     print_supported_cpus
 fi
  • 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
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97

–target-os=xxx :指定编译器目标 os。当我们编译用于 android 平台的库时,指定该选项为 --target-os=android,否则编译出的 so 为软链接,真正的 so 名字后缀带有一长串的主版本号与子版本号,这样的库在 android 平台上无法识别,如下图所示:
--target-os=linux
当指定 --target-os=android ,则编译出的库如下:--target-os=android
–disable-vulkan: 编译时可能出现 fatal error: ‘vulkan_beta.h’ file not found
#include “vulkan_beta.h” 错误。可在使用 configure 脚本配置编译选项时,使用 --disable-vulkan 禁用 vulkan;或 extra-cflags 参数中添加 -DVK_ENABLE_BETA_EXTENSIONS=0 来防止引用 vulkan_beta.h。

3. 脚本使用说明

  • 进入 ffmpeg 源码目录,并创建脚本文件:vim build_android.sh
  • 按上一章节内容编辑脚本文件
  • ./build_android.sh help 查看脚本使用说明
    编译脚本使用说明

参考资料

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/614784
推荐阅读
相关标签
  

闽ICP备14008679号