一、执行.configure --disable-yasm命令
编译ffmpeg,编写shell脚本之前,要执行.configure --disable-yasm命令。执行这些命令的主要目的是进行一系列的准备工作,比如说检查gcc的版本,会生成common.mak等文件
1、解压ffmpeg压缩包
unzip ffmpeg-2.6.9
2、进入到解压后的文件夹,并查看文件夹中的内容
cd ffmpeg-2.6.9/ :进入到文件夹ffmpeg-2.6.9的目录
ls -la :查看文件夹中的内容
3、查看common.mak文件,如果文件不存在或者文件为空,需要执行configure命令自动生成该文件
4、给configure文件赋执行权限
(1)查看configure的权限
按“ESC”命令退出进入命令模式,输入“:wq!”退出编辑模式。
ls -la :查看文件的详细信息
此时configure没有执行权限
(2)退出到上级目录
(3)给文件夹赋执行权
(4)再次进入到ffmpeg的文件夹
5、执行configure命令 ,自动生成一些配置文件
执行命令 ./configure --disable-yasm
(如果该文件没有执行权限,提前需要给它赋执行权限)
二、编写脚本build.sh
1、函数声明
函数名“build_ffmpeg”和“{”之间至少需要一个空格,所以最好按下面的方式来写
function build_ffmpeg
{
}
2、指定操作系统
./configure --target-os=linux \
一行可能会很长,所以使用 “\”进行换行
linux 和“\”之间有一个空格,且该“\”之后不能有空格,直接按“Enter”进行换行
3、--prefix指定编译完动态库存放发的位置
--prefix=$PREFIX \
--prefix指定存放发目录,--prefix之前不允许有空格,但是可以使用“TAB”键
变量如PREFIX、CPU一般大写
pwd:代表当前目录
4、指定CPU的架构
--arch=$ARCH \
5、生成动态库
--enable-shared \
6、不生成静态库
--disable-static \
7、不生成yasm软件
--disable-yasm
8、
--disable--ffmpeg : 不生成ffmpeg
--disable-ffplay : 不生成播放器
--disable-ffprobe : 不生成查看视频的信息的软件ffprobe
--disable-ffserver :不生成流媒体推流
--disable-doc :不生成文档
9、交叉编译
(1)允许交叉编译
--enable-cross-compile :允许交叉编译
(2)指定交叉编译使用的toolchain路径
#全局变量,多个shell脚本都可以使用
export ANDROID_NDK_HOME= /usr/ndk/android-ndk-r10e
--cross-prefix=$CROSS_COMPILE :指定交叉编译所使用的工具路径(允许交叉编译需要指定路径,交叉编译会使用到toolchain,所以需要使用到linux下面的包)
TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 :指定toolchain的路径
(3)指定交叉编译使用的工具路径
CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-:指定交叉编译使用的工具路径
交叉编译使用到了arm-linux-androideabi-ar、arm-linux-androideabi-as、arm-linux-androideabi-a++等工具,需要指定这些工具的路径,其中最后的“-"表示通配符
(4)指定arm编译的根路径
10、编译动态库时需要指定“-fpic”
PIC : Position-Independent Code
-fpic作用于编译阶段,告诉编译器产生与位置无关的代码
则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确地执行。
这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的
PIC使.so文件的代码变为真正意义上的共享
如果不加-fpic,则加载.so文件的代码段时,代码引用的数据对象需要重定位,重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码短短copy。每个copy是否一样,取决于这个.so文件代码段和数据段内存映射的位置
9、编译
build_android.sh
#!/bin/bash
#全局变量,多个shell脚本都可以使用
export ANDROID_NDK_HOME=/usr/ndk/android-ndk-r10e
export PLATFORM_VERSION=android-9
function build_ffmpeg
{
echo "start build ffmpeg $ARCH"
./configure --target-os=linux \
--prefix=$PREFIX \
--arch=$ARCH \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--enable-cross-compile \
--cross-prefix=$CROSS_COMPILE \
--sysroot=$PLATFORM \
--extra-cflags="-fpic"
make clean
make
make install
echo "build finished $ARCH"
}
#arm
ARCH=arm
CPU=arm
PREFIX=$(pwd)/android/$CPU
TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
PLATFORM=$ANDROID_NDK_HOME/platforms/$PLATFORM_VERSION/arch-$ARCH
build_ffmpeg
#x86
ARCH=x86
CPU=x86
PREFIX=$(pwd)/android/$CPU
TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/x86-4.9/prebuilt/linux-x86_64
CROSS_COMPILE=$TOOLCHAIN/bin/i686-linux-android-
PLATFORM=$ANDROID_NDK_HOME/platforms/$PLATFORM_VERSION/arch-x86
build_ffmpeg
注:
通过命令 bash ./configure --help来查看需要配置的文件
如配置 --prefix