背景介绍
大约一年前 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
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
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 也就那么回事了。