您的位置:首页 > 移动开发 > Android开发

ffmpeg-3.1.1编译(iOS和Android)

2016-09-06 13:42 218 查看
本文介绍ffmpeg3.1.1版本的编译(此版本正常编译通过, 其他版本可能会有改动, 不同的版本开发, 代码上会有一定的差异)

由于各自的环境不同, 所以注明本人用的设备

这里的编译为.a文件, iOS平台下可以直接使用的静态库
.so为Android平台的库, 要生成so的话必须将ffmpeg的源码目录拷贝到ndk目录下的sources目录, 编译完成后会在ffmpeg目录下生成android目录, include为接口头文件目录, lib为so库目录
在其他目录的话会生成iOS平台的.a库, 并需要开放对应目录的写权限(因为编译完成后需要拷贝到这些目录, 最后会说到)

日期: 2016-09-06

编译环境(推荐使用mac, 因为有图形界面和Linux有很多命令相似, 使用非常方便)

Mac 10.11.6 2014年中, 由于使用的是固态硬盘, 执行速度较快
ffmpeg库很庞大, 编译的时间较长, 不同设备和环境会有所差异

1. 下载最新的源代码解压
2. 终端定位到解压目录下, 执行chmod +x configure
3. 执行./configure, 此时在该目录下会生成必要的配置文件, 前提是安装了较新的yasm, 如果是没有安装, 或者版本太老会有如下提示

yasm/nasm not found or too old. Use --disable-yasm for a crippled build.

接下来先安装最新的yasm, 这个工具有利于加速编译

一:
由于ffmpeg需要用到yasm, mac是没有内置yasm, 需要下载安装
yasm安装步骤:

终端命令如下:
定位到指定下载目录:

1. 下载
curl http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz >yasm.tar.gz
2. 解压
tar xzvf yasm.tar.gz
3. 定位到yasm源码目录
cd yasm-1.2.0
4. 执行编译配置
./configure
5. 执行make编译
make
6. 执行安装
sudo make install

二:
下载好ffmpeg, 修改configure文件

解压缩, 进入目录下, 使用文本编辑工具打开configure文件
目的是去掉默认生成的库名字libavcodec.so.55最后那个”55″的版本号。
将如下内容:
 
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)'

三:
创建build_android.sh脚本文件, 并拷贝到ffmpeg源码根目录
添加编辑内容
#!/bin/bash
#下面三个路径要修改为自己真实路径
NDK=$home/Apache/android-ndk-r12
SYSROOT=$NDK/platforms/android-14/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64

function build_one
{
./configure
--prefix=$PREFIX
--enable-shared
--disable-static
--disable-doc
--disable-ffmpeg
--disable-ffplay
--disable-ffprobe
--disable-ffserver
--disable-avdevice
--disable-doc
--disable-symver
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-
--target-os=linux
--arch=arm
--enable-cross-compile
--sysroot=$SYSROOT
--extra-cflags="-Os -fpic $ADDI_CFLAGS"
--extra-ldflags="$ADDI_LDFLAGS"
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one

四:
添加执行权限
chmod +x build_android.sh

五: 执行编译
./build_android.sh

等待编译结束, 本机大概13分钟左右

最后编译的头文件会在/usr/local/include目录下
.a库文件会在/usr/local/lib目录下

另外在附上一个脚本可编译多个so为一个so,原理是先将源码编译为各自的静态库,再利用工具链命令合成ffmpeg.so
脚本主要改动
–enable-shared 改为
–enable-static

–disable-static
改为 –disable-shared
build_android_ffmpeg.sh 脚本如下

#!/bin/bash
export TMPDIR=/Users/hubin/Desktop/ffmpeg-3.0/ffmpegtemp #这句很重要,不然会报错 unable to create temporary file in
# NDK的路径,根据自己的安装位置进行设置
NDK=~/Applications/android-sdk/ndk-bundle
# 编译针对的平台,可以根据自己的需求进行设置
# 这里选择最低支持android-14, arm架构,生成的so库是放在
# libs/armeabi文件夹下的,若针对x86架构,要选择arch-x86
PLATFORM=$NDK/platforms/android-14/arch-arm
# 工具链的路径,根据编译的平台不同而不同
# arm-linux-androideabi-4.9与上面设置的PLATFORM对应,4.9为工具的版本号,
# 根据自己安装的NDK版本来确定,一般使用最新的版本
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--target-os=linux \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--arch=arm \
--sysroot=$PLATFORM \
--extra-cflags="-I$PLATFORM/usr/include" \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--disable-shared \
--enable-runtime-cpudetect \
--enable-gpl \
--enable-small \
--enable-cross-compile \
--disable-debug \
--enable-static \
--disable-doc \
--disable-asm \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping \
$ADDITIONAL_CONFIGURE_FLAG
sed -i '' 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h
sed -i '' 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h
sed -i '' 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h
sed -i '' 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h
sed -i '' 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h
sed -i '' 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h
sed -i '' 's/HAVE_CBRT 0/HAVE_CBRT 1/g' config.h
sed -i '' 's/HAVE_RINT 0/HAVE_RINT 1/g' config.h
make clean
make -j4
make install
$TOOLCHAIN/bin/arm-linux-androideabi-ld \
-rpath-link=$PLATFORM/usr/lib \
-L$PLATFORM/usr/lib \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$PREFIX/libffmpeg.so \
libavcodec/libavcodec.a \
libavfilter/libavfilter.a \
libswresample/libswresample.a \
libavformat/libavformat.a \
libavutil/libavutil.a \
libswscale/libswscale.a \
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a \
}
# arm v7vfp
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
PREFIX=./android/$CPU-vfp
ADDITIONAL_CONFIGURE_FLAG=
build_one
# CPU=armv
# PREFIX=$(pwd)/android/$CPU
# ADDI_CFLAGS="-marm"
# build_one
#arm v6
#CPU=armv6
#OPTIMIZE_CFLAGS="-marm -march=$CPU"
#PREFIX=./android/$CPU
#ADDITIONAL_CONFIGURE_FLAG=
#build_one
#arm v7vfpv3
# CPU=armv7-a
# OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
# PREFIX=./android/$CPU
# ADDITIONAL_CONFIGURE_FLAG=
# build_one
#arm v7n
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
#PREFIX=./android/$CPU
#ADDITIONAL_CONFIGURE_FLAG=--enable-neon
#build_one
#arm v6+vfp
#CPU=armv6
#OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
#PREFIX=./android/${CPU}_vfp
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

PS: 大概就是这些步骤, 期间会提示一些函数过时警告, 直接忽略
但是可能依然会遇到一些写权限问题, 因为编译完成之后都会将目标文件拷贝到一些目录, 必须保证这些目录具有写权限
由于iOS平台生成的是.a静态库, 所以文件会很大
Android平台生成的是.so动态库, 所以相对会小很多

install: /usr/local/share/man/man1/ffmpeg.1: Permission denied
make: *** [install-man] Error 71

我在编译过程中遇到目录权限问题, 所有需要添加
/usr/local/share/man 目录的权限
这里的权限至少要添加写权限
sudo chmod 777 -R /usr/local/share/man
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ffmpeg Android ndk