kxmovie ffmpeg 移植

背景介紹

大約一年前 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 


make 


此時你生成了 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$ 


最大那個居然有124MB 我會告訴你?


.a 拿到了自然去替換掉之前的啦。 kxmovie-master/libs/FFmpeg/ 把所有的.a 刪除掉,並且替換掉。

問我爲什麼替換這裏的?沒看到xcode build setting 裏面配置的 library search path?


$(PROJECT_DIR)/libs/FFmpeg


最後。

你現在 command + r 肯定能夠成功了,相信我,如果不行,發郵件給我吧,[email protected]



ffmpeg 也就那麼回事了。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章