为iOS编译FFmpeg静态库
为iOS编译FFmpeg静态库
环境:OS X Yosemite (版本10.10.5)
Xcode (Version 7.1.1 (7B1005))
一、资料准备:
(1)ffmpeg源码:https://github.com/FFmpeg/FFmpeg.git(也可以不用提前下载,在运行脚本的时候由脚本下载,这样脚本下载的话会花费很多时间, 提前下载会节约不少时间)。
(2)yasm1.3.0:http://yasm.tortall.net/Download.html()
(3)编译脚本: https://github.com/kewlbear/FFmpeg-iOS-build-script.git
(4)gas-preprocessor:
https://github.com/libav/gas-preprocessor.git
二、配置与编译:
(1)Xcode:选择命令行工具

(2)安装gas-preprocessor:
<1>将gas-preprocessor.pl 分别拷贝到:/usr/bin 和/usr/local/bin
<2>修改gas-preprocessor.pl的读写权限:使用终端进入相关目录,输入以下命令。chmod +x gas-preprocessor.pl
(3)安装yasm:经典三部曲^_^
利用终端进入yasm的目录
<1>./configure
<2> make
<3> sudo make install
(4)配置ffmpeg:经典三部曲
利用终端进入ffmpeg目录
<1>./configure
<2> make
<3> sudo make install
(5)运行编译脚本
<1>把下载的ffmpeg拷贝到编译脚本目录中

<2> 利用编译脚本编译ffmpeg:
首先加入目标指令集。用编辑软件(如UltraEdit)打开build-ffmpeg.sh文件,找到ARCHS="arm64 armv7 x86_64 i386"这一行文字,在ARCHS中加入你需要的目标指令集。我这里面加入了arm64 armv7 x86_64 i386这四个指令集,则运行后生成的静态库也只会支持这四个指令集。
然后利用终端进入脚本目录,输入命令:
sh build-ffmpeg.sh(生成适用于指定命令集armv7 arm64 x86_64 i386的静态库)
如果只想生成针对某一个指令集的静态库则可以使用下面的指令
build-ffmpeg.sh arm64(只生成arm64的静态库)
build-ffmpeg.sh armv7 x86_64(生成armv7 arm64的静态库)
注意:若只针对不同的指令集分别单独生成了对应的静态库,如果在使用的时候想支持多个指令集那么就需要使用lipo命令把对应指令集的静态库合并成一个库。
具体使用请参考:https://github.com/kewlbear/FFmpeg-iOS-build-script。
三、使用
编译完成后的目录是这个样子

注:config.h文件不是编译生成的,是我从ffmpeg中拖出来的,因为在编译的过程我遇到了Out of tree builds are impossible with config.h in source dir这个问题。
把FFmpeg-iOS整个文件拖到你的项目中。因为我编译完成是用在kxmovie当中的,所以依赖的库有:

