ffmpeg集成到android项目中,需要编译ffmpeg为so文件使用
1、Ubuntu系统准备
下载WMware虚拟机,下载ubuntu desktop系统,进行安装;
按照操作步骤或者其中的提示进行设置即可
或者整个系统使用U 盘安装(Rufus 软件制作)
安装sudo apt-get install时出错 Unable to locate package,解决方案
编辑/etc/apt/sources.list文件, 在文件最前面添加以下条目(操作前请做好相应备份):
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
2、ffmpeg编译准备
jdk安装,ndk安装
jdk安装,ndk安装难点:配置环境变量;在~/.bashrc文件末尾添加下面配置;
export JAVA_HOME=/opt/jdk1.8.0_181 // 替换为自己的jdk目录
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export NDK_HOME=/opt/android-ndk-r20 // 替换为自己的ndk目录
export PATH=$NDK_HOME:${JAVA_HOME}/bin:$PATH //这一步,用来设置寻找bin文件路径的,没有就不能直接执行命令
加入后一定一定要记得应用 source ~/.bashrc
jdk可以自动安装:
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
3、使用脚本进行编译
首先:修改其中configure文件
把
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)'
然后:执行脚本编译;脚本
脚本中需要修改ndk的路径
脚本中:--prefix=编译结果路径
脚本更多解析:脚本先是对configure进行设置并生成一些编译文件;make 才是编译
查看config的参数说明 ./configure -h
注意:ndk使用14版本的,ffmpeg最新版编译仍存在问题;configure一定要带参数先执行,再编译
常见错误
常见错误2
4、应用so文件
新建项目:过程如我的另一篇博客
首先:拷贝 ffmpeg的相关cpu架构的so文件和头文件到项目
然后:也是最重要的,进行编译链接这些库;cmakelist.txt文件配置如下
add_library:添加库(库名去掉lib头和.so尾部,库类型,编译文件/导入类别);这里说明添加的libavcodec-58.so库是动态导入的
set_target_properties:设置库属性;这里设置了导入库libavcodec-58.so的路径
ANDROID_ABI:cpu架构名字,编译时常量
ADD_LIB:自己定义常量:set(ADD_LIB E:/android-workspace/vedioplayer/app/src/main/jniLibs)
最后:最后在打包最终的动态库时,需要链接这些库
include_directories:设置了添加第三库的头文件,这样在工程C/C++文件中,才可以使用
最终打包so库为libnative-lib.so,其中依赖了下面其他的so库
java层动态加载:System.loadLibrary("native-lib");就可以了