热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【iOS开发】编译libx264和带libx264的FFMpeg包

在成功编译FFMpeg之后,调用某些FFMpeg的命令还需要用到libx264,因此需要额外编译libx264并打包在FFMpeg中编译环境:MacOS10.9XCode

在成功编译FFMpeg之后,调用某些FFMpeg的命令还需要用到libx264,因此需要额外编译libx264并打包在FFMpeg中

  1. 编译环境:
    Mac OS 10.9 XCode6.1

  2. libx264的编译
    编译包需要符合arm64、armv7s、armv7、x86_64、i386这几个架构。前面3个是给真机使用的,后面2个是给模拟器使用的。目前使用FFmpeg-iOS-build-script作者写的一键编译脚本只能编译出适用于模拟器的.a包,适用于真机的包还需要自己手动编译。有时间可以研究它的编译脚本源码,添加上手动编译的代码,这里先做一个总结。
    (1)首先到http://www.videolan.org/developers/x264.html 下载最新的libx264源码包,解压之后是一个含snapshot-xxxx的一个文件夹,把它拷贝到随便一个文件夹下,重命名为x264;
    (2)到https://github.com/kewlbear/x264-ios 下载x264的一键编译脚本文件,把它放到跟x264文件夹同级的地方;
    (3)运行脚本./build-x264.sh;
    (4)脚本运行完毕之后,会多出几个文件夹:x264-iOS,scratch-x264,thin-x264。其中x264-iOS是最终的输出,里面有include和lib两个文件夹。lib文件夹里面只有*.a一个文件。如果顺利的话,这个包是一个fat包,是包含了arm64、armv7s、armv7、x86_64、i386这几个架构的,但是在我的机器上,用lipo命令看,只有x86_64、i386这两种架构,具体原因还没有搞清楚。因此我们还需要手动编译arm64、armv7s、armv7的包,继续下一步;
    (5)再拷贝一份源码出来,放到另外一个文件夹下,在命令行中进入这个文件夹;
    (6)编译armv7的包:进入源码的文件夹后,在命令行中输入

CC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
./configure –host=arm-apple-darwin –sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk
–prefix=’build’ –extra-cflags=’-arch armv7’ –extra-ldflags=’-arch armv7 -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/usr/lib/system’
–enable-pic –extra-asflags=’-arch armv7’
注意修改里面的iPhoneOS版本。
如果config成功,命令行会提示可以执行make命令了,先不急着执行make。手动copy 一个新版的gas-preprocessor.pl到extras目录下面。gas-preprocessor.pl我用的是https://git.libav.org/?p=gas-preprocessor.git;a=blob;f=gas-preprocessor.pl;h=44d11178667ece04df993e50023b41155d53582a;hb=HEAD 这个版本,源码1033行,比x264的源码要长很多。
复制完毕后,在命令行中执行make;执行完make之后再执行make install,成功后会发现源码文件夹里面多了一个libx264.a的包,用lipo查看,确实是armv7的架构,把它拷贝出来,重命名为libx264-armv7。
(7)编译armv7s的包。先执行下make clean,清除上一步执行得到的结果。编译armv7s的包与编译armv7的步骤完全一致,只不过配置需要略微修改,且不需要再拷贝gas-preprocessor.pl文件。配置命令如下:

CC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
./configure –host=arm-apple-darwin –sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk
–prefix=’build’ –extra-cflags=’-arch armv7s’ –extra-ldflags=’-arch armv7s -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/usr/lib/system’
–enable-pic –extra-asflags=’-arch armv7s’
同样得到一个libx264.a的包,拷贝出来,重命名为libx264-armv7s。
(8)编译arm64的包,方法同上,配置命令如下:
CC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
./configure –host=aarch64-apple-darwin –sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk
–prefix=’build’ –extra-cflags=’-arch arm64’ –extra-ldflags=’-arch arm64
-L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/usr/lib/system’ –enable-pic –extra-asflags=’-arch arm64’
同样得到一个libx264.a的包,拷贝出来,重命名为libx264-arm64。
(9)此时我们得到了*.a,libx264-armv7.a,libx264-armv7s.a,libx264-arm64.a四个文件,用lipo命令把他们融合成一个包:
lipo -create *.a,libx264-armv7.a,libx264-armv7s.a,libx264-arm64.a -output libx264.a
把生成的libx264.a的包拷贝回x264-iOS/lib中,和include一起,整个x264-iOS当做libx264的output

  1. 编译带x264的ffmpeg包
    拷贝x264-iOS到build-ffmpeg.sh脚本所在目录下,并重命名x264-iOS为fat-x264,清除build-ffmpeg.sh脚本中X264=pwd/fat-x264一行的注释,保存后执行脚本,顺利的话就会跟之前一样生成各个包啦。。相比之前,会多出一个libpostproc.a。

  2. 在项目中使用带x264的ffmpeg以及libx264
    如果直接替换掉原来的FFMPEG .a库,会报编译错误。此时需要加上libx264。把x264-iOS(含头文件和.a)拖到项目中,link framework中加入libx264,user header search path中加入x264-iOS/include的路径,运行就可以了。

转自:http://blog.sina.com.cn/s/blog_47522f7f0102vcbj.html


推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
author-avatar
PrinceVince_820
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有