Update:话不多说,先看一下后面集成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行内容:
#SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
#LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
#SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
#SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
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
#!/bin/bash
make clean
export NDK=/usr/dev/ndk/android-ndk-r10e
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-symver \
--enable-gpl \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
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