1. FFMpeg 編譯選項:
./configure --as=yasm --enable-nonfree --enable-shared --disable-static --enable-ffplay --enable-gpl --enable-pthreads --enable-postproc --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-libspeex --enable-bzlib --enable-zlib --enable-libsnappy --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-version3 --enable-libfdk-aac --enable-libvpx --enable-encoder=pcm_mulaw --enable-encoder=flac --enable-libgsm --enable-libopus --enable-fontconfig --enable-libfreetype --enable-libass --enable-libbluray --enable-filters --extra-cflags=-mmacosx-version-min=10.9 --extra-ldflags=-mmacosx-version-min=10.9
注意編譯選項:
--extra-cflags=-mmacosx-version-min=10.9 --extra-ldflags=-mmacosx-version-min=10.9
在 macOS 上編譯需要注意這個選項滤钱,指定編譯庫兼容的最低系統(tǒng)版本晕窑,編譯其他依賴庫(動態(tài)庫)的時候也需要指定褪尝,因為編譯出來的動態(tài)庫如果需要打包到app并發(fā)布到AppStore, 必須指定這個亏推,如果不指定,無法上傳到Appstore叁巨。報如下錯誤:
Couldn't find platform family in Info.plist CFBundleSupportedPlatforms or Mach-O LC_VERSION_MIN for libass.9.dylib
如果成功編譯斑匪,使用 otool -l *.dylib 命令查看 load command 8 :
Load command 8
cmd LC_VERSION_MIN_MACOSX
cmdsize 16
version 10.9
sdk 10.14
如果沒有成功指定最低兼容版本就是下面這樣:
Load command 8
cmd LC_BUILD_VERSION
cmdsize 32
platform macos
sdk 10.14
minos 10.14
ntools 1
tool ld
version 409.12
這點在macOS上編譯很重要,尤其在產(chǎn)品需要發(fā)布AppStore的情況下锋勺。
2.依賴庫編譯安裝
這里其實也可以直接使用brew安裝依賴庫:
brew install opencore-amr
brew install lame
brew install speex
brew install theora
就像前面所說需要指定最低兼容版本號蚀瘸,所以所有依賴庫都需要下載源碼一個一個編譯:
yasm
libsnappy
libogg
libtheora
libvorbis
opencore-amr
speex
x264
fdk-aac
fontconfig
freetype
fribidi
gsm
gsm源碼編譯不需要configure,項目下自帶 Makefile 文件庶橱,直接執(zhí)行 make 就行贮勃,但是如果想要編譯出動態(tài)庫.dylib文件,需要手動修改 Makefile 文件:
line 143 add :
LIBGSMSO= $(LIB)/libgsm.1.0.13.dylib
line 302 add :
$(LIBGSMSO): $(LIB) $(GSM_OBJECTS)
$(LD) "-mmacosx-version-min=10.9" -o $(LIBGSMSO) -dynamiclib -Wl,-compatibility_version,1,-current_version,1.0.13,-install_name,$(LIBGSMSO) $(GSM_OBJECTS) -lc
ln -fs libgsm.1.0.13.dylib lib/libgsm.1.dylib
ln -fs libgsm.1.0.13.dylib lib/libgsm.dylib
lame
./configure CFLAGS="-mmacosx-version-min=10.9"
3.100版本源碼下載下來有個編譯問題苏章,用如下方式解決:
Remove the line containing 'lame_init_old' from the file 'include/libmp3lame.sym'
libass
libbluray
SDL2
opus
xvidcore
關(guān)于依賴庫編譯
代碼下載下來后開始逐個編譯安裝寂嘉,基本都遵從 ./configure / make / make install 這個過程:
還是需要注意之前說到過的制定最低兼容系統(tǒng)版本號問題:
by configuring the autotools utility with
./configure CFLAGS="-mmacosx-version-min=10.9" LDFLAGS="-mmacosx-version-min=10.9"
and by configuring the other cmake utility with
-D CMAKE_OSX_DEPLOYMENT_TARGET=10.9
3. 關(guān)于動態(tài)庫打包和安裝
編譯出來的動態(tài)庫默認加載路徑是 /usr/local/lib, 如果希望把庫打包到app里并發(fā)布到appstore給其他人使用,這個加載路徑就必須改枫绅,使用 install_name_tool 工具可以達到目的:
#!/bin/sh
# change libavdevide.dylib
install_name_tool -change /usr/local/lib/libavfilter.7.dylib @loader_path/libavfilter.7.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libavformat.58.dylib @loader_path/libavformat.58.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libavcodec.58.dylib @loader_path/libavcodec.58.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libavutil.56.dylib @loader_path/libavutil.56.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libpostproc.55.dylib @loader_path/libpostproc.55.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libswresample.3.dylib @loader_path/libswresample.3.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libswscale.5.dylib @loader_path/libswscale.5.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libfreetype.6.dylib @loader_path/libfreetype.6.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libfontconfig.1.dylib @loader_path/libfontconfig.1.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/opt/sdl2/lib/libSDL2-2.0.0.dylib @loader_path/libSDL2.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libvorbisenc.2.dylib @loader_path/libvorbisenc.2.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libvorbis.0.dylib @loader_path/libvorbis.0.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libx264.157.dylib @loader_path/libx264.157.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libmp3lame.0.dylib @loader_path/libmp3lame.0.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libfdk-aac.2.dylib @loader_path/libfdk-aac.2.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libspeex.1.dylib @loader_path/libspeex.1.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libopus.0.dylib @loader_path/libopus.0.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/opt/libgsm/lib/libgsm.1.0.13.dylib @loader_path/libgsm.1.0.13.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libbluray.2.dylib @loader_path/libbluray.2.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libass.9.dylib @loader_path/libass.9.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libogg.0.dylib @loader_path/libogg.0.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libtheoraenc.1.dylib @loader_path/libtheoraenc.1.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libtheoradec.1.dylib @loader_path/libtheoradec.1.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libopencore-amrwb.0.dylib @loader_path/libopencore-amrwb.0.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libopencore-amrnb.0.dylib @loader_path/libopencore-amrnb.0.dylib libavdevice.58.dylib
install_name_tool -change @rpath/libsnappy.1.dylib @loader_path/libsnappy.1.dylib libavdevice.58.dylib
# change libavfilter.dylib
install_name_tool -change /usr/local/lib/libavformat.58.dylib @loader_path/libavformat.58.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libavcodec.58.dylib @loader_path/libavcodec.58.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libavutil.56.dylib @loader_path/libavutil.56.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libpostproc.55.dylib @loader_path/libpostproc.55.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libswresample.3.dylib @loader_path/libswresample.3.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libswscale.5.dylib @loader_path/libswscale.5.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libfreetype.6.dylib @loader_path/libfreetype.6.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libfontconfig.1.dylib @loader_path/libfontconfig.1.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/opt/sdl2/lib/libSDL2-2.0.0.dylib @loader_path/libSDL2.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libvorbisenc.2.dylib @loader_path/libvorbisenc.2.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libvorbis.0.dylib @loader_path/libvorbis.0.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libx264.157.dylib @loader_path/libx264.157.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libmp3lame.0.dylib @loader_path/libmp3lame.0.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libfdk-aac.2.dylib @loader_path/libfdk-aac.2.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libspeex.1.dylib @loader_path/libspeex.1.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libopus.0.dylib @loader_path/libopus.0.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/opt/libgsm/lib/libgsm.1.0.13.dylib @loader_path/libgsm.1.0.13.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libbluray.2.dylib @loader_path/libbluray.2.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libass.9.dylib @loader_path/libass.9.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libogg.0.dylib @loader_path/libogg.0.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libtheoraenc.1.dylib @loader_path/libtheoraenc.1.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libtheoradec.1.dylib @loader_path/libtheoradec.1.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libopencore-amrwb.0.dylib @loader_path/libopencore-amrwb.0.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libopencore-amrnb.0.dylib @loader_path/libopencore-amrnb.0.dylib libavfilter.7.dylib
install_name_tool -change @rpath/libsnappy.1.dylib @loader_path/libsnappy.1.dylib libavfilter.7.dylib
# change libavcodec.dylib
install_name_tool -change /usr/local/lib/libavfilter.7.dylib @loader_path/libavfilter.7.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libavformat.58.dylib @loader_path/libavformat.58.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libavutil.56.dylib @loader_path/libavutil.56.dylib libavcodec.58.dylib
install_name_tool -change @rpath/libsnappy.1.dylib @loader_path/libsnappy.1.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libswresample.3.dylib @loader_path/libswresample.3.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libvorbisenc.2.dylib @loader_path/libvorbisenc.2.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libvorbis.0.dylib @loader_path/libvorbis.0.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libx264.157.dylib @loader_path/libx264.157.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libmp3lame.0.dylib @loader_path/libmp3lame.0.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libfdk-aac.2.dylib @loader_path/libfdk-aac.2.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libspeex.1.dylib @loader_path/libspeex.1.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libopus.0.dylib @loader_path/libopus.0.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/opt/libgsm/lib/libgsm.1.0.13.dylib @loader_path/libgsm.1.0.13.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libbluray.2.dylib @loader_path/libbluray.2.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libass.9.dylib @loader_path/libass.9.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libogg.0.dylib @loader_path/libogg.0.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libtheoraenc.1.dylib @loader_path/libtheoraenc.1.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libtheoradec.1.dylib @loader_path/libtheoradec.1.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libopencore-amrwb.0.dylib @loader_path/libopencore-amrwb.0.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libopencore-amrnb.0.dylib @loader_path/libopencore-amrnb.0.dylib libavcodec.58.dylib
# change libavformat.58.dylib
install_name_tool -change /usr/local/lib/libavformat.58.dylib @loader_path/libavformat.58.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libavcodec.58.dylib @loader_path/libavcodec.58.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libavutil.56.dylib @loader_path/libavutil.56.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libpostproc.55.dylib @loader_path/libpostproc.55.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libswresample.3.dylib @loader_path/libswresample.3.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libvorbisenc.2.dylib @loader_path/libvorbisenc.2.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libvorbis.0.dylib @loader_path/libvorbis.0.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libx264.157.dylib @loader_path/libx264.157.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libmp3lame.0.dylib @loader_path/libmp3lame.0.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libfdk-aac.2.dylib @loader_path/libfdk-aac.2.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libspeex.1.dylib @loader_path/libspeex.1.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libopus.0.dylib @loader_path/libopus.0.dylib libavformat.58.dylib
install_name_tool -change /usr/local/opt/libgsm/lib/libgsm.1.0.13.dylib @loader_path/libgsm.1.0.13.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libbluray.2.dylib @loader_path/libbluray.2.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libass.9.dylib @loader_path/libass.9.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libogg.0.dylib @loader_path/libogg.0.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libtheoraenc.1.dylib @loader_path/libtheoraenc.1.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libtheoradec.1.dylib @loader_path/libtheoradec.1.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libopencore-amrwb.0.dylib @loader_path/libopencore-amrwb.0.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libopencore-amrnb.0.dylib @loader_path/libopencore-amrnb.0.dylib libavformat.58.dylib
install_name_tool -change @rpath/libsnappy.1.dylib @loader_path/libsnappy.1.dylib libavformat.58.dylib
# change libswscale.dylib
install_name_tool -change /usr/local/lib/libavutil.56.dylib @loader_path/libavutil.56.dylib libswscale.5.dylib
# change libpostproc.dylib
install_name_tool -change /usr/local/lib/libavutil.56.dylib @loader_path/libavutil.56.dylib libpostproc.55.dylib
# change libswresample.dylib
install_name_tool -change /usr/local/lib/libavutil.56.dylib @loader_path/libavutil.56.dylib libswresample.3.dylib
# libfontconfig
install_name_tool -change /usr/local/lib/libfreetype.6.dylib @loader_path/libfreetype.6.dylib libfontconfig.1.dylib
# bluray
install_name_tool -change /usr/local/lib/libfreetype.6.dylib @loader_path/libfreetype.6.dylib libbluray.2.dylib
install_name_tool -change /usr/local/lib/libfontconfig.1.dylib @loader_path/libfontconfig.1.dylib libbluray.2.dylib
# ass
install_name_tool -change /usr/local/lib/libfreetype.6.dylib @loader_path/libfreetype.6.dylib libass.9.dylib
install_name_tool -change /usr/local/lib/libfontconfig.1.dylib @loader_path/libfontconfig.1.dylib libass.9.dylib
install_name_tool -change /usr/local/lib/libfribidi.0.dylib @loader_path/libfribidi.0.dylib libass.9.dylib
# change libvorbisenc.dylib
install_name_tool -change /usr/local/lib/libvorbis.0.dylib @loader_path/libvorbis.0.dylib libvorbisenc.2.dylib
install_name_tool -change /usr/local/lib/libogg.0.dylib @loader_path/libogg.0.dylib libvorbisenc.2.dylib
# change libvorbis.dylib
install_name_tool -change /usr/local/lib/libogg.0.dylib @loader_path/libogg.0.dylib libvorbis.0.dylib
# change libtheoraenc.dylib
install_name_tool -change /usr/local/lib/libogg.0.dylib @loader_path/libogg.0.dylib libtheoraenc.1.dylib
# change id of some dylibs
install_name_tool -id @executable_path/libavdevice.58.dylib libavdevice.58.dylib
install_name_tool -id @executable_path/libavfilter.7.dylib libavfilter.7.dylib
install_name_tool -id @executable_path/libavcodec.58.dylib libavcodec.58.dylib
install_name_tool -id @executable_path/libavutil.56.dylib libavutil.56.dylib
install_name_tool -id @executable_path/libavformat.58.dylib libavformat.58.dylib
install_name_tool -id @executable_path/libswscale.5.dylib libswscale.5.dylib
install_name_tool -id @executable_path/libpostproc.55.dylib libpostproc.55.dylib
install_name_tool -id @executable_path/libswresample.3.dylib libswresample.3.dylib
install_name_tool -id @executable_path/libfdk-aac.2.dylib libfdk-aac.2.dylib
install_name_tool -id @executable_path/libmp3lame.0.dylib libmp3lame.0.dylib
install_name_tool -id @executable_path/libx264.157.dylib libx264.157.dylib
install_name_tool -id @executable_path/libxvidcore.4.dylib libxvidcore.4.dylib
install_name_tool -id @executable_path/libtheoradec.1.dylib libtheoradec.1.dylib
install_name_tool -id @executable_path/libtheoraenc.1.dylib libtheoraenc.1.dylib
install_name_tool -id @executable_path/libopus.0.dylib libopus.0.dylib
install_name_tool -id @executable_path/libspeex.1.dylib libspeex.1.dylib
install_name_tool -id @executable_path/libvorbis.0.dylib libvorbis.0.dylib
install_name_tool -id @executable_path/libvorbisenc.2.dylib libvorbisenc.2.dylib
install_name_tool -id @executable_path/libass.9.dylib libass.9.dylib
install_name_tool -id @executable_path/libsnappy.1.dylib libsnappy.1.dylib
install_name_tool -id @executable_path/libbluray.2.dylib libbluray.2.dylib
install_name_tool -id @executable_path/libfribidi.0.dylib libfribidi.0.dylib
install_name_tool -id @executable_path/libSDL2-2.0.0.dylib libSDL2.dylib
# freetype ogg amr
install_name_tool -id @executable_path/libfreetype.6.dylib libfreetype.6.dylib
install_name_tool -id @executable_path/libfontconfig.1.dylib libfontconfig.1.dylib
install_name_tool -id @executable_path/libgsm.1.0.13.dylib libgsm.1.0.13.dylib
install_name_tool -id @executable_path/libogg.0.dylib libogg.0.dylib
install_name_tool -id @executable_path/libopencore-amrnb.0.dylib libopencore-amrnb.0.dylib
install_name_tool -id @executable_path/libopencore-amrwb.0.dylib libopencore-amrwb.0.dylib
以上是針對所有動態(tài)庫的修改泉孩,可以保存到shell文件,一鍵執(zhí)行完成并淋。