如何构建FFMPEG并将其链接到iOS?

时间:2012-07-04 12:42:13

标签: ios ffmpeg

一切!

我知道,这里有很多关于iOS上的FFMPEG的问题,但没有一个答案适合我的情况:( 当我试图在我的项目中链接FFMPEG时,每种情况都会发生奇怪的事情,所以请帮助我!

我的任务是为iOS编写视频聊天应用程序,该应用程序使用RTMP协议发布和从自定义Flash Media Server读取视频流。

我决定使用rtmplib,免费的开源库,通过RTMP传输FLV视频,因为它是唯一合适的库。

当我开始研究它时出现了很多问题,但后来我明白它应该如何运作。

现在我可以在我的应用程序的帮助下阅读FLV视频的直播流(来自网址)并将其发送回频道。

我现在的麻烦在于从相机发送视频。 据我所知,基本操作顺序应如下:

  1. 使用AVFoundation,在序列的帮助下(Device-AVCaptureSession-AVVideoDataOutput-> AVAssetWriter)我把它写到一个文件中(如果需要,我可以更详细地描述这个流程,但是在问题的上下文中这不重要)。此流程是将实时视频从摄像机硬件加速转换为H.264编解码器所必需的。但它是MOV容器格式。 (这是完成的步骤)

  2. 我在写入每个样本时读取此临时文件,并获取视频数据的字节流(H.264编码,在QuickTime容器中)。 (这已经完成了步骤)

  3. 我需要将视频数据从QuickTime容器格式转换为FLV。这一切都是实时的。(逐包)

  4. 如果我将拥有FLV容器格式的视频数据包,我将能够使用rtmplib通过RTMP发送数据包。

  5. 现在,对我来说最复杂的部分是第3步。

    我认为,我需要使用ffmpeg lib进行此转换(libavformat)。我甚至找到了源代码,展示了如何解码来自MOV文件的h.264数据包(在libavformat中查找,我发现甚至可以从字节流中提取这些数据包,这对我来说更合适)。完成后,我将需要将数据包编码为FLV(使用ffmpeg或手动,以一种方式将FLV标头添加到h.264数据包,这不是问题,如果我是正确的话很容易)。

    FFMPEG有很棒的文档,是非常强大的库,我认为使用它不会有问题。但问题是我无法在iOS项目中使用它。

    我花了3天时间阅读文档,stackoverflow并在关于“如何为iOS构建FFMPEG”的问题上搜索答案,我想,如果我再花一周时间试图编译这个库,我的PM会解雇我:))

    我尝试使用许多不同的构建脚本并配置文件,但是当我构建FFMPEG时,我获得了x86架构的libavformat,libavcodec等(即使我在构建脚本中指定了armv6 arch)。 (我用“lipo -info libavcodec.a”来展示架构)

    所以我无法构建这些资源,并决定找到预构建的FFMPEG,即为体系结构armv7,armv6,i386构建。

    我从github下载了来自MidnightCoders的iOS Comm Lib,它包含使用FFMPEG的示例,它包含avcodec,avformat和另一个FFMPEG库的预构建.a文件。

    我检查他们的架构:

    iMac-2:MediaLibiOS root# lipo -info libavformat.a
    Architectures in the fat file: libavformat.a are: armv6 armv7 i386 
    

    我发现它适合我! 当我试图将这些库和标题添加到xCode项目时,它编译得很好(我甚至没有像“为另一个架构编译库”这样的警告),我可以使用标题中的结构,但是当我尝试调用C时函数来自libavformat(av_register_all()),编译器显示错误消息“找不到架构armv7的符号:av_register_all”。

    我想,也许lib中没有符号,并试图展示它们:

    root# nm -arch armv6 libavformat.a | grep av_register_all
    00000000 T _av_register_all
    

    现在我被困在这里,我不明白,为什么xCode看不到这个符号,也无法前进。

    如果我对从iOS发布RTMP流的流程有所了解,请纠正我,并帮助我构建和链接FFMPEG for iOS。

    我有iPhone 5.1。 SDK和xCode 4.2。

2 个答案:

答案 0 :(得分:1)

我虽然为这个问题写了一个答案,即使它已经老了,因为没有接受的答案。

根据问题中给出的解释,我认为他能够准确地编译FFmpeg的来源。如果有人害怕这样做,那么已经编译好的版本可以从here下载。

无论如何,我认为错误原因是因为 PROJECT 构建设置 强>

您可以做的是,将您的Xcode项目路径添加到Header Search Paths键并将其设置为递归。

我相信你必须把下面提到的所有三个图书馆联系起来,而不仅仅是前两个图书馆。

  • libz.dylib
  • libbz2.dylib
  • libiconv.dylib

答案 1 :(得分:0)

编译适用于iOS SDK 5.1的FFMpeg,

使用AppStore版本的XCode(更改脚本路径),You can use this script

它对我有用。另外一定要添加到项目“Link Binary with libraries”这些:

  1. libz.dylib
  2. libbz2.dylib
  3. 我也试图在写入时从.mov文件中获取h.264字节流, 所以我很高兴在步骤(2)有任何提示,谢谢:)