【问题标题】:How to build and link FFMPEG to iOS?如何构建 FFMPEG 并将其链接到 iOS?
【发布时间】:2012-07-04 23:21:12
【问题描述】:

全部!

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

我的任务是为 iOS 编写视频聊天应用程序,它使用 RTMP 协议向自定义 Flash 媒体服务器发布和读取视频流。

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

刚开始研究的时候出现了很多问题,后来才明白应该怎么做。

现在我可以在我的应用程序的帮助下读取 FLV 视频的实时流(来自 url)并将其发送回频道。

我现在的麻烦是从相机发送视频。 据我了解,基本操作顺序应该如下:

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

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

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

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

现在,对我来说最复杂的部分是第 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 架构)。 (我使用“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 流的流程理解有误,请纠正我,并帮助我构建和链接 iOS 的 FFMPEG。

我有 iPhone 5.1。 SDK 和 xCode 4.2。

【问题讨论】:

  • 你知道 Xcode 是否真的在链接它吗?
  • 我认为确实如此,因为它没有显示任何关于库不正确架构的警告。但是,我不确定..我该如何检查?
  • 我也遇到了同样的问题。有超人来回答吗??:)
  • Balan,我已经为 iOS 5.1 制作了正确的 build_scripts。 SDK并自己构建了库。现在我的 ffmpeg 库工作正常,但前提是我使用 iFrameExtractor 项目。将 lib 移动到另一个项目(我自己的)时,我遇到了同样的错误...我尝试将项目设置设置为与 iFrameExtractor 中的设置完全相等,但它不起作用..但是,iFrameExtractor 构建良好:) @987654321 @

标签: ios ffmpeg


【解决方案1】:

我想为这个问题写一个答案,即使它很旧,因为没有公认的答案。

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

无论如何,我相信错误原因是因为在您的 PROJECTBuild Settings 中没有提供 Header Search Paths强>.

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

而且我相信您必须链接下面提到的所有三个库,而不仅仅是前两个。

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

【讨论】:

  • 感谢您的回复,这个问题现在对我来说并不重要,但我认为您的回答可能对其他人有所帮助。
【解决方案2】:

为 iOS SDK 5.1 编译 FFMpeg,

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

它对我有用。还要确保将这些“链接二进制文件与库”添加到您的项目中:

  1. libz.dylib
  2. libbz2.dylib

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多