音视频编程: 编译 faac/faad2
本文分享如何在 MacOS 上面编译 faac 和 faad2, 编译后的库文件可以直接在 iOS 上面使用.
后续会分享如何编译给 Android 使用的库文件的方法以及实战.
该系列博文:
简介 faad
是 AAC 格式文件的音频解码库. 相对于 FFmpeg 来说比较轻量和简单. 编译出来全平台静态库文件较小, API 也比较简单, 缺点是功能单一, 只能处理 AAC 格式的音频文件。
faac
是与之对应的 AAC 音频编码库. 支持 MPEG-4 和 MPEG-2 的AAC 编码,其特性包括:可移植性好,快速,支持LC/Main/LTP,通过 Dream 支持 DRM.
这两个库虽然很久没有更新了, 但是其功能已经满足很多业务场景了, 并且很好用。
下载源码 点击 源码链接 即可下载源码
自从 2020.08 后该网站已经无法访问了,可以从 What Happened to Audiocoding.com (FAAC & FAAD2) 了解一下。
可以从 Sourceforge.net 下载。
编译 faac 下载完成后, 解压, 将 faac-1.28
放到新建目录 src
下面即可, 目录结构如下:
修改 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 目录。
其中, universal 生成的库是通用库。
编译 faad2 解压后, 将 faad2-2.7
改名为 faad
.
编写编译的脚本文件, 这里取名为 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
给予执行权限:
此时目录结构如下:
执行编译脚本, 在当前目录生成 scratch-faad
和 fat-faad
以及 thin-faad
目录, 如下:
使用 fat-faad
里面的库和文件即可。
可以使用下面的命令查看对应的 .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 即可。
参考文章