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

如何构建FFMPEG并将其链接到iOS?,ios,ffmpeg,Ios,Ffmpeg,全部 我知道,这里有很多关于iOS上FFMPEG的问题,但没有一个答案适合我的情况:( 当我试图在我的项目中链接FFMPEG时,每次都会发生一些奇怪的事情,所以请帮帮我 我的任务是为iOS编写视频聊天应用程序,它使用RTMP协议向自定义Flash媒体服务器发布和读取视频流 我决定使用rtmplib,这是一个免费的开源库,用于通过RTMP传输FLV视频,因为它是唯一合适的库 当我开始研究它时,出现了许多问题,但后来我明白了它应该如何工作 现在,在我的应用程序的帮助下,我可以读取FLV视频的实时流(

全部

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

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

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

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

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

我现在的问题是从摄像机发送视频。 据我所知,基本操作顺序如下:

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

  • 我在每次写入样本的情况下读取这个临时文件,并获得视频数据的字节流(H.264编码,在QuickTime容器中)。(这是allready完成的步骤)

  • 我需要将视频数据从QuickTime容器格式转换为FLV格式,并且所有这些都是实时的

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

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

    我想,我需要使用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构建的FFMPEG

    我从github的Midnight Coders下载了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项目中时,它编译得很好(我甚至没有“库是为另一个体系结构编译的”)这样的警告,我可以使用头中的结构,但当我试图从libavformat(av_register_all())调用C函数时,编译器会向我显示错误消息“Symbol”未找到架构armv7:av_寄存器_all”的

    我想,可能lib中没有符号,并试图显示它们:

    root# nm -arch armv6 libavformat.a | grep av_register_all
    00000000 T _av_register_all
    
    现在我被困在这里,我不明白,为什么xCode不能看到这个符号,不能前进

    如果我对从iOS发布RTMP流的流程理解错误,请纠正我,并帮助我构建和链接iOS的FFMPEG


    我有iphone5.1。SDK和xCode 4.2。

    为iOS SDK 5.1编译FFMpeg

    使用AppStore版本的XCode(更改脚本路径)

    这对我有用。还要确保在项目“链接二进制文件与库”中添加以下内容:

  • libz.dylib
  • libbz2.dylib
  • 我还试图在写入.mov文件时从中获取h.264字节流,
    因此,我很高兴在第(2)步中得到任何提示,谢谢:)

    我想为这个问题写一个答案,即使它是旧的,因为没有一个被接受的答案

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

    无论如何,我认为错误的原因是在项目的构建设置中没有给出标题搜索路径

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

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

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

    你知道Xcode是否真的在链接它吗?我想是的,因为它没有显示任何关于库的不正确架构的警告。然而,我不确定。。我怎么能检查呢?我也遇到了同样的问题。有超人可以回答吗?)巴兰,我已经为iOS 5.1制作了正确的构建脚本。SDK和我自己建立的库。现在,我的ffmpeg库工作得很好,但前提是我使用iFrameExtractor项目。当将lib移动到另一个项目(我自己的项目)时,我有相同的错误。。。我曾尝试将项目设置完全设置为与iFrameExtractor中的设置相同,但不起作用。。然而,iFra