4

全部!

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

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

我决定使用 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。

4

2 回答 2

2

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

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

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

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

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

  • libz.dylib
  • libbz2.dylib
  • libiconv.dylib
于 2015-06-30T13:01:13.407 回答
0

要为 iOS SDK 5.1 编译 FFMpeg,

使用 XCode 的 AppStore 版本(更改脚本路径),您可以使用此脚本

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

  1. libz.dylib
  2. libbz2.dylib

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

于 2012-07-29T12:10:36.137 回答