原标题:技术共享|安卓系统的完美转身 Android FFmpeg 编译和使用
2017年,智能手机修罗场,国产手机华为、OPPO、vivo、小米等纷纷出大招,跻身全球销量前10名单,华为推出荣耀旗舰版更是赢得人心。在9月苹果新品发布后,没有预料中的畅销,也侧面印证安卓系统不再对IOS系统俯首称臣,安卓在后期的市场也会更大。
下面为大家共享Android FFmpeg 编译和使用,技术干货,记得收藏!
下载源文件
以下两种方式:
1、登录“www.ffmpeg.org”官方网站,下载最新版本到本地;
2、使用命令
修改配置
打开configure文件,找到如下配置:
修改为:
编译FFmpeg
可以单独只编译FFmpeg,也可以加入x264一起编译。
1、单独编译FFmpeg
在FFmpeg目录下新建build_android_arm.sh文件,然后编辑如下内容:
在命令窗口中进入当前目录,执行编译脚本,会在配置的目录下生成 include和lib文件夹。其中lib里面存放的生成的so文件,include里面存 放的是相关头文件。
2、编译x264和FFmpeg
首先下载x264的包,官网地址:http://www.videolan.org/developers/x264.html。
下载FFmpeg
配置脚本
将x264解压后的文件夹移到FFmpeg目录下,创建build_android_ffmpeg_with_x264.sh,编辑内容如下:
3、脚本说明
NDK的安装目录:
NDK=/Users/zhouchaolin/software/NDK/android-ndk-r12b
Android支持最低版本以及编译so库的架构平台:
SYSROOT=$NDK/platforms/android-14/arch-arm/
如果想编译支持x86架构,选择arch_x86路径
指定编译所使用的工具链的目录:
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
配置编译结果的目录:
编译x264结果的目录
PREFIX=$DIR/android-lib
结果输出目录
OUT_PREFIX=$DIR/264fflib
配置最终打包结果:
正常的情况,编译会生成8个so库,为了后期引用导入方便,加入脚本的最后一段,将8个so库打包成一个ffmpeg.so
注意事项:
(1)可以自行根据需要去配置configure里面的选项,进编译的组件进行增减,通过--enable和--disable去控制
(2)编译的时候要注意配置的路径参数,特别是引用x264库文件,EXTRA_CFLAGS,EXTRA_LDFLAGS,$PREFIX/lib/libx264.a这几个配置路径一定要核实好,不然会报找不到相关文件的异常
(3)FFmpeg默认没打开RTSP模块,在编译脚本中打开相关组件,不然读取RTSP流时,会报“Protocol not found”
这样准备工作完成后,运行脚本,不出意外,FFmpeg的编译工作就算完成了,你在之前设置的输出目录下可以找到libffmpeg.so和include的文件。
FFmpege 使用
编译好了FFmpeg,我们需要验证下编译的结果,同时也要尝试下如何去使用它,下面我们写一个简单的例子去调用相关的接口
1、编写JNI代码
在java层,新建个FFmpegUtil类,申明native方法。
make project ,在build 目录下找到对应的FFmpeg.class,使用javah命令生成相应的.h文件
在工程src/main目录,NEW---Folder---JNI Folder,新建jni目录,将生成的.h文件拷贝到此目录,同时创建同名的.c文件,编辑如下:
2、JNI编译配置
将之前编译的so库和include文件拷贝到当前目录下,创建Android.mk文件和Application.mk 其中Android.mk配置如下:
Application.mk配置如下:
3、so库生成与引用
可以直接通过demo工程生成libFFmpegTest.so、libffmpeg.so
具体做法就是,在jni目录下,执行ndk-build命令,会生成jni统计的libs目录和obj目录,将libs目录直接引入工程或者拷贝到工程的相关路径,然后gralde配置引用
这样做有点麻烦,后期如果jni调试和更新需要来回倒腾,不太方便。
直接使用gradle配置
“使用 Android Studio 2.2 或更高版本与 Android Plugin for Gradle 版本 2.2.0 或更高版本时,您可以将 C 和 C++ 代码编译到 Gradle 与 APK 一起打包的原生库中,将这类代码添加到您的应用中。”
这是android studio用户指南里面介绍的,可以使用Cmake和ndk-build去编译原生代码。具体说明可以查看https://developer.android.com/studio/projects/add-native-code.html#create-sources
Cmake比较麻烦又难懂,我直接使用ndk-build,可以手动配置,也可以在工程里面添加生成,结果如下:
通过命令行编译然后拷贝so库到引用路径
这个方法我尝试过,没有成功,做法就是gradle里面配置task去编译和拷贝
4、java层的调用
so库的load
结果的展示
5、FFmpeg c层日志打印
Android adb logcat无法直接看到,使用av_log_set_callback(log_callback_android)
万里长征走完第一步,现在才刚开始。“物联科技”会不定期推送技术型干货贴,欢迎各位技术大牛围观点评...返回搜狐,查看更多
责任编辑: