背景介紹
大約一年前 kxmovie 停止更新了(今天2015-06-26),可能有些問題並沒有即時得到解決。
硬件環境:
macbook retina 15 , 2015-05月發佈的那款
系統 mac os x 10.10.3
xcode 6.3.2
根據 https://github.com/kolyvan/kxmovie Readme.md 中介紹環境準備步驟:
cd kxmovie
git submodule update --init
rake
如果是一臺新的macbook 肯定沒有安裝 yasm , 在rake 這一步 會遇到碰到 vlcxxxx.s 的錯誤,.s 是彙編語言的文件,缺少yasm無法編譯,解決辦法有兩個:
1. 安裝 yasm :
安裝 brew:
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
使用 brew 安裝 yasm:
brew install yasm
ps. 如果你的電腦沒有 ruby 這就無解了,不過It‘s impossible!!!
2. 在 kxmovie/Rakefile 修改
FFMPEG_BUILD_ARGS_SIM
FFMPEG_BUILD_ARGS_ARMV7
FFMPEG_BUILD_ARGS_ARMV7S
FFMPEG_BUILD_ARGS_ARM64
在以上四個關鍵字上尾部加上選項:
'--disable-asm',
用於禁止任何 asm 的東東編譯,asm 用匯編寫的,自然是爲了提高效率,一點點損失無所謂的啦。
順順利利的編譯成功了之後,準備用xcode打開工程開始運行,結果xcode編譯不過去,理由是:x86_64 的symbol找不到!!!
分析了下,當然啦,二貨,只編譯了 i386 , armv7 , armv7s , arm64.不知道爲啥在老的macbook上能夠行得通,新的macbook直接over。
此時你需要戰戰兢兢的添加 x86_64 的編譯所有.a出來。型號有 i386 的 configuration 可以參考。我嘗試寫一個腳本來解決,但是貌似編譯出錯,懶得理他了,直接進入ffmpeg自己手動打configuration 命令:
cd kxmovie-master/FFmpeg
./configure --disable-ffmpeg --disable-ffplay --disable-ffserver --disable-ffprobe --disable-doc --disable-bzlib --target-os=darwin --enable-cross-compile --enable-version3 --assert-level=2 --disable-mmx --arch=x86_64 --cpu=x86_64 --extra-ldflags='-arch x86_64 -miphoneos-version-min=6.0' --extra-cflags='-arch x86_64 -miphoneos-version-min=6.0' --disable-asm --cc=/Applications/XCode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.3.sdk
此時你生成了 x86_64 的 .a 文件,此時不要興奮,還有事情要做。
問:ffmpeg 這個東西爲什麼要編譯多份?
答:因爲有多個平臺要兼容。
嗯,這個答案非常漂亮,但是配置工程的時候,值選擇了一個.a怎麼解釋?所以需要工具把不同平臺的.a 融合在一個大的 .a中,所以你此時需要一個融合的動作:
philippideMacBook-Pro:FFmpeg philip$ pwd
/Users/philip/Documents/Workspace/kxmovie/FFmpeg
philippideMacBook-Pro:FFmpeg philip$ find . -name "*.a"
./arm64/libavcodec.a
./arm64/libavformat.a
./arm64/libavutil.a
./arm64/libswresample.a
./arm64/libswscale.a
./armv7/libavcodec.a
./armv7/libavformat.a
./armv7/libavutil.a
./armv7/libswresample.a
./armv7/libswscale.a
./armv7s/libavcodec.a
./armv7s/libavformat.a
./armv7s/libavutil.a
./armv7s/libswresample.a
./armv7s/libswscale.a
./i386/libavcodec.a
./i386/libavformat.a
./i386/libavutil.a
./i386/libswresample.a
./i386/libswscale.a
./libavcodec/libavcodec.a
./libavdevice/libavdevice.a
./libavfilter/libavfilter.a
./libavformat/libavformat.a
./libavutil/libavutil.a
./libswresample/libswresample.a
./libswscale/libswscale.a
因爲運行 rake 之後,i386,armv7,armv7s,arm64 的所有.a 都聲稱了嘛,那 libavcodec... 中的 .a 是我們之前用 x86_64 的配置生成的嘛,相信還沒忘記吧。。。
把它們合體成一個.a:
ok,我就要合體啦,看好啦:
新建一個目錄:
mkdir universal
合體:
lipo -create `find . -name libavcodec.a` -output universal/libavcodec.a
lipo -create `find . -name libavformat.a` -output universal/libavformat.a
lipo -create `find . -name libavutil.a` -output universal/libavutil.a
lipo -create `find . -name libswresample.a` -output universal/libswresample.a
lipo -create `find . -name libswscale.a` -output universal/libswscale.a
如果沒意外的話,在當前目錄中出現一個 universal 的文件夾,且有5個.a文件,並且非常大:
philippideMacBook-Pro:FFmpeg philip$ ls -l universal/
total 362640
-rw-r--r-- 1 philip staff 124318792 6 26 16:01 libavcodec.a
-rw-r--r-- 1 philip staff 54195536 6 26 16:01 libavformat.a
-rw-r--r-- 1 philip staff 2442248 6 26 16:01 libavutil.a
-rw-r--r-- 1 philip staff 660632 6 26 16:02 libswresample.a
-rw-r--r-- 1 philip staff 4042664 6 26 16:02 libswscale.a
philippideMacBook-Pro:FFmpeg philip$
.a 拿到了自然去替換掉之前的啦。 kxmovie-master/libs/FFmpeg/ 把所有的.a 刪除掉,並且替換掉。
問我爲什麼替換這裏的?沒看到xcode build setting 裏面配置的 library search path?
$(PROJECT_DIR)/libs/FFmpeg
最後。
你現在 command + r 肯定能夠成功了,相信我,如果不行,發郵件給我吧,[email protected] 。
ffmpeg 也就那麼回事了。