更新:

2022.01.15:因应用商店需要上传64位APK,发现之前的脚本编译的arm64-v8a库,在使用时报错:

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "ff_vp9_copy32_aarch64" referenced by "/data/app/xxxxxxxxxxxxx==/lib/arm64/libavcodec.so"

解决:修改编译脚本打开neon,修改后三个CPU架构都需要重新编译,文章中的脚本已修改;

--enable--neon

目标:

使用Centos 7编译出Android使用的FFmpeg的so库

准备:

  • FFmpeg源码:本文示例用的是版本4.2.5
  • Android NDK: 本文示例用的是版本android-ndk-r20b,选择对应版本的下载就行。
  • 注意:ndk18及以下用的是gcc编译的,ndk19及以上是用clang编译的,版本不一样编译脚本是不一样的。

解压源码:

如上图,命令行进入放ffmpeg下载的源码位置,我的路径为/usr/ffmpeg

执行解压命令:

tar -jxvf ffmpeg-4.2.5.tar.bz2

ffmpeg解压后,解压ndk,执行命令:

unzip android-ndk-r20b-linux-x86_64.zip

因我将NDK源码也放在ffmpeg目录下,所以就直接在当前路径解压了。

修改FFmpeg文件:

1、修改ffmpeg的configure:

进入解压后的ffmpeg目录:

cd ffmpeg-4.2.5

打开configure文件:

vim configure

进入编辑页面后输入“/” 查找“SLIBNAME_WITH_MAJOR”,在3722行左右修改4个值

修改前:

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)'

修改后:输入法为英文:点击键盘“i”,进入编辑模式,用“#”注释掉原4项,改为新的

# 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)'
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

改完后按“esc”后,输入":wq"保存退出;

若没安装过yasm,可以安装yasm(其他博客教程中有的要安装yasm,加速编译)。

brew install yasm

配置build_android.sh文件

在ffmepg-4.2.5目录下,新建build_android.sh文件:

vim build_android.sh

使用vim命令,复制粘贴以下代码:

#!/bin/bash# 修改为自己的NDK的解压路径
NDK=/usr/ffmpeg/android-ndk-r20b
# macOS需要修改linux-x86_64为arch什么的,linux-x86_64是centos上用的
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64API=21function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \--prefix=$PREFIX \--enable-neon \--disable-hwaccels \--disable-gpl \--disable-postproc \--enable-shared \--enable-jni \--enable-small \--disable-mediacodec \--disable-decoder=h264_mediacodec \--disable-static \--disable-doc \--disable-programs \--disable-encoders \--disable-muxers \--disable-filters \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-avdevice \--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" \$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}#armv8-a
ARCH=arm64
CPU=armv8-a
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
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#x86
# ARCH=x86
# CPU=x86
# CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
# CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
# SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
# CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
# PREFIX=$(pwd)/android/$CPU
# OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
# build_android#x86_64
ARCH=x86_64
CPU=x86-64
CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
build_android

保存退出“:wq”后,给build_android.sh添加执行权限:

chmod +x build_android.sh

至此配置完成。

编译so文件:

命令执行:

./build_android.sh

编译过程时间比较长,上边配置文件编译3个平台,大约6分钟左右。

编译完成后会在ffmpeg-4.2.5下生成android文件夹,里面有三个平台的so库。

至此编译so完成。

编译好的文件放CSDN了:编译好的三个架构的so和头文件,使用的ndk-r21e,其他配置都一样

参考:

NDK r20b ffmpeg 编译脚本 build_android.sh_果光的博客-CSDN博客_build-android.sh

build ffmpeg for Android - 简书

