上篇文章介绍了 FFmpeg 大体的编译流程,并在 Java 层进行 JNI 接口的调用,借此了解 Android 编译底层 so 库的方式,本文主要介绍如何在 Android 平台使用 FFmoeg 命令行对音视频进行操作。
承接上文,本文从编译好各个 so 文件之后,编写 Java 层调用的 c 文件开始。
源代码 GitHub - FFmpegAndroidSupport(注意在 try_cmd 分支)
Java 层 Native 方法
首先进行 Java 层代码的编写,创建 FFmpegSupport 类,加载 so 文件,声明 native 方法。
1 | public class FFmpegSupport { |
生成 .h 头文件
使用 javah 命令根据你的 java 文件自动生成 .h 文件,javah 命令需要 class 文件,所以首先你需要对工程进行编译,生成 class 文件,它位于 project/app/build/intermediates/classes/debug 目录下。
比如我的类叫做 FFmpegSupport,包名 com.march.fas,运行命令后生成了 com_march_fas_FFmpegSupport.h 文件,这个 .h 文件的名字应该是可以自定义的,现在是默认的包名类名,我还没有查到相关参数。
1 | javah -d <.h文件生成的目录> -classpath <class文件存储的目录> <包名.类名> |
查看 .h 文件的内容,将 jclass 改为 jobject,原因的话我也不知道为什么,不是很懂这一块儿,也是查资料慢慢总结的。
1 | /* DO NOT EDIT THIS FILE - it is machine generated */ |
编写对应 c 文件
根据生成的 .h 编写 c 文件,其中 logjni.h 是一个打印日志的工具类,详细可以参考 github 上面的源文件。
1 |
|
准备工作
如上代码中,我们使用 ffmpeg.c 中的 main() 函数,因此需要将 ffmpeg.c 和 ffmpeg.h 拷贝到 jni 目录中,同时 ffmpeg.c 又引用了多个文件,大致有以下几个文件,这些文件都需要拷贝到 jni 目录中
1 | config.h |
跟上一篇文章说的一样,我们还是要将编译好的 so 文件拷贝到 jni 目录,同时编写 Android.mk 和 Application.mk 文件。为了让结构更加清晰,我对目录做了些许改动。在 jni 目录下新建了 prebuilt/armeabi 文件夹,用来存放 so 文件。同时 Android.mk 和 Application.mk 文件也需要做相应修改。
Android.mk 文件,
1 | LOCAL_PATH:= $(call my-dir) |
Application.mk 文件
1 | APP_ABI := armeabi-v7a |