编译IOS下的FFMpeg

来源:互联网 发布:焊接机器人编程及应用 编辑:程序博客网 时间:2024/04/29 09:36

参考了网络上的各种文档,博客,整理如下:

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的时候,内存块数据会转换失败,而且前面调用都是成功的,这个问题比较难查到

 

原创粉丝点击