android ffmpeg编译历程

这两天在网上搜索了下如何使用ndk来编译ffmpeg,国内软件开发人员的特色,就是c2c,有些就是根本没有试过.
本人还是实践为主,凡事实践过了,才有价值.
主要有几种方法:使用ndk需要编写mk文件,在linux下编译的,生成一个so或.a的库然后再写一些调用的c.

havlenapetr-FFMpeg这个在git上有源码,可以下载来参考下,然后本人觉得所谓原创者,也可能是抄袭该作者的东西,所以这里不会提供引用了"原创"作者的文章.

另一个是www.roman10.net,这个作者的方式有所有不同.目前我只有使用这种方式在git最新版本上编译成功,其它都失败了.
先说第一种方法吧:
大概网上都是这样说的:下载源码,建立工程,把下载的源码放到工程里面的jni目录里面,然后编写一个configure.sh的文件,这算是linux的shell脚本了,脚本的内容大约是:
PREBUILT=/home/dev/toolchain
PLATFORM=/home/dev/android-ndk-r8/platforms/android-8/arch-arm

./configure --target-os=linux \
--arch=arm \
--enable-version3 \
--enable-gpl \
--enable-nonfree \
--disable-stripping \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffserver \
--disable-ffprobe \
--disable-encoders \
--disable-muxers \
--disable-devices \
--disable-protocols \
--enable-protocol=file \
--enable-avfilter \
--disable-network \
--disable-avdevice \
--enable-cross-compile \
--cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
--nm=$PREBUILT/bin/arm-linux-androideabi-nm \
--extra-cflags="-fPIC -DANDROID" \
--disable-asm \
--enable-neon \
--enable-armv5te \
--extra-ldflags="-Wl,-T,$PREBUILT/arm-linux-androideabi/lib/ldscripts/armelf_linux_eabi.x -Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/crtbegin.o $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/crtend.o -lc -lm -ldl"...这样云云.
这个就是在编译前的配置了,重要的就是--arch=arm --target-os=linux就是编译的结果了.
也可以不定义toolchain,直接指定到ndk的对应目录,但是因为ndk的变化,导致一些toolchain不同而无法成功,可以复制一份保留.

然后把这个文件放到ffmpeg的源码目录,不是jni目录.而修改下权限为可执行的,chmod,不会的就不要玩了..
执行它:通常结果是:WARNING: /home/dev/toolchain/bin/arm-linux-androideabi-pkg-config not found, library detection may fail.警告存在,可不影响大局.

然后就是修改config.h,把里面的#define av_restrict restrict去除restrict,因为android的gcc不支持restrict关键字。(无从考证).

改了应该不会有影响.
然后gedit libavutil/libm.h删除所有static方法。我是root用户...

然后:
分别修改libavcodec,libavfilter,libavformat,libavutil,libpostproc,libswscale下的Makefile,把下面两句删除。
include $(SUBDIR)../subdir.mak
include $(SUBDIR)../config.mak新版只有这句。不知道上面这句是不是删除了.

然后在ffmpeg目录建立av.mk,Android.mk
在jni目录建立Android.mk文件.

然后在libavformat,libavcodec,libavfilter、libavutil、libpostproc和libswscale目录建立同样的文件.
这些文件哪里来,一会说.
然后在工程那层开始ndk-build...如果运气好的话就可以成功生成了so文件了.

刚开始我也觉得这些所谓的"原创"者还是相当有才的.懂一大堆我不懂的东西.后来再研究下了havlenapetr-FFMpeg代码发现上面的所有文件在这里都可以找到,首先是config.sh,然后就是一些mk文件.唯一区别的恐怕就是在ffmpeg里面的Android.mk与jni层的mk文件了吧,作者把这两个合在一起.

最终本人还是编译失败,恐怕不是上面的操作不对,是环境的问题吧.


第二种 :
www.roman10.net这个网站有两篇文章是关于ffmpeg的,而且还有个测试的jni文件,由于对ffmpeg的不熟悉,ffmpeg/doc/example的代码运行不成功,而且此作者的代码在ffmpeg-0.8上是成功的,换成git的还是不行,估计接口修改太多了吧.作者提供了源码下载.这些容易操作了,修改下里面的ndk路径就可以了.

先说这些吧.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值