您的位置:首页 > 移动开发 > IOS开发

编译IOS下的FFMpeg

2013-08-29 15:04 197 查看
参考了网络上的各种文档,博客,整理如下:

1 环境

(1)机器上安装了xCode4.3.1和xCode4.5

(2)下载gas-preprocessor.pl:git:https://github.com/yuvi/gas-preprocessor

(3)下载iFrameExtractor sample:git clone git://github.com/lajos/iFrameExtractor.git,编译好的静态库,在这个sample能够跑成功就OK了

2 编译FFMpeg

(1) 配置FFMpeg的编译环境

编译armv6,armv7,i386(模拟器)三种静态库的脚本文件

Armv6:

文件iosArmv6Build.bat

# configure for armv6 build

./configure --disable-debug --enable-static --enable-version3 --enable-gpl --enable-pthreads --enable-memalign-hack --enable-cross-compile --disable-network --enable-runtime-cpudetect --disable-doc --disable-asm --cc=/Applications/Xcode4.3.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc
--as='gas-preprocessor/gas-preprocessor.pl /Applications/Xcode4.3.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc' --sysroot=/Applications/Xcode4.3.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk
--extra-ldflags=-L/Applications/Xcode4.3.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/usr/lib/system --target-os=darwin --arch=arm --cpu=arm1176jzf-s --extra-cflags='-arch armv6' --extra-ldflags='-arch armv6'

文件iosArmv6Pack.bat

# copy out the armv6 libs

rm -rf ./build/armv6

mkdir ./build/armv6

cp -f ./libavcodec/libavcodec.a ./build/armv6/libavcodec.a

cp -f ./libavdevice/libavdevice.a ./build/armv6/libavdevice.a

cp -f ./libavfilter/libavfilter.a ./build/armv6/libavfilter.a

cp -f ./libavformat/libavformat.a ./build/armv6/libavformat.a

cp -f ./libavutil/libavutil.a ./build/armv6/libavutil.a

cp -f ./libswscale/libswscale.a ./build/armv6/libswscale.a

Armv7:

文件iosArmv7Build.bat

# configure for armv7 build

./configure --disable-debug --enable-static --enable-version3 --enable-gpl --enable-pthreads --enable-memalign-hack --enable-cross-compile --disable-network --enable-runtime-cpudetect --disable-doc --disable-asm --cc=/Applications/Xcode4.5.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc
--as='gas-preprocessor/gas-preprocessor.pl /Applications/Xcode4.5.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc' --sysroot=/Applications/Xcode4.5.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk --extra-ldflags=-L/Applications/Xcode4.5.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/usr/lib/system
--target-os=darwin --arch=arm --cpu=cortex-a8 --extra-cflags='-arch armv7' --extra-ldflags='-arch armv7'

文件iosArmv7Pack.bat

# copy out the armv7 libs

rm -rf ./build/armv7

mkdir ./build/armv7

cp -f ./libavcodec/libavcodec.a ./build/armv7/libavcodec.a

cp -f ./libavdevice/libavdevice.a ./build/armv7/libavdevice.a

cp -f ./libavfilter/libavfilter.a ./build/armv7/libavfilter.a

cp -f ./libavformat/libavformat.a ./build/armv7/libavformat.a

cp -f ./libavutil/libavutil.a ./build/armv7/libavutil.a

cp -f ./libswscale/libswscale.a ./build/armv7/libswscale.a

i386(模拟器):

文件iosSimBuild.bat

# configure for i386 build

./configure --disable-debug --enable-static --enable-version3 --enable-gpl --enable-pthreads --enable-memalign-hack --enable-cross-compile --disable-network --enable-runtime-cpudetect --disable-doc --cc=/Applications/Xcode4.5.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc
--as='gas-preprocessor/gas-preprocessor.pl /Applications/Xcode4.5.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc' --sysroot=/Applications/Xcode4.5.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk
--extra-ldflags=-L/Applications/Xcode4.5.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk/usr/lib/system --target-os=darwin --arch=i386 --cpu=i386 --extra-cflags='-arch i386' --extra-ldflags='-arch i386'

文件iosSimPack.bat

# copy out the i386 libs

rm -rf ./build/i386

mkdir ./build/i386

cp -f ./libavcodec/libavcodec.a ./build/i386/libavcodec.a

cp -f ./libavdevice/libavdevice.a ./build/i386/libavdevice.a

cp -f ./libavfilter/libavfilter.a ./build/i386/libavfilter.a

cp -f ./libavformat/libavformat.a ./build/i386/libavformat.a

cp -f ./libavutil/libavutil.a ./build/i386/libavutil.a

cp -f ./libswscale/libswscale.a ./build/i386/libswscale.a

打包资源,生成通用的.a文件

文件iosUniversalPack.bat

# make fat (universal) libs

lipo -output ./build/libavcodec.a -create \

-arch armv6 ./build/armv6/libavcodec.a \

-arch armv7 ./build/armv7/libavcodec.a \

-arch i386 ./build/i386/libavcodec.a

lipo -output ./build/libavdevice.a -create \

-arch armv6 ./build/armv6/libavdevice.a \

-arch armv7 ./build/armv7/libavdevice.a \

-arch i386 ./build/i386/libavdevice.a

lipo -output ./build/libavfilter.a -create \

-arch armv6 ./build/armv6/libavfilter.a \

-arch armv7 ./build/armv7/libavfilter.a \

-arch i386 ./build/i386/libavfilter.a

lipo -output ./build/libavformat.a -create \

-arch armv6 ./build/armv6/libavformat.a \

-arch armv7 ./build/armv7/libavformat.a \

-arch i386 ./build/i386/libavformat.a

lipo -output ./build/libavutil.a -create \

-arch armv6 ./build/armv6/libavutil.a \

-arch armv7 ./build/armv7/libavutil.a \

-arch i386 ./build/i386/libavutil.a

lipo -output ./build/libswscale.a -create \

-arch armv6 ./build/armv6/libswscale.a \

-arch armv7 ./build/armv7/libswscale.a \

-arch i386 ./build/i386/libswscale.a

(2)进行编译流程

以armv7为例,

先运行./iosArmv7Build.bat,如果该文件没有运行权限,先运行chmod 777 iosArmv7Build.bat,其他文件相同

运行make clean,

运行make,编译成功

运行make install,安装之后在/usr/local/ffmpeg会看到有三个目录(lib 动态链接库位置,include 编程要用到头文件,bin 执行文件所在的目录)

(3) 进行make操作出现的问题

xCode4.3和xCode4.5环境下make的路径配置,因为新版xcode是直接拖app进行安装,而不是装到系统目录,因此make文件也没有装到系统目录下,需要增加link命令,以xcode4.5为例

ln -s /Applications/Xcode4.5.app/Contents/Developer/usr/bin/make /usr/bin/make

ln -s /Applications/Xcode4.5.app/Contents/Developer/usr/bin/ar /usr/bin/ar

ln -s /Applications/Xcode4.5.app/Contents/Developer/usr/bin/ranlib /usr/bin/ranlib

(4)在编译armv6和armv7的静态库的时候,把asm打开,就会报错,错误为ERROR: .endm without .macro at /usr/local/bin/gas-preprocessor.pl line 80, <ASMFILE> line 53

和网络上大部分人出现的是一样的,可是我用网络上的解决方法,老版本的libavcodec/arm/asm.S和libavcoec/arm/dsputil_arm.S覆盖新版本,重新编译,却无法解决该问题,只好采用--disable-asm的配置先把asm关闭了

3 使用FFMpeg

(1)iFrameExtractor Sample测试

用xcode打开iFrameExtractor.xcodeproj,现在编译会出错,需要修改几个地方:

左边选中工程,中间选中target,右面选中Build settings,在Architectures选项卡里面选择Architetures为Optimized(armv7),Base SDK为Latest iOS Valid Architectures填写armv7.

编译目标选择iOS Device,当然,如果有连接电脑的设备,可以选择设备.

编译,提示:

Undefined symbols for architecture armv7:

"_BZ2_bzDecompressInit", referenced from:

_matroska_decode_buffer in libavformat.a(matroskadec.o)

"_BZ2_bzDecompressEnd", referenced from:

_matroska_decode_buffer in libavformat.a(matroskadec.o)

"_BZ2_bzDecompress", referenced from:

_matroska_decode_buffer in libavformat.a(matroskadec.o)

添加库libbz2.1.0.dylib,再次编译,OK通过.

(2)加载视频文件播放

调用流程基本看文档,查资料都能找到,基础接口就是avformat_open_input

(3)加载视频内存块播放

加载内存需要注意一个地方:aviod_alloc_context接口中,第三个参数要用0,用1的话,在调用接口avformat_find_stream_info的时候,内存块数据会转换失败,而且前面调用都是成功的,这个问题比较难查到
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: