02.最简单的在Linux下的编译ffmpeng生成.so库

目标

在全新的linux下编译ffmeng源码,生成可用的.so和.h库。这次的文章非常重要,一定要自己编译出来,如果哪个地方出错了,重新来一下,一定要编译出.so库。这是因为很多c/c++库都编译和这次的编译都差不多。按照这篇文章是绝对可以编译出来的,我编译成功很多次了。

准备

1.阿里云主机

阿里云上或者腾讯云上买一台linux服务器,如果是学生可用优惠,优惠后10元一月。如果不舍得花钱可用虚拟机代替。系统最好是ubuntu的。

2.安装xshell和xftp

直接百度搜索xshell和xftp下载,一步步安装就行.

3.下载ndk和ffmpeg

到这个网址http://www.androiddevtools.cn/ 上下载ndk,注意是linux版本的ndk,到ffmpeg官网下载ffmpeg。
这里写图片描述
我这里使用的是r10和ffmpeg 2.8.14版本。可能看到我的ndk后缀是.bin。这里不用担心,你下载的.tar.gz的ndk上传到服务器和.bin上传是一样的没有任何区别。

步骤

有了上面的准备后开始动手了,一步一步的来。

1.配置服务器

通过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

这里写图片描述

2.安装ndk

最好在当前目录下新建一个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

出现版本号就代表配置好了.

3.修改ffmpeg的configure文件

将ffmpeg下载后先别急着上传,有一些内容还需要修改,否则会出现问题。

这里是在window下进行的:

将下载的ffmpeg-2.8.14.tar.gz解压
这里写图片描述

可以看到解压的文件夹下有一个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文件。这步太容易就不上图了。

4.修改ffmpeg

下面的就在服务器上执行了,最好在服务器上同样新建一个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

5.编写shell脚本文件

没错就是自己编写执行.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编程后感觉容易的多。

编译成功可能需要等待个10多分钟。编译好了如下.
这里写图片描述

猜你喜欢

转载自blog.csdn.net/A_thousand_miles/article/details/81171457