在全新的linux下编译ffmeng源码,生成可用的.so和.h库。这次的文章非常重要,一定要自己编译出来,如果哪个地方出错了,重新来一下,一定要编译出.so库。这是因为很多c/c++库都编译和这次的编译都差不多。按照这篇文章是绝对可以编译出来的,我编译成功很多次了。
到阿里云上或者腾讯云上买一台linux服务器,如果是学生可用优惠,优惠后10元一月。如果不舍得花钱可用虚拟机代替。系统最好是ubuntu的。
直接百度搜索xshell和xftp下载,一步步安装就行.
到这个网址http://www.androiddevtools.cn/ 上下载ndk,注意是linux版本的ndk,到ffmpeg官网下载ffmpeg。
我这里使用的是r10和ffmpeg 2.8.14版本。可能看到我的ndk后缀是.bin。这里不用担心,你下载的.tar.gz的ndk上传到服务器和.bin上传是一样的没有任何区别。
有了上面的准备后开始动手了,一步一步的来。
通过xshell来连接上服务器.
先配置vim,如果服务器上没有vim可以通过
sudo apt-get install vim-gtk
命令来为ubuntu安装vim,关于vim的使用这里不做介绍.最好自己了解一下vim的使用,在linux下vim的运用非常广泛,会了它对你只有好处。
为了让vim显示的好看一些,需要对vim进行一些配置
通过 sudo vim /etc/vim/vimrc
命令在vimrc文件的末尾添加如下:
set nu
set tabstop
set cursorline
set ruler
最好在当前目录下新建一个ndk目录来放ndk,这样文件不会乱.
通过xftp将下载好的ndk上传至ndk目录下
由于这个.bin没有执行权限,所以通过下面命令来给.bin文件添加执行权限
chmod 777 android-ndk-r10e-linux-x86_64.bin
有了执行权限后,给.bin文件解压
./android-ndk-r10e-linux-x86_64.bin
这里说一下,你下载的ndk后缀是.tar.gz,上传后使用如下命令解压后和.bin文件执行完后一样。这样唯一一点差别就没有了。
tar -zxvf android-ndk-r10e-linux-x86_64.tar.gz
解压完成后,就到了很重要的一步了,需要配置ndk的环境变量,很多人不会在linux下配置环境变量导致困在这一步很久.
使用如下命令
vim ~/.bashrc
在这个文件末尾添加下面的变量
export NDKROOT=/usr/ndk/android-ndk-r10e
export PATH=$NDKROOT:$PATH
ndk-buil -v
出现版本号就代表配置好了.
将ffmpeg下载后先别急着上传,有一些内容还需要修改,否则会出现问题。
这里是在window下进行的:
可以看到解压的文件夹下有一个configure文件,使用notepad或其他的工具打开它,搜索 build settings
将下面的代码修改如下
# build settings
SHFLAGS='-shared -Wl,-soname,$$(@F)'
LIBPREF="lib"
LIBSUF=".a"
FULLNAME='$(NAME)$(BUILDSUF)'
LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)'
SLIBPREF="lib"
SLIBSUF=".so"
SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
给张图做参考
注意:最好将上面的代码直接复制 到你的configure文件中的build settings,修改成图片中那样的就行。不用添加什么注释之类的,否则可能会出现不知名的错误。
这一步一定要修改好否则即使你上传了编译好了.so库也不能用。这一步会出现的错误,讲课时jason老师也演示了,下面给张错误图:
可以看到可以看到在.so名字后又有了版本号后缀,这就导致了我们即使库编译出来了也不能使用。
下面先给张成功后的图来呀呀惊。
解决好了后,将这个ffmpeg-2.8.14文件夹重写压缩成.zip文件。这步太容易就不上图了。
下面的就在服务器上执行了,最好在服务器上同样新建一个ffmpeg文件夹,压缩后的ffmpeg.zip通过xftp上传到服务器上
解压文件,
unzip ffmpeg-2.8.14.zip
如果没有unzip命令可以通过如下命令下载
sudo apt-get install unzip
解压完成后,修改ffmpeg-2.8.14文件夹的权限,这一步很重要,一定要有 -R 否则后面会报文件找不到错误。
chmod 777 -R ffmpeg-2.6.9
没错就是自己编写执行.sh脚本文件,不会?没关系,这里有写好的。
在window上新建build_android.sh文件。
将下面内容复制到build_android.sh文件中
#!/bin/bash
#ndk的路径
export NDK_PATH=/home/ubuntu/ndk/android-ndk-r10e
export ANDROID_VERSION=android-14
function build_ffmpeg
{
echo "build start "
./configure --target-os=linux \
--prefix=$OUT_PATH \
--arch=$ARCH \
--disable-static \
--enable-shared \
--disable-yasm \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--enable-cross-compile \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$SYSROOT \
--extra-cflags="-fpic"
make clean
make
make install
echo "build finish"
}
#----------------------------------------
#目标架构
ARCH=x86
#要编译的类型
CPU=x86
#生成的路径
OUT_PATH=$(pwd)/android/$CPU
#交叉编译版本,根据目标架构改变
TOOLCHAIN_VERSION=x86-4.9
#编译工具
TOOL=i686-linux-android-
#交叉编译工具链
CROSS_PREFIX=$NDK_PATH/toolchains/$TOOLCHAIN_VERSION/prebuilt/linux-x86_64/bin/$TOOL
SYSROOT=$NDK_PATH/platforms/$ANDROID_VERSION/arch-$ARCH
build_ffmpeg
这是我自己后面根据学习了后写的,是可以编译生成x86框架的.so库的。下面是一些需要注意的。
* 不要手敲,直接将上面代码复制到你的内容即可。这是由于里面有一些不换行格式,手敲容易错,一旦错一个整个就编译不出来。
* 将NDK的目录修改为自己linux下的目录,否则肯定报错.
* 这里编译的是x86版的,如果需要编译arm版,则需要修改横线下面的前四个变量,修改为自己ndk下的对应的路径。其他版本的套路一致。
这里再给一个arm编译的
#---------------------------------------------
#arm架构
#目标架构,这里需要修改
ARCH=arm
#要编译的类型,需要修改
CPU=arm
#生成的路径
OUT_PATH=$(pwd)/android/$CPU
#交叉编译版本,根据目标架构改变
TOOLCHAIN_VERSION=arm-linux-androideabi-4.9
#编译工具,需要修改
TOOL=arm-linux-androideabi-
#交叉编译工具链
CROSS_PREFIX=$NDK_PATH/toolchains/$TOOLCHAIN_VERSION/prebuilt/linux-x86_64/bin/$TOOL
SYSROOT=$NDK_PATH/platforms/$ANDROID_VERSION/arch-$ARCH
build_ffmpeg
有了这个shell文件后将这个文件上传至服务器的ffmpeg-2.8.14文件夹下
修改脚本的权限,给脚本执行权限
chmod 777 android_build.sh
执行脚本
./build_android.sh
会看到有很多问题,文件找不到错误等.
这是由于build_android.sh是在window下创建的,编码格式可能会有很多问题.
怎样解决这个问题?
通过一个小工具 dos2unix
通过如下命令在linux上安装这个软件
sudo apt-get install dos2unix
下载完成后执行如下命令,将window文件转成unix文件即可
dos2unix build_android.sh
转成后重新执行脚本,即可编译通过。
这一步需要说明一下,这步可能是编译最难的地方了,脚本写对了,基本都能够编译出来,脚本中有一个重点就是 \ 后面是不能有空格的。上面的脚本代码我经过测试是没有问题的,如果说你粘贴复制后编译不出来,可以试一下在linux下通过vim新建脚本文件,将上面的命令敲一遍,我试了一下这样可以编译的处来。对应脚本中的命令,可能第一次有点看不懂,不过后面学了shell编程后感觉容易的多。