如何build立和链接FFMPEG到iOS?

所有!

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

我的任务是编写用于iOS的video聊天应用程序,该应用程序使用RTMP协议来发布和读取自定义Flash Media Server的videostream。

我决定使用rtmplib,免费的开源库,通过RTMPstream式传输FLVvideo,因为它是唯一合适的库。

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

现在,我可以通过我的应用程序的帮助阅读FLVvideo的实时stream(来自url),并将其发送回频道。

我现在的麻烦是在发送video从相机。 基本的操作顺序,据我所知,应该是以下几点:

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

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

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

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

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

我想,我需要使用ffmpeg lib来转换(libavformat)。 我甚至find了源代码,显示了如何解码MOV文件中的h.264数据包(查看libavformat,我发现可以从字节stream中提取这个数据包,这对我来说更合适)。 完成后,我需要将数据包编码到FLV中(使用ffmpeg或手动添加FLV-headers到h.264数据包,这不是问题,如果我正确的话,很容易)。

FFMPEG具有很好的文档,是非常强大的库,我认为,使用它不会有问题。 但这里的问题是,我不能在iOS项目中工作。

我花了3天阅读文档,stackoverflow和谷歌search“如何build立FFMPEG为iOS”的问题的答案,我想,如果我将再花一个星期试图编译这个库,我的下午会烧我)

我试图使用许多不同的构build脚本和configuration文件,但是当我构buildFFMPEG,我有libavformat,libavcodec等x86架构(即使当我指定armv6构build脚本)。 (我用“lipo -info libavcodec.a”来显示体系结构)

所以我不能build立这个来源,并决定find构buildarmv7,armv6,i386的预构build的FFMPEG。

我已经从github的MidnightCoders下载iOS Comm Lib,它包含使用FFMPEG的例子,它包含avcodec,avformat和另一个FFMPEG库的预build.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()),编译器显示错误消息“符号(s)未find架构armv7:av_register_all”。

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

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

现在我被困在这里,我不明白,为什么xCode不能看到这个符号,并且不能前进。

如果我对从iOS发布RTMPstream的stream程有所了解,请纠正我的错误,并帮助我构build和连接iOS的FFMPEG。

我有iPhone 5.1。 SDK和xCode 4.2。

我虽然要为这个问题写一个答案,即使是老,因为没有接受答案。

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

无论如何,我相信错误的原因,因为没有给您的项目构build设置中的 标题searchpath

你可以做的是,将你的Xcode项目path添加到标题searchpath键,并设置recursion。

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

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

要为iOS SDK 5.1编译FFMpeg,

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

它为我工作。 另外一定要添加到你的项目“链接二进制库”这些:

  1. libz.dylib
  2. libbz2.dylib

我也试图从.mov文件中写入h.264字节stream,所以我会很高兴在步骤(2)有任何提示,谢谢:)