音视频编程: 编译 faac/faad2

本文分享如何在 MacOS 上面编译 faac 和 faad2, 编译后的库文件可以直接在 iOS 上面使用.

后续会分享如何编译给 Android 使用的库文件的方法以及实战.

该系列博文:

简介

faad 是 AAC 格式文件的音频解码库. 相对于 FFmpeg 来说比较轻量和简单. 编译出来全平台静态库文件较小, API 也比较简单, 缺点是功能单一, 只能处理 AAC 格式的音频文件.

faac 是与之对应的 AAC 音频编码库. 支持 MPEG-4 和 MPEG-2 的AAC 编码,其特性包括:可移植性好,快速,支持LC/Main/LTP,通过 Dream 支持 DRM.

这两个库虽然很久没有更新了, 但是其功能已经满足很多业务场景了, 并且很好用.

下载源码

点击 源码链接 即可下载源码.

1

编译 faac

下载完成后, 解压, 将 faac-1.28 放到新建目录 src 下面即可, 目录结构如下:
1

修改 build_faac.sh 权限:

1
chmod +x build_faac.sh

编辑 build_faac.sh 内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/bin/sh
# http://www.linuxfromscratch.org/blfs/view/svn/multimedia/faac.html
# ftp://mirror.ovh.net/gentoo-distfiles/distfiles/
major=1
minor=28
micro=
XCD_ROOT="/Applications/Xcode.app/Contents/Developer"
TOL_ROOT="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain"
#修改为最新的 sdk 版本
SDK_ROOT="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.2.sdk"
SDK_SML_ROOT="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator11.2.sdk"
export PATH=$TOL_ROOT/usr/bin:$PATH
work=`pwd`
srcs=$work/src
buid=$work/build
insl=$buid/install
name=faac-${major}.${minor}
pakt=${name}.tar.gz
dest=$work/faac-iOS-${major}.${minor}.${micro}.tgz
rm -rf $srcs $buid $dest && mkdir -p $srcs $buid
archs="i386 x86_64 armv7 armv7s arm64"
for a in $archs; do
case $a in
arm*)
sys_root=${SDK_ROOT}
host=arm-apple-darwin
;;
i386|x86_64)
sys_root=${SDK_SML_ROOT}
host=$a-apple-darwin
;;
esac
prefix=$insl/$a && rm -rf $prefix && mkdir -p $prefix
rm -rf $srcs && mkdir -p $srcs && cd $work && tar xvzf $pakt -C $srcs && cd $srcs/$name
export CC="$TOL_ROOT/usr/bin/clang -arch $a -isysroot $sys_root"
export CXX="$TOL_ROOT/usr/bin/clang++ -arch $a -isysroot $sys_root"
export CXXFLAGS="-arch $a -isysroot $sys_root"
export CFLAGS="-arch $a -isysroot $sys_root"
export LDFLAGS="-isysroot $sys_root"
export LIBS="-L${sys_root}/usr/lib"
chmod +x bootstrap
./bootstrap \
&&./configure \
--host=$host \
--with-sysroot=$sys_root \
--prefix=$prefix \
--disable-shared \
--enable-static \
--disable-faac \
--with-mp4v2 \
&&make && make install
lipo_archs="$lipo_archs $prefix/lib/libfaac.a"
echo 'continue any key pressed..'
read -n 1
done
univ=$insl/universal && mkdir -p $univ/lib
cp -r $prefix/include $univ/
lipo $lipo_archs -create -output $univ/lib/libfaac.a
ranlib $univ/lib/libfaac.a
strip -S $univ/lib/libfaac.a
cd $univ && tar cvzf $dest *

执行 ./build_faac.sh, 开始编译.

编译成功后, 生成 build 目录.
1

其中, universal 生成的库是通用库.

编译 faad2

解压后, 将 faad2-2.7 改名为 faad.

编写编译的脚本文件, 这里取名为 build_fadd2.sh

1
touch build_fadd2.sh

编辑 build_fadd2.sh 文件.

写入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#!/bin/sh
CONFIGURE_FLAGS="--enable-static --with-pic"
ARCHS="arm64 armv7s armv7 x86_64 i386"
# directories
SOURCE="faad"
FAT="fat-faad"
SCRATCH="scratch-faad"
# must be an absolute path
THIN=`pwd`/"thin-faad"
COMPILE="y"
LIPO="y"
if [ "$*" ]
then
if [ "$*" = "lipo" ]
then
# skip compile
COMPILE=
else
ARCHS="$*"
if [ $# -eq 1 ]
then
# skip lipo
LIPO=
fi
fi
fi
if [ "$COMPILE" ]
then
CWD=`pwd`
for ARCH in $ARCHS
do
echo "building $ARCH..."
mkdir -p "$SCRATCH/$ARCH"
cd "$SCRATCH/$ARCH"
if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]
then
PLATFORM="iPhoneSimulator"
CPU=
if [ "$ARCH" = "x86_64" ]
then
SIMULATOR="-mios-simulator-version-min=7.0"
HOST="--host=x86_64-apple-darwin"
else
SIMULATOR="-mios-simulator-version-min=5.0"
HOST="--host=i386-apple-darwin"
fi
else
PLATFORM="iPhoneOS"
if [ $ARCH = "armv7s" ]
then
CPU="--cpu=swift"
else
CPU=
fi
SIMULATOR=
HOST="--host=arm-apple-darwin"
fi
XCRUN_SDK=`echo $PLATFORM | tr '[:upper:]' '[:lower:]'`
CC="xcrun -sdk $XCRUN_SDK clang -Wno-error=unused-command-line-argument-hard-error-in-future"
AS="$CWD/$SOURCE/extras/gas-preprocessor.pl $CC"
CFLAGS="-arch $ARCH $SIMULATOR"
CXXFLAGS="$CFLAGS"
LDFLAGS="$CFLAGS"
CC=$CC CFLAGS=$CXXFLAGS LDFLAGS=$LDFLAGS CPPFLAGS=$CXXFLAGS CXX=$CC CXXFLAGS=$CXXFLAGS $CWD/$SOURCE/configure \
$CONFIGURE_FLAGS \
$HOST \
--prefix="$THIN/$ARCH" \
--disable-shared \
--without-mp4v2
make clean && make && make install-strip
cd $CWD
done
fi
if [ "$LIPO" ]
then
echo "building fat binaries..."
mkdir -p $FAT/lib
set - $ARCHS
CWD=`pwd`
cd $THIN/$1/lib
for LIB in *.a
do
cd $CWD
lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB
done
cd $CWD
cp -rf $THIN/$1/include $FAT
fi

给予执行权限:

1
chmod +x build_fadd2.sh

此时目录结构如下:
1

执行编译脚本, 在当前目录生成 scratch-faadfat-faad 以及 thin-faad 目录, 如下:
1

使用 fat-faad 里面的库和文件即可.

可以使用下面的命令查看对应的 .a 文件所支持的架构:

1
lipo -info libfaad.a

会得到对应的输出:

1
Architectures in the fat file: libfaad.a are: i386 armv7 armv7s arm64

同样可以查看 libfaac.a.

后记

编译好的文件, 已经放到 github 上面了, 有需要的可以下载使用, 点击 下载链接 进入.

感谢 fflydev/faac-ios-build 提供编译 faac 的 shell, 只需要将里面对应的 SDK 改为本机最新的 SDK 即可.

参考文章

坚持原创技术分享!