Android-NDK-Clang编译FFmpeg

本文介绍了如何在Linux环境下,利用Android-NDK-clang工具对FFmpeg进行编译,以生成适用于Android平台的libffmpeg.so库,包括设置编译参数、创建编译脚本以及处理常见编译问题。
摘要由CSDN通过智能技术生成

参考 Android-NDK-clang 编译 FFmpeg - 知乎 文章,编译成功

前期准备

1、下载Android-NDK(开魔法可能访问速度会更快一点)

2、下载 FFmpeg源码,注意:我用的是 NDK-21(android-ndk-r21e-linux-x86_64)ffmpeg-4.4 (ffmpeg-4.2.4.tar.gz)进行编译,如果版本不同可能会有所不同。
测试:ubuntu20 的NDK20 - NDK22ffmpeg 4.0 - ffmpeg 4.4,均可使用。

使用 clang 交叉编译出 Android 平台可以使用的 libffmpeg.so 库

进入 FFmpeg 源码根目录

1.创建编译脚本:build_ffmpeg_android.sh

脚本的主要内容如下:

#!/bin/sh
# NDK 所在的路径
NDK=/Users/mac/Library/Android/sdk/ndk/21.4.7075529
# 需要编译出的平台,这里是 arm64-v8a
ARCH=aarch64
# 支持的最低 Android API
API=21
# 编译后输出目录,在 ffmpeg 源码目录下的 /android/arm64-v8a
OUTPUT=$(pwd)/android/arm64-v8a
# NDK 交叉编译工具链所在路径
TOOLCHAIN=/Users/mac/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64

build() {
  ./configure \
  --target-os=android \
  --prefix=$OUTPUT \
  --arch=$ARCH \
  --sysroot=$TOOLCHAIN/sysroot \
  --disable-static \
  --disable-ffmpeg \
  --disable-ffplay \
  --disable-ffprobe \
  --disable-debug \
  --disable-doc \
  --disable-avdevice \
  --enable-shared \
  --enable-cross-compile \
  --cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \
  --cc=$TOOLCHAIN/bin/aarch64-linux-android$API-clang \
  --cxx=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++ \
  --extra-cflags="-fpic"

  make clean all
  make -j12
  make install
}

build

注意,如果需要用到 device相关,需要把以上代码中的   --disable- -avdevice删除。

这个shell脚本,大体上其实还是很容易懂的,比如
--disabble-static 禁止输出静态库
--enable-shared 输出动态库
--arch 用于配置输出的so库是什么架构的
--prefix 用于配置输出的so库的存放路径
enable-cross-compile 开启多平台编译,也就是可以编译多个平台的库
更多的选项可以查看官网的介绍

2.开始编译

通过终端进入到 FFmpeg 源码根目录,并运行刚刚写好的编译脚本

// 出现 ”bash: ./build_ffmpeg_android.sh: 权限不够” 报错
chmod +x build_ffmpeg_android.sh 
./build_ffmpeg_android.sh 

注意,有莫名的报错,可能是因为Windows下的换行符导致无法正确识别,尝试使用dos2unix工具

sudo apt install dos2unix 

运行结果如下

最终需要目录中的lib, .so库

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这些都是 Android NDK 内部的 `Android.mk` 文件。其中,`./android-ndk-r25c/sources/android/native_app_glue/Android.mk` 是用于编译 Native Activity 示例应用程序的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/support/Android.mk` 是包含一些 Android 支持库的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/ndk_helper/Android.mk` 是包含一些辅助函数和类的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/cpufeatures/Android.mk` 是用于编译 `cpufeatures` 库的 `Android.mk` 文件,该库提供了一些 CPU 相关的信息和功能;`./android-ndk-r25c/sources/cxx-stl/llvm-libc++abi/Android.mk` 和 `./android-ndk-r25c/sources/cxx-stl/llvm-libc++/Android.mk` 是用于编译 C++ STL 库的 `Android.mk` 文件,分别对应 libc++abi 和 libc++ 两个 STL 库;`./android-ndk-r25c/sources/third_party/googletest/Android.mk` 是用于编译 Google Test 测试框架的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/Android.mk` 是用于编译 Shaderc 编译器的 `Android.mk` 文件,该编译器可以将 GLSL 代码编译成 SPIR-V 代码;`./android-ndk-r25c/sources/third_party/shaderc/libshaderc/Android.mk` 是用于编译 Shaderc 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/libshaderc_util/Android.mk` 是用于编译 Shaderc Util 库的 `Android.mk` 文件,该库提供了一些辅助函数和类;`./android-ndk-r25c/sources/third_party/shaderc/third_party/Android.mk` 是用于编译 Shaderc 编译器依赖的第三方库的 `Android.mk` 文件,包括 glslang 和 spirv-tools 两个库;`./android-ndk-r25c/sources/third_party/shaderc/third_party/glslang/Android.mk` 是用于编译 glslang 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/third_party/spirv-tools/Android.mk` 是用于编译 spirv-tools 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/vulkan/src/build-android/jni/Android.mk` 是用于编译 Vulkan 库的 `Android.mk` 文件。 如果您要在 Android NDK 中编写自己的 `Android.mk` 文件,可以参考这些示例文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值