转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52661331

之前曾写过一篇《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文件

    • 输入open -e .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
  • 保存文件,关闭.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(永久链接)

第一时间获得博客更新提醒,以及更多android干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码,即可关注。

如果你觉得好,随手点赞,也是对笔者的肯定,也可以分享此公众号给你更多的人,原创不易

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

  1. Android Cocos2dx引擎 prv.ccz/plist/so等优化缓存文件,手把手ida教你逆向project反编译apk库等文件...

    前段时间在 Android play 上看到一个非常牛逼的 3D 动态天气预报,效果真的非常炫.二话不说动手 dex2jar.bat/apktool 发现这并没 有什么卵用,在核心的地方看见 nati ...

  2. Android Studio 编译: Program type already present: XXX 解决方案

    Android Studio 编译: Program type already present: XXX 解决方案 参考文章: (1)Android Studio 编译: Program type a ...

  3. Android Studio编译问题-Error:Could not find org.jetbrains.trove4j

    Android Studio编译问题-Error:Could not find org.jetbrains.trove4j 一般来说是AS加载各种包或者库时失败导致的,有可能是网络原因. 因此我们更换 ...

  4. 【错误记录】Android Studio 编译报错 ( Deprecated Gradle features were used in this build, making it incompat )

    文章目录 一.报错信息 二.解决方案 一.报错信息 使用 Android Studio 编译比较老的 Android 项目时 , 报如下错误 : FAILURE: Build failed with ...

  5. 【错误记录】Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. ② | 升级 Gradle 版本 )

    文章目录 一.报错信息 二.解决方案 解决 Could not determine java version from '11.0.8'. 问题 , 有两种方案 , 方案一 : Android Stu ...

  6. 【错误记录】Android Studio 编译报错 ( SDK location not found )

    文章目录 一.报错信息 二.解决方案 一.报错信息 Android Studio 编译报错 : 首次打开别人的项目 , 经常性的报错 ; Could not determine the depende ...

  7. 【错误记录】Android Studio 编译报错 ( A problem occurred starting process ‘command ‘ninja.exe‘ ‘ )

    文章目录 一.报错信息 二.解决方案 一.报错信息 Android Studio 编译报错 : FAILURE: Build failed with an exception.* What went ...

  8. 【错误记录】Android Studio 编译报错 ( Invalid Gradle JDK configuration found )

    文章目录 一.报错信息 二.解决方案 一.报错信息 Android Studio 编译时提示 Invalid Gradle JDK configuration found 错误 ; 一般是打开一个新的 ...

  9. 【错误记录】Android Studio 编译报错 ( Gradle 下载错误导致 Failed to open zip file 报错 )

    文章目录 一.报错信息 二.解决方案 1.修改 gradle-wrapper.properties 配置 ( 失效解决方案 ) 2.手动干预 Gradle 目录 ( 推荐 ) 3.手动下载 Gradl ...

  10. 我的Android进阶之旅------解决Android Studio编译后安装apk报错:The APK file does not exist on disk...

    1.错误描述 今天用Android Studio编译应用后安装APK的时候,报错了,错误如下所示: The APK file build\outputs\apk\OYP_2.3.4_I2Base_64 ...

最新文章

  1. DOS命令下Javac命令不能执行原因
  2. I2C与SPI总线对比
  3. Elasticsearch之文档document入门
  4. 【视频课】先搞懂你用的模型,深度学习模型分析课程来了!
  5. SAP ABAP如何隐藏你写的程序代码
  6. 微信小程序富文本解析点击图片放大_微信小程序解析富文本过程详解
  7. setTimeout 的定时器的妙用
  8. 学习MVVM设计模式后第一次用于生产
  9. android listview item 展开动画,android的ListView点击item使item展开的做法的实现代码
  10. 大数据时代 银行信息安全如何防护?
  11. gitignore文件的几种写法,Git忽略文件规则的配置方法
  12. Eclipse ADT环境、Android studio如何连接外部安卓模拟器
  13. 【资料】avr单片机和stm32区别,avr单片机选型技巧
  14. 笔记 时间2012年2月15日14:35:30
  15. OSPF协议介绍及配置
  16. 第3期:12306页面制作
  17. apple 兑换代码使用_什么是Apple True Tone,我该如何使用?
  18. html中td,dd属性,HTML的dl、dt、dd标记制作表格对决Table制作表过
  19. 在Emacs中使用TODO
  20. xubuntu16.04禁用快捷键(Ctrl+Alt+T)打开终端

热门文章

  1. php7视频处理扩展_PHP7扩展开发之类型处理
  2. Echarts数据可视化特效散点图点动态闪烁效果
  3. SpringBoot2整合Flyway(二)
  4. 生产宕机dunp配置
  5. web.xml 加载顺序
  6. [剑指Offer] 26.二叉搜索树与双向链表
  7. SQL server 表中如何创建索引?
  8. Jq-模拟最大化最小化关闭
  9. 【观点讨论与支撑】真的是而立之年没有立,以后就没有希望了吗?
  10. 排序算法专题-快速排序