ffmpeg android 编译选项,技术共享|安卓系统的完美转身 Android FFmpeg 编译和使用

原标题:技术共享|安卓系统的完美转身 Android FFmpeg 编译和使用

2017年,智能手机修罗场,国产手机华为、OPPO、vivo、小米等纷纷出大招,跻身全球销量前10名单,华为推出荣耀旗舰版更是赢得人心。在9月苹果新品发布后,没有预料中的畅销,也侧面印证安卓系统不再对IOS系统俯首称臣,安卓在后期的市场也会更大。

下面为大家共享Android FFmpeg 编译和使用,技术干货,记得收藏!

444f63e8e612c60b76494ea5098079b8.png

下载源文件

以下两种方式:

1、登录“www.ffmpeg.org”官方网站,下载最新版本到本地;

2、使用命令

f2f3b2530b0caa00e2cf40eb1c61c570.png

修改配置

打开configure文件,找到如下配置:

cd794df9abb6ba8fec456551a15ecbf3.png

修改为:

9f11e436b388d9a172bc080338875104.png

编译FFmpeg

可以单独只编译FFmpeg,也可以加入x264一起编译。

1、单独编译FFmpeg

在FFmpeg目录下新建build_android_arm.sh文件,然后编辑如下内容:

8ff4fc90c0f11f2425d77c7f215b5203.png

85c71111a617901a48005f8ffe01b532.png

在命令窗口中进入当前目录,执行编译脚本,会在配置的目录下生成 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,编辑内容如下:

797d8e0e1d6a3630ecc79e10110732d1.png

67eb2c8dd931f3924a1c21efed1da923.png

fc60b5250c2770fdba59dbf62afe0929.png

adc4c891c3329ed4d0b0aaae7cbdc757.png

7afdb2c34663c531b908a70329ad2514.png

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”

0226080d89551d507532bb3b191bb247.png

这样准备工作完成后,运行脚本,不出意外,FFmpeg的编译工作就算完成了,你在之前设置的输出目录下可以找到libffmpeg.so和include的文件。

FFmpege 使用

编译好了FFmpeg,我们需要验证下编译的结果,同时也要尝试下如何去使用它,下面我们写一个简单的例子去调用相关的接口

1、编写JNI代码

在java层,新建个FFmpegUtil类,申明native方法。

34ee5818dc90ba432f77da9e84756d1c.png

make project ,在build 目录下找到对应的FFmpeg.class,使用javah命令生成相应的.h文件

在工程src/main目录,NEW---Folder---JNI Folder,新建jni目录,将生成的.h文件拷贝到此目录,同时创建同名的.c文件,编辑如下:

13e09843a7cff707d4102c59debec4e7.png

2、JNI编译配置

将之前编译的so库和include文件拷贝到当前目录下,创建Android.mk文件和Application.mk 其中Android.mk配置如下:

129fe24d9a22be76189410ad70a7fec5.png

Application.mk配置如下:

6d46bec21392ce249075b238767f5091.png

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,可以手动配置,也可以在工程里面添加生成,结果如下:

ffdbace14915b5774d5ccfa70ca30a2c.png

通过命令行编译然后拷贝so库到引用路径

这个方法我尝试过,没有成功,做法就是gradle里面配置task去编译和拷贝

4、java层的调用

so库的load

663240ea92d1bff81b0350366bfaf6be.png

结果的展示

5、FFmpeg c层日志打印

Android adb logcat无法直接看到,使用av_log_set_callback(log_callback_android)

e4e5e3e60c144005196e665cffef9506.png

万里长征走完第一步,现在才刚开始。“物联科技”会不定期推送技术型干货贴,欢迎各位技术大牛围观点评...返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值