转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼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开源库

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

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

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

  3. android studio 编译加速

    1. http://www.52codes.net/article/658.html 2.http://my.oschina.net/sammy1990/blog/388846 3.http://st ...

  4. android ndk-build 编译静态库libxx.a 以及Android studio openssl 静态库配置(cmake)

    android ndk-build 编译静态库libxx.a 需求场景: 目前有安卓编码好的现在的openssl的两个.a,我们需要调用openssl的函数,并把功能再封装成.a; 这样使用时,在an ...

  5. Android studio 编译失败Error:Could not read entry ':app:processDebugManifest' from cache taskArtifacts.b

    Android studio 编译失败 Error:Could not read entry ':app:processDebugManifest' from cache taskArtifacts. ...

  6. 【Android】Android studio 编译问题:finished with non-zero exit value 2

    1.Android studio 编译问题:finished with non-zero exit value 2 问题: Error:Execution failed for task ':andr ...

  7. 我的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 ...

  8. android studio 导入第三方库的记录

    android studio 导入第三方库的记录.jar包 和 库 一.jar包 1.jar包的话很简单,首先换成project模式,将你要用的jar包复制到lib下面.如图 2.然后右键选择Add ...

  9. Android Studio导入第三方库的三种方法

    叨叨在前 今天在项目中使用一个图片选择器的第三方框架——GalleryFinal,想要导入源码,以便于修改,于是上完查找了一下方法,想到之前用到过其他导入第三方库的方法,现在做个小总结,以防忘记. A ...

随机推荐

  1. UVALive - 3027:Corporative Network

    加权并查集 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring&g ...

  2. 例10-4 uva10791(唯一分解)

    题意:求最小公倍数为n的数的和的最小值. 如12:(3,4),(2,6),(1,12)最小为7 要想a1,a2,a3……an的和最小,要保证他们两两互质,只要存在不互质的两个数,就一定可以近一步优化 ...

  3. 习题9-6 uva 10723

    题意: 给你两个字符串,求一个最短的串,使得输入的两个串均是他的子序列(不一定连续) 思路: 可以看出ans = 两个串的长度和 - 两个串的最长公共子序列,在最后的构造处GG.  在构造时想了很久, ...

  4. [BZOJ]1085 骑士精神(SCOI2005)

    这种鲜明的玄学风格很明显就是十几年前的题目. Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐 ...

  5. 主席树(BZOJ2653)

    考虑二分答案,设为k,将大于等于k的元素设为1,小于的设为-1,如果某一段的和>=0,说明这段的中位数>=k. 对于每组询问,二分完后查询新序列的最大子段和即可. 但是不能开n棵线段树,观 ...

  6. 【Python3.6+Django2.0+Xadmin2.0系列教程之三(入门篇-下)】学生信息管理系统

    上一篇我们已经初步的构建起了一个学生管理系统的模型,现在接着来继续完善它吧. 1.上传图片/文件等资源 有时候需要添加一些附件,例如,新生刚入学,大家相互之间还不熟悉,希望能通过照片来加深印象,并且方 ...

  7. dva-quickstart 与 create-react-app 比较(一)

    最近在学习 React ,  现对 dva-quickstart   与  create-react-app 比较 1. 安装, 两个都需要安装工具包:npm install -g create-re ...

  8. JavaScript正则表达式模式匹配(1)——基本字符匹配

    var pattern=/g..gle/; //点符号表示匹配除了换行符外的任意字符 var str='g78gle'; alert(pattern.test(str)); var pattern=/ ...

  9. 有趣的冷知识:编程中Foo, Bar 到底什么意思?

    转自:编程中Foo, Bar 到底什么意思? 1 前言 在很多国外计算机书本和一些第三份开源软件的Demo中经常用到两个英文单词Foo,Bar.这到底是什么意思呢?从步入屌丝界的IT生活见到这两个单词 ...

  10. python学习之路网络编程篇(第四篇)

    python学习之路网络编程篇(第四篇) 内容待补充