主页 > 开发文档 > FFmpeg(3.3.2)移植Android平台

FFmpeg(3.3.2)移植Android平台

集成SDL2后的音频播放器(SDK),可以用于FM类型的播放器使用哦~

Git地址:https://github.com/wanliyang1990/FFmpeg-Android

正文:

随着直播行业的火热,移动端的各种直播(播放)软件多如牛毛,早年我也基于ijkplayer写了一个播放器(wlivetv:https://github.com/wanliyang1990/WliveTV),里面播放模块用的就是ijkplayer编译成Android平台的,自己只是给它添加了一层衣服而已,没有核心技术。时隔两年,随着自己接触的多了,也开始慢慢的接到到ffmpeg这个音视频元老级人物,经过一段时间的研究也还是有点成效,相信很多跟我一样的人想自己倒腾一下ffmpeg,无奈第一步编译都过不了关,就被它狠心的拒之门外了。因为开源让世界美好,so 我就来给你们把这拦路虎牵一边去散步了,留下敞开的大门,任由大家驰骋。说到ffmpeg,就要提到已经离世的雷神了(博客:http://blog.csdn.net/leixiaohua1020),他的博客介绍了很多ffmpeg的相关知识,虽然大多数是windows平台的,但对于我们了解怎么使用还是很有帮助的,感谢雷神,愿天堂没有代码!

        ffmpeg的一个好搭档就是SDL了,android下编译SDL可见我的另一篇博客:Android编译SDL2和demo展示(2.0.5) ,SDL可用于ffmpeg播放音频和显示视频,里面对线程的处理挺方便的,后面我会写一系列ffmpeg和SDL的博客,现在还在研究阶段ing。好了,开始我们今天的ffmpeg入门旅程吧。

一:这里我用的是Windows+Vm+ubuntu来编译的ffmpeg,其中Windows上面安装vm,在vm中安装ubuntu以及xshell,xftp我就不介绍了,这里当成大家的基本功了(注:Ubuntu中需要安装ssh服务才能连接xshell,安装命令:sudo apt-get install openssh-server)。

二:下载现在最想版本ffmpeg(3.3.2)到本地:http://ffmpeg.org/download.html#releases

创建虚拟机安装ubuntu系统,然后启动我们的ubuntu系统(我的版本是17.04)

系统启动就可以了,然后用xshell连接到系统中,后面的操作都在在xshell中完成的(附:刚开始搭建xshell连接服务时,还是要进入系统安装相应的软件,百度都能解决,我就是这样的),登录系统并改成root用户:

三:配置ndk环境

下载ndk10e(下载:https://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip),然后用xftp上传到ubuntu系统中

在目录:/usr/dev/ndk(根据自己喜好来)中创建ndk目录,并上传下载好的NDK到此目录下,用命令解压:unzip xxx.zip,解压后如下:

xshell效果图:

xftp效果图:

然后配置NDK环境

用命令:

vim ~/.bashrc    

打开环境变量配置文件

输入:

#ndk
export NDK_HOME=/usr/dev/ndk/android-ndk-r10e
export PATH=$NDK_HOME:$PATH

输入完后,刷新系统变量:

source ~/.bashrc

输入

ndk-build

检查是否成功:

这样NDK就配置成功了,可以开始ffmpeg的编译了(以上部分对shell不熟悉的,也可以直接在ubuntu用户界面里面设置,只要能配置成功就可以了)。

三:

1):在dev目录下创建ffmpeg目录:mkdir ffmpeg,并上传下载好的ffmpeg到ffmpeg目录下:

 

2):执行命令解压ffmpeg:

tar -zxvf ffmpeg-3.3.2.tar.gz

得到解压后的ffmpeg-3.3.2,因为会编译生成许多文件,所以我们这里给ffmpeg-3.3-2设置权限:

chmod -R 777 ffmpeg-3.3.2

3):然后进入ffmpeg-3.3.2中:

4):然后更改文件configure里面的第3305行内容:

 

[html] view plain copy
 
  1. #SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'  
  2. #LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'  
  3. #SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'  
  4. #SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'  
  5. SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'  
  6. LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'  
  7. SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'  
  8. SLIB_INSTALL_LINKS='$(SLIBNAME)'  
才能然生成的动态库是已.so结尾的,因为Android里面只认识.so结尾的库

 

 

 
可以把configure文件导出到本地计算机上用编辑器来更改,我这里就是。

 

5):给configure赋予可执行权限

chmod -u+x configure 或者直接 chmod 777 configure

然后执行configure来检查系统生成编译所需的配置文件xxxx.h,xxxx.mk等文件

./configure

提示我们要用屏蔽yasm才能执行,所以加上参数后的编译命令是:

./configure --disable-yasm

如图:

表明系统检查配置已经完成,接下来就是编写编译脚本了:

6)编译脚本build_android.sh

 

[html] view plain copy
 
  1. #!/bin/bash  
  2. make clean  
  3. export NDK=/usr/dev/ndk/android-ndk-r10e  
  4. export SYSROOT=$NDK/platforms/android-9/arch-arm/  
  5. export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64  
  6. export CPU=arm  
  7. export PREFIX=$(pwd)/android/$CPU  
  8. export ADDI_CFLAGS="-marm"  
  9.   
  10. ./configure --target-os=linux \  
  11. --prefix=$PREFIX --arch=arm \  
  12. --disable-doc \  
  13. --enable-shared \  
  14. --disable-static \  
  15. --disable-yasm \  
  16. --disable-symver \  
  17. --enable-gpl \  
  18. --enable-ffmpeg \  
  19. --disable-ffplay \  
  20. --disable-ffprobe \  
  21. --disable-ffserver \  
  22. --disable-doc \  
  23. --disable-symver \  
  24. --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \  
  25. --enable-cross-compile \  
  26. --sysroot=$SYSROOT \  
  27. --extra-cflags="-Os -fpic $ADDI_CFLAGS" \  
  28. --extra-ldflags="$ADDI_LDFLAGS" \  
  29. $ADDITIONAL_CONFIGURE_FLAG  
  30. make clean  
  31. make  
  32. make install  
其中NDK目录替换为自己的NDK目录就行,这里面把全部功能都编译了的,--disable-xxx是不要某功能,--enable-xxx是需要某功能然后cpu平台之一arm平台的(注意:里面反斜杠 \ 后面不能后空格等字符,不然也会导致编译不成功)后面我会把编译脚本和demo上传到GitHub上面,可以去下载来更改,最保险。

 

把编写好的脚本build_android.sh上传到ffmpeg3.3.2根目录下:

7、然后赋予build_android.sh的可执行权限

chmod 777 android_build.sh

四、编译ffmpeg,执行命令

./build_android.sh

这个过程大概二十分钟左右,可以稍微休息一下了,没有咖啡,喝杯白开水吧,哈哈:

经过漫长的等待,喝了几杯白开水了,终于编译好了:

在ffmpeg3.3.2目录中生成了android目录

最后通过xftp把android文件夹导出到本地计算机目录下:

至此ffmpeg编译成android平台完成,博客内容有点多了,例子将在下一篇博客里面介绍。

先上一张例子运行后的图片,查看FFmpeg里的编解码器:

编译脚本和Demo(eclipse):GitHub地址:https://github.com/wanliyang1990/FFmpeg-Android