四、可能出现的问题:
(1)GNU assembler not found, install gas-preprocessor
在编译的过程中,如果你把gas-preprocessor.pl文件分别拷贝到/usr/bin和/usr/local/bin下,并且也修改了该文件的读写权限,仍然出现这个问题。那么请运行下面的指令,修改编译路径
PATH=$PATH: /usr/bin/gas-preprocessor.pl
PATH=$PATH: /usr/local/bin/gas-preprocessor.pl
(2) Out of tree builds are impossible with config.h in source dir
删除ffmpeg 下面的config.h重新编译就可以了
(3)拖入编译好的库,在运行项目的时候如果遇到下面两个问题
问题:Undefined symbols for architecture armv7:
解决方法:导入 libz.tbd
问题:Undefined symbols for architecture arm64
解决方法:导入 libbz2.tbd
五、参考资料
http://www.cnblogs.com/smileEvday/p/ffmpeg.html
http://www.cnblogs.com/wyymaomi/articles/3643606.html
http://blog.csdn.net/cmsbupt/article/details/9962845
http://blog.csdn.net/oqqquzi1234567/article/details/43152689
为iOS编译FFmpeg静态库的更多相关文章
- 【转】iOS编译OpenSSL静态库(使用脚本自动编译)
原文网址:https://www.jianshu.com/p/651513cab181 本篇文章为大家推荐两个脚本,用来iOS系统下编译OpenSSL通用库,如果想了解编译具体过程,请参看<iO ...
- Windows 系统 vs2012 MinGW 编译ffmpeg 静态库
Windows系统下 vs2012编译ffmpeg 动态库 前面已经有文章讲述,本文将讲述如果编译生成ffmpeg静态库以方便 在vs2012下调用. 准备工作:安装MinGW环境,修改ffmpeg配 ...
- iOS开发中静态库之".framework静态库"的制作及使用篇
iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...
- iOS开发中静态库制作 之.a静态库制作及使用篇
iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...
- iOS编译FFmpeg、kxmovie实现视频播放 (转载)
由于FFmpeg开源框架的功能非常强大,可以播放的视频种类很多,同时添加第三方库kxmovie,实现视频播放,真的是爽爆了,因此今天来说一下关于FFmpeg在iOS手机上的一些配置过程,配置工具,还有 ...
- iOS开发之静态库(五)—— 图片、界面xib等资源文件封装到静态框架framework
编译环境:Macbook Air + OS X 10.9.2 + XCode5.1 + iPhone5s(iOS7.0.3) 一.首先将资源文件打包成bundle 由于bundle是静态的,所以可以将 ...
- 解决QZ-SDK静态库libRPToolLib.a中avfoundation.o文件和kxMovie依赖的ffmpeg静态库libavdevice.a函数重复定义的问题
解决QZ-SDK静态库libRPToolLib.a中avfoundation.o文件和kxMovie依赖的ffmpeg静态库libavdevice.a函数重复定义的问题 在原来项目中导入全志v3相机的 ...
- 使用CMake编译跨平台静态库
在开始介绍如何使用CMake编译跨平台的静态库之前,先讲讲我在没有使用CMake之前所趟过的坑.因为很多开源的程序,比如png,都是自带编译脚本的.我们可以使用下列脚本来进行编译: . / con ...
- 基于ffmpeg静态库的应用开发
最近几天在试着做基本ffmpeg静态库的开发,只有main中包含了avdevice_register_all 或avfilter_register_all,编译就通不过,undefined refre ...
随机推荐
- 面试题:JVM在Java堆中对对象的创建、内存结构、访问方式
一.对象创建过程 1.检查类是否已被加载 JVM遇到new指令时,首先会去检查这个指令参数能否在常量池中定位到这个类的符号引用,检查这个符号引用代表的类是否已被加载.解析.初始化,若没有,则进行类加载 ...
- golang 条件语句 for range 分析
for range 作为 golang中的语法糖提供了便利操作; 对于for range 支持 的数据类型包含: 数组以及指向数组的指针 切片 字典 通道 字符串 在range的语法糖中提供了一下特殊 ...
- java.lang.NoSuchMethodError: org.springframework.util.Assert.isTrue(ZLjava/util/function/Supplier;)V
spring-data-redis 2的版本只支持spring5和spring boot2+,建议降低spring-data-redis版本 <!-- redis --> <depe ...
- 使用PyCharm引入需要使用的包
在学习python的时候,被推荐了使用PyCharm这款IDE,但是经常在已经pip安装第三方包的时候import包的时候却发生了问题- -无法引入. 进行模块的加载,百度之后,了解到,在这款IDE中 ...
- django 3.1 序列化讲述
序列化Django对象¶ Django的序列化框架提供了一种将Django模型"翻译"为其他格式的机制.通常,这些其他格式将基于文本,并用于通过电线发送Django数据,但是序列化 ...
- Go 数组&切片
数组相关 在Go语言中,数组是一种容器相关的数据类型,用于存放多种相同类型的数据. 数组定义 在定义数组时,必须定义数组的类型以及长度,数组一经定义不可进行改变. 同时,数组的长度是按照元素个数进行统 ...
- JavaFX ComboBox的选中事项
参考1:https://blog.csdn.net/mexel310/article/details/37909205 参考2:https://blog.csdn.net/maosijunzi/art ...
- python 中的三种等待方式
为什么要用等待时间: 今天在写App的自动化的脚本时发现一个元素,但是往往执行脚本是报错( An element could not be located on the page using the ...
- Java安全之Commons Collections1分析(一)
Java安全之Commons Collections1分析(一) 0x00 前言 在CC链中,其实具体执行过程还是比较复杂的.建议调试前先将一些前置知识的基础给看一遍. Java安全之Commons ...
- kalilinux2020.3的安装与一些坑
1.下载镜像文件.iso kali官方下载太慢,用一些魔法也是不行,这里推荐用国内的下载源. 阿里云: https://mirrors.aliyun.com/kali-images/?spm=a2c6 ...