编译FFmpeg源文件并在Android Studio中使用的简单例子

挖个坑。等我踩完这个系列的坑来再来填。先粗略写下。

编译环境:win7+Android Studio

————————————

具体实现:在Android Studio下使用FFmpeg的最简单输出Hello Wworld。

这里需要用到NDK,目前还无法熟练使用,因此记录下来。



首先,我们需要下载FFmpeg源码。

下载地址:http://ffmpeg.org/download.html

然后下载:MinGW。

下载完毕后MinGW需要安装。安装时其实先装的是个下载管理器,到选择安装选项的时候要选上msys-base和mingw32-gcc-ada两项。


选择[Installation] - [Apply Changes],安装

成功安装后如下图。


然后添加环境变量。


运行D:\MinGW\msys\1.0目录下的msys.bat,cd到ffmpeg目录执行build_android.sh

msys.bat类似于Windows中的cmd。



复制粘贴的命令可以参考此链接:

https://segmentfault.com/q/1010000002898504

使用shift + insert应该是可以粘贴的,至于复制,应该可以配置为选中即复制。

不知道为什么无法编译成功,可能是因为之前错误地进行了编译,改变了源文件,因此我再重新试试。


编写build_android.sh脚本文件,如果从网上直接copy过去可能会是dos格式,使用dos2unix build_android.sh 转换一下,删掉多余空格。(出处:http://www.cnblogs.com/blogs-of-lxl/p/6252130.html?utm_source=itdadao&utm_medium=referral)


结果认真地修改了如图所示处


后来发现之前的错误原因在于build_android.sh中TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64

这一句的路径设置错误了。因为代码的出处编译环境是Mac,而Mac跟Windows路径是不一样的,Mac环境下是darwin-x86_64,Windows是windows-x86_64。

重新执行,结果依然是会报错的,比如出现command not found。

但是其实实际上已经在生成so文件了。然后就需要漫长的等待了。需要几分钟,去吃根雪糕冷静下先。


最后成功生成一系列.h文件。


新建的ffmpegtemp目录下会生成文件。

D:\ffmpeg\ffmpeg-3.3.3\ffmpegtemp

ffmpeg-3.3.3目录下也会生成一个android文件。,这里面有so文件。

到这里为止,ffmpeg库文件就编译好啦~

可以被Android Studio使用啦~

下面开始使用Android Studio测试编译好的SO库。

创建工程,并新建 jni 目录。

(这里新建普通的工程文件就好,不用勾选include C++,我第一次新建的时候新建错了,后来重新建立了一个工程文件那些才能正常运行)。

Android Studio如何创建.mk文件

右键 新建-file 在输入的时候加上.mk即可


虽然报错,但是依旧成功生成头文件。


运行ndk-build(需配置NDK环境变量。em...配置好安卓SDK开发环境之后还需配置环境变量,配置NDK环境变量看这里

http://www.jianshu.com/p/0099d0e5d3d7

http://www.jianshu.com/p/708e6bf68ae9)。

测试是否成功配置方法,通过cmd进入命令行,输入ndk-build。

下图为未配置情况。

下面进行配置

这里可以看出NDK是已经安装好了的,但是并没有配置环境。

首先下载NDK(虽然AS中安装了NDK但是还是需要下载),下载地址:

https://developer.android.com/ndk/downloads/index.html


谷歌中国站虽然开通了,所以可以使用下面的这个网站,

这里是中国站下载地址:https://developer.android.google.cn/ndk/downloads/index.html

比较下发现貌似就是google后面加了cn,所以以后如果没有遇到developer.android.google打不开网站链接的情况下可以试试加cn访问中国站啦。

选择所需版本。



下好之后解压到android-ndk文件夹中,然后配置环境。

再通过cmd进入命令行,输入ndk-build检测是否配置好。

此时,如下图所示:


切换到Android程序src/main/jni目录中,直接执行ndk-build脚本就可以了。


成功生成如下图所示。

生成是SO文件在 src/main/libs/armeabi-v7a中


现在,还需要配置gradle文件才能运行。

在buildTypes之前的位置加上,

sourceSets.main{

jniLibs.srcDir'src/main/libs'

jni.srcDirs=[]

}


这时就可以运行程序查看效果了。

报了个错。android:onClick不能用

参考网址:http://blog.csdn.net/shaw1994/article/details/18953771

http://blog.csdn.net/xlh1191860939/article/details/53019592

java.lang.IllegalStateException: Could not execute method for android:onClick


结果发现是因为xml文件中context没配置好。

cannot resolve corresponding JNI function的解决方法

File--->Setting--->plugins

将 Android NDK Support 的对勾勾掉

然后重启AS

过程中还发现一个问题,结果发现是因为生成的com_cc_myapplication_MainActivity.h文件不全导致的。(因为在编写MainActivity之前生成了),因此无法调用native函数。

产生这个错误表示无法调用native函数,没有配置好。

07-30 20:32:15.460 19330-19330/com.cc.myapplication E/art: No implementation found for java.lang.String com.cc.myapplication.MainActivity.avformatinfo() (tried Java_com_cc_myapplication_MainActivity_avformatinfo and Java_com_cc_myapplication_MainActivity_avformatinfo__)


还有这里也需要改,总之,无法调用的话,一定是没有配置好。复制代码的时候,得看看包名是否都改了,又或者,你可以直接把自己的工程的包名建成跟作者一样,这样就不用改了。

改完之后,需要重新使用ndk-build编译生成可以通过JNI调用的类库,否则还是之前生成的类库,依然会报错。

其实程序调用的是这里的文件。


最后成功图片有4张,分别点击4个按钮结果如下图:



编译FFmpeg生成了六个SO文件,现在把这6个合成一个,修改脚本文件build_android.sh。



改为

–enable-static

–disable-shared

以及在install后面加上一段。

然后重新开始编译ffmpeg库。



syntax error: unexpected end of file

DOS下文件和Linux下文件格式差异问题导致的。

发现是这段出现了问题(因为删掉这里才可以正常编译)。

dos2unix build_android.sh  尝试使用这个删除多余的空格,但是依然不行。http://blog.csdn.net/pml18710973036/article/details/68482885

解决办法应该是需要使用vim来转换格式。这里就这样吧,应该是换行引起的错误,需要使用Linux环境来进行编写shell文件,我先跳过这个问题,不再多纠结。

$TOOLCHAIN/bin/arm-linux-androideabi-ld \

-rpath-link=$PLATFORM/usr/lib \

-L$PLATFORM/usr/lib \

-L$PREFIX/lib \

-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \

$PREFIX/libffmpeg.so \

libavcodec/libavcodec.a \

libavfilter/libavfilter.a \

libswresample/libswresample.a \

libavformat/libavformat.a \

libavutil/libavutil.a \

libswscale/libswscale.a \

-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \

$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a \


$ chmod +x build_android.sh

$ ./build_android.sh


————————————————————————————

这里是坑的分割线。。。。

参考链接:

最主要是这个链接:http://www.ihubin.com/blog/android-ffmpeg-demo-2/  

http://blog.csdn.net/hejjunlin/article/details/52661331

http://blog.csdn.net/leixiaohua1020/article/details/47008825

http://www.jianshu.com/p/dfd0de17601c

http://www.cnblogs.com/tt2015-sz/p/6148723.html


Windows下使用MinGW编译FFmpeg

https://forevas.github.io/2017/03/20/Windows%E4%B8%8B%E4%BD%BF%E7%94%A8MinGW%E7%BC%96%E8%AF%91FFmpeg/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容