手把手图文并茂教你用Android Studio编译FFmpeg库并移植

之前曾写过一篇《FFmpeg在Linux下安装编译过程》,今天有空就用Android Studio编译FFmpeg库并移植,并附上调用ffmpeg简单示例,看下Agenda如下:

  • 下载FFmpeg 3.1.3
  • 下载NDK
  • 配置ndk环境
  • 编译FFmpeg
  • 移植到Android平台
  • 调用编译的so示例

下载FFmpeg 3.1.3

网址:https://ffmpeg.org/download.html#build-mac

双击解压如下,得到一个文件夹:

下载NDK

  • 供参考下载地址见本文最下面,也可自行下载。
  • 双击解压如下,同样得到一个文件夹:

配置ndk环境

  • 启动终端Terminal
  • 进入当前用户的home目录
    • 输入cd ~ 或 /Users/YourUserName
  • 创建.bash_profile
    • 输入touch .bash_profile
  • 编辑.bash_profile文件 因为是为了配置NDK开发环境,输入Android NDK下目录,前面是android sdk的,可以不用动它,最终.bash_profile文件如下: export PATH=$(PATH):/Users/hejunlin/android-sdks/platform-tools export NDK_ROOT=/Users/hejunlin/Downloads/android-ndk-r10e export PATH=$PATH:$NDK_ROOT
    • 1
    • 2
    • 3
    • 输入open -e .bash_profile
  • 保存文件,关闭.bash_profile
  • 更新刚配置的环境变量 输入source .bash_profile
  • 看看刚刚设置的环境变量

离开了编辑器后,在终端输入 $PATH 并且按enter键来确认是否编辑成功,此时应该会出现所有的环境变量(以:号相分隔)

表明配置成功

接下来·开始进行测试ndk是否能正常编译jni (1) 终端进入到 NDK下面的 samples 目录下。 (2) 输入 cd hello-jni/ ,回车,然后执行 ndk-build 出现以下界面代表配置成功。

编译FFmpeg

  • 在编译前,在源码中,修改FFmpeg的configure
  • 下载FFmpeg源代码之后,首先需要对源代码中的configure文件进行修改。由于编译出来的动态库文件名的版本号在.so之后(例如“libavcodec.so.5.100.1”),而android平台不能识别这样文件名,所以需要修改这种文件名。在configure文件中找到下面几行代码(在3209-3212行):
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)'  

接下来开始写shell脚本

这里有一个坑:我用记事本写了个sh脚本,一直报如下错误:

这种情况应该有两种原因:

  • 1.在WIN底下用文本编辑工具修改过参数变量,在保存的时候没注意编码格式造成的,
  • 2.也有可能是在VIM里修改,第一行末尾按到ctrl+v 这里避开这个弯,我找到FFmpeg下一个version.sh的shell脚本,复制了一份 重命名为build_android.sh。脚本如下:
#!/bin/sh
NDK=/Users/hejunlin/Downloads/android-ndk-r10e
SYSROOT=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \--enable-shared \--disable-static \--disable-doc \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-ffserver \--disable-avdevice \--disable-doc \--disable-symver \--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \--target-os=linux \--arch=arm \--enable-cross-compile \--sysroot=$SYSROOT \--extra-cflags="-Os -fpic $ADDI_CFLAGS" \--extra-ldflags="$ADDI_LDFLAGS" \$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one

如果大家要编译,记得改下前三行,对应自己机器上的环境 接着开始执行这个shell脚本,在终端输入 ./ build_android.sh , 如图:

开始进行自动编译:

中间过程:

喝杯咖啡时间,就编译好了,结果如下:

这时会发现 FFmpeg下多了一个文件夹android:

打开如下:

这样我们要的so就有了,当然,这只是基本的。

本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52661331

移植到Android平台

接下来写在Android studio写一个示例,调用ffmpeg中方法 建一个工程:在src/main下建一个jni目录

把前面编译好的android目录移植过来

simplest_ffmpeg_helloworld.c代码如下:

Android.mk文件内容如下:

本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52661331

开始编译目标so,在Studio中的Terminal面板中:执行ndk-build (在此之前记得要在local.properties下配置ndk目录)

会在libs下面生成一些so,也可以看到我们目标so:

然后建立一个jniLibs文件夹,把这些so拷贝进去

调用编译的so示例

接着写MainActivity代码,如下:

最终效果如图:

以上相关资料及下载的ffmpeg及ndk下载链接: https://pan.baidu.com/s/1eRVON4m(永久链接)

原文发布于微信公众号 - 何俊林(DriodDeveloper)

原文发表时间:2016-10-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Felix的技术分享

Stetho的通信原理

2853
来自专栏Java编程技术

UML建模(组件图)

组件图是为了展示组元(components),组元提供的接口(provided inerfaces)和需要调用的接口(required interfaces),...

3752
来自专栏mathor

如何让局域网内的其他人访问到自己在Tomcat上部署的项目

 学JSP第三节课,今天老师上课讲了开启Tomcat之后,将自己电脑的文件放到指定的目录下,可以让同宿舍的人访问并且下载,老师只是提了一下,没有具体讲,后来我看...

1.8K3
来自专栏程序员同行者

14-使用glusterfs做持久化存储

1462
来自专栏Java后端技术栈

QQ登录网站接入功能实现--非官方文档搬运

最近第一次使用QQ登录功能,期间遇到这种问题,在网上找了很多资料,大多都是官方的搬运,并没有真正的干料,可能是个人能力问题,遇到了各种麻烦,折腾了几天,最终弄好...

1204
来自专栏散尽浮华

Centos 6.9下部署Oracle 11G数据库环境的操作记录

操作系统:Centos6.9(64Bit) Oracle:11g 、11.2.0.4.0版本 Ip地址:172.16.220.139 废话不多说了,下面记录安装...

2509
来自专栏老安的博客

openstack虚拟机内文件遭破坏的急救方案

    openstack虚拟机存放于ceph存储,由于用户将系统的grub误删除,导致系统无法正常引导。现在用户要求抢救文件。

771
来自专栏智能大石头

如何部署编译NDIS驱动的环境(内部资料)

0,安装VC6英文版。 1,安装WinXP DDK。要完全安装,不然会比较麻烦。 2,安装DS。最好也完全安装,要不也是很麻烦。 3,DS安装好以后,运行"开始...

2199
来自专栏大魏分享(微信公众号:david-share)

身份验证和权限管理---Openshift3.9学习系列第三篇

OAuth是由Blaine Cook、Chris Messina、Larry Halff 及David Recordon共同发起的,目的在于为API访问授权提供...

3326
来自专栏张戈的专栏

如何确保NFS服务安全

上一篇博文《Redhat 设置 NFS 挂载的简单步骤》,其中摘录了一段 nfs 中 fuser 的使用,索性将其全部发出,以供参考。 ---- 对于 NFS ...

72712

扫码关注云+社区