ios - 如何建立FFMPEG并将其链接到iOS?

标签 ios ffmpeg

所有!

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

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

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

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

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

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

  • 使用AVFoundation,并借助序列(Device-AVCaptureSession-AVVideoDataOutput-> AVAssetWriter),将其写入文件中(如果需要,我可以更详细地描述此流程,但在有问题的情况下并不重要)。该流程对于将实时视频从摄像机到H.264编解码器的硬件加速转换是必需的。但是它是MOV容器格式。 (这是完成的步骤)
  • 我阅读了写入每个示例的此临时文件,并获得了视频数据字节流(在QuickTime容器中为H.264编码)。 (这是已经完成的步骤)
  • 我需要将视频数据从QuickTime容器格式转换为FLV。而且这都是实时的。(分组-分组)
  • 如果我将以FLV容器格式包含视频数据包,则可以使用rtmplib通过RTMP发送数据包。

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

    我认为,我需要使用ffmpeg lib进行这种转换(libavformat)。我什至找到了源代码,显示了如何从MOV文件中解码h.264数据包(在libavformat中看,我发现甚至可以从字节流中提取此数据包,这对我来说更合适)。完成此操作后,我将需要将数据包编码为FLV(使用ffmpeg或手动将FLV标头添加到h.264数据包中,如果我是正确的话,这不是问题,而且很容易)。

    FFMPEG具有出色的文档和非常强大的库,我认为使用它不会有问题。但是这里的问题是我无法在iOS项目中正常工作。

    我已经花了三天的时间阅读文档,stackoverflow和搜索“如何为iOS构建FFMPEG”问题的答案,我想,如果我再花一周的时间来尝试编译此库,我的PM将会激怒我:))

    我试图使用许多不同的构建脚本并配置文件,但是当我构建FFMPEG时,我得到了针对x86体系结构的libavformat,libavcodec等(即使在构建脚本中指定了armv6 arch)。 (我使用“lipo -info libavcodec.a”显示体系结构)

    因此,我无法构建此源,因此决定查找预构建的FFMPEG,该文件是为架构armv7,armv6,i386构建的。

    我已经从github的MidnightCoders下载了iOS Comm Lib,它包含使用FFMPEG的示例,它包含avcodec,avformat的预建.a文件和另一个FFMPEG库。

    我检查他们的架构:
    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())中的-function函数,编译器会向我显示错误消息“找不到体系结构armv7的符号:av_register_all”。

    我以为,也许lib中没有符号,并试图显示它们:
    root# nm -arch armv6 libavformat.a | grep av_register_all
    00000000 T _av_register_all
    

    现在我被困在这里,我不明白,为什么xCode看不到这个符号,也无法前进。

    如果我对从iOS发布RTMP流的流程理解不正确,请纠正我,并帮助我建立和链接FFMPEG for iOS。

    我有iPhone 5.1。 SDK和xCode 4.2。

    最佳答案

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

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

    无论如何,我相信是由于未在 PROJECT 构建设置中提供标头搜索路径而导致的错误原因。

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

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

  • libz.dylib
  • libbz2.dylib
  • libiconv.dylib
  • 关于ios - 如何建立FFMPEG并将其链接到iOS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11329346/

    相关文章:

    css - 如何将像素或点单位映射到 ffmpeg 字体/文本大小

    asp.net - 使用 ASP.NET JQuery 在 MedisElement 中显示大型视频文件的问题

    python - FFmpeg concat demuxer 不工作 : No error, 并且没有输出

    java - UIImage,Android 中的 imageWithData?

    iOS 多任务处理 : let a stream play when the app is in the tray

    c++ - 当从 NSMutableString 中删除 UTF8 表情符号字符时,到 std::string 的转换失败

    ios - 位码iOS App, App Store上的Size

    ffmpeg - ffmpeg 和 libvpx 转换为 webm 时出错

    python - python 2.7中的FFMPEG文件编写器

    ios - 使组合直通发布者不那么全局化