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 也就那么回事了。





你可能感兴趣的:(FFMpeg,IOS)