Android录屏并利用FFmpeg转换成gif(三)
写博客时经常会希望用一段动画来演示app的行为,目前大多数的做法是在电脑上开模拟器,然后用gif录制软件录制模拟器屏幕,对于非开发人员来讲这种方式还是比较困难的。本来我以为应该也有能直接在手机上录屏并生成gif文件这样的app,下载一个这样的APP来录gif要方便得多。结果发现目前几乎没有此类APP,我就想能不能自己写一个,然后查了查资料,感觉应该能做出来,于是就撸起袖子干起来了。总的来讲要实现这个功能可以分成两个部分(当然,如果有更好的实现方式欢迎大家提出来,谢谢!):
- 录屏,生成mp4文件
- 利用ffmpeg开源软件将mp4转换成gif
第一点比较容易实现,已有现成的开源代码供参考。难点在第二点,涉及到NDK开发相关的知识,及FFmpeg的集成,这方面知识我之前从未接触过,还是比较有挑战性的。
功能虽然很简单,但要讲解起来感觉还是要费点篇幅的,所以我分成了4篇文章来介绍,分别是:
-
Android录屏并利用FFmpeg转换成gif(一) 录屏,讲讲怎样录屏生成mp4文件
-
Android录屏并利用FFmpeg转换成gif(二) 交叉编译FFmpeg源码,说说如何根据我们的需求裁剪FFmepg并编译出可在android下运行的so包
-
Android录屏并利用FFmpeg转换成gif(三) 在Android中使用ffmpeg命令,说说如何在Android中使用ffmpeg命令,简化C代码的编写难度
-
Android录屏并利用FFmpeg转换成gif(四) 将mp4文件转换成gif文件,将2、3两步生成的so文件集成到android工程中,实现将mp4文件转换成gif文件,完成最终的工程。
本篇介绍如何将已经交叉编译好的FFmpeg相关的so包集成到app中来,至于so包是怎么编译的,请参看 Android录屏并利用FFmpeg转换成gif(二) 交叉编译FFmpeg源码。so包的集成流程也简单,遵循一般的NDK开发流程就可以了,不过说起来简单,做起来还是有不少细节要注意的,我就在集成的时候搞了很久才搞成功。大概有以下几个步骤:
-
把交叉编译FFmpeg源码生成的7个so文件拷过来
-
写一个带native方法的java类,作为调c代码的接口,并在该方法中传入字符串数组类型的ffmpeg命令。
-
写一个实现native方法的C类,在该类里调FFmpeg.c类中的main方法,并将从java传入的ffmpeg命令传给main方法,从而达到执行ffmppeg命令的目的。其中FFmpeg.c这个类是从ffmpeg源码中拷过来的,还关联到几个其它的c文件及头文件,都是要从ffmpeg源码中拷过来,就是这些文件在编译的时候老是报错花了我很多时间。
-
再就是写一个CMakeLists.txt文件,用来规定cmake如何进行编译。里面的内容主要包括指定引用的so包的路径,头文件的路径,要编译的源文件的路径等等
-
最后就是在app目录下的build.gradle文件中对NDK编译做点配置,等下会详细说
大概就这么个流程吧,顺利的话做完这些后就能把工程跑起来了,但是,但是,但是一般都没那么顺利的,嗷。。。
下面就按照以上几个步骤详细地挨个介绍一下,并将我遇到问题的地方指出来,避免再走弯路。
2.1 拷贝FFmpeg相关的so包
在main目录下新建jniLibs/armeabi-v7a目录,然后将