音视频系列:FFmpeg和NDK在Centos7上交叉编译相关推荐

  1. datagrid 重载本地数据_音视频系列3:使用ffmpeg + nginx搭建本地转发服务器

    本文与csdn博客同步:https://blog.csdn.net/Hanghang_/article/details/104893135,欢迎关注,点赞,评论. 前言 音视频系列: HectoorZ ...

  2. 音视频系列2:ffmpeg将H.264解码为RGB

    音视频系列2:ffmpeg将H.264解码为RGB 前言 源码 前言 喜大普奔,终于更新啦,上期说到,如何使用ffmpeg+rtmp进行拉流,不熟悉的小伙伴们,可以先看上一期.今天我们要实现的是使用f ...

  3. ffmpeg rtmp 不清晰_音视频系列3:使用ffmpeg + nginx搭建本地转发服务器

    本文与csdn博客同步:https://blog.csdn.net/Hanghang_/article/details/104893135,欢迎关注,点赞,评论. 前言 音视频系列: HectoorZ ...

  4. ffmpeg rtmp 花屏_音视频系列6:ffmpeg多线程拉流

    本文与csdn博客同步:https://blog.csdn.net/Hanghang_/article/details/105302384,欢迎关注,点赞,评论. 前言 本篇博客是音视频系列的续集与改 ...

  5. 音视频开发-ffmpeg介绍-系列一

    目录 一.简介 FFmpeg框架的基本组成包含: 二. FFmpeg框架梳理音视频的流程​编辑 基本概念: 三.ffmpeg.ffplay.ffprobe区别 4.1 ffmpeg是用于转码的应用程序 ...

  6. 音视频系列1:流媒体

    1. 流媒体技术 1.1 基本需求 流媒体技术需要: 1.允许客户端在不下载完整文件的时候即可以开始播放视频: 2.允许客户端从完整内容的任何位置开始播放(不包括视频直播): 3.针对视频直播,允许客 ...

  7. 音视频系列2:基本知识

    1. 存储格式 1.1 WAV.WMV.WMA.ASF.MMS.AVI:微软全家桶 微软的东西,windows用户经常能见到. 首先是wav音频文件.WAV是微软开发的一种声音文件格式,它实际是采用R ...

  8. 音视频之——FFmpeg教程(二)——Windows10下搭建nginx-rtmp流媒体服务器

    前言 前一篇我们知道了如何配置FFmpeg开发环境,接下来,就开始简单的推流吧.说到推流前,我们要知道常用的几个直播推流协议. 直播推流协议 在搭建服务之前先了解下目前主流的几个直播协议: RTMP: ...

  9. 音视频篇 - FFmpeg 的介绍和使用

    本文章是阅读<音视频开发进阶指南基于android与ios平台的实践>一书的学习笔记. 目录: FFmpeg 的介绍 FFmpeg Android 编译库 FFmpeg 的结构 FFmpe ...

最新文章

  1. 如何处理SQL Server事务复制中的大事务操作
  2. 利用Axes3D绘制三维性能曲面
  3. 结对-结对编项目贪吃蛇-设计文档
  4. 深入研究 Mini ASP.NET Core,看看 ASP.NET Core 内部到底是如何运行的
  5. 一步步带你实现简版 ButterKnife
  6. 简单的libevent例子
  7. deepin安装zsh以及简单配置
  8. Ruby小白入门笔记之Rubymine工具的快捷键
  9. 腾讯云:一句话语音识别API接入步骤和说明
  10. Python教你找到最心仪的对象
  11. 基于樽海鞘群算法的WSN节点的部署优化
  12. 纯CSS实现立体感圆盘(立体化按钮),点击有图
  13. MySQL攻略(2)
  14. PX4模块设计之三十五:MulticopterAttitudeControl模块
  15. 回溯法 n皇后 python 解法一
  16. hana 服务器性能测试,SAP HANA
  17. 腾讯云使用phpStudy部署网站(附腾讯云优惠券)
  18. java-php-python-ssm在线影视点播系统计算机毕业设计
  19. 小猿理财:巴菲特推荐了ETF指数基金,没推荐增强型指数基金,原来道理在这!
  20. cadence怎么使用

热门文章

  1. rust游戏解封了吗_又一款分手游戏!只只大冒险操作简单但需要默契
  2. 移动安全Android逆向系列:Dalvik概念破解实例
  3. Linux实现多进/线程并发服务端Socket通信
  4. epoll全面讲解:从实现到应用
  5. win10连接linux nfs,win10系统使用nFs共享的操作方法
  6. Vue修炼系列教程 - 元婴篇2
  7. 精心制作新游戏,弱联网单机游戏
  8. CAD做好的图如何进行坐标转换
  9. 添加数量的html标签,dedecms织梦模板栏目列表中添加统计文档数量的标签
  10. 【WinHec启发录】透过Windows 10技术布局,谈微软王者归来