全部!
我知道,这里有很多关于 iOS 上的 FFMPEG 的问题,但没有一个答案适合我的情况:( 当我试图在我的项目中链接 FFMPEG 时,每种情况都会发生一些奇怪的事情,所以请帮助我!
我的任务是为 iOS 编写视频聊天应用程序,它使用 RTMP 协议向自定义 Flash Media Server 发布和读取视频流。
我决定使用 rtmplib,免费的开源库,用于通过 RTMP 流式传输 FLV 视频,因为它是唯一合适的库。
当我开始研究它时出现了很多问题,但后来我明白了它应该如何工作。
现在我可以在我的应用程序的帮助下读取 FLV 视频的实时流(来自 url)并将其发送回频道。
我现在的麻烦是从相机发送视频。据我了解,基本操作顺序应该如下:
使用 AVFoundation,在序列 (Device-AVCaptureSession-AVVideoDataOutput-> AVAssetWriter) 的帮助下,我将其写入文件(如果需要,我可以更详细地描述此流程,但在问题的上下文中并不重要)。此流程对于将来自摄像机的实时视频进行硬件加速转换为 H.264 编解码器是必需的。但它是 MOV 容器格式。(这是完成的步骤)
我读取了每个写入样本的临时文件,并获得了视频数据字节流(H.264 编码,在 QuickTime 容器中)。(这是已经完成的步骤)
我需要将视频数据从 QuickTime 容器格式转换为 FLV。这一切都是实时的。(包 - 包 - 包)
如果我将拥有包含在 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。