【问题标题】:Access to the iOS' video decoder?访问 iOS 的视频解码器?
【发布时间】:2011-04-05 18:45:30
【问题描述】:

iPad/iOS 支持视频流,例如H.264 使用 MPMoviePlayerController 等,但我通过自定义、专有的流接收 H.264 数据,需要在软实时场景中对其进行解码。
是否可以通过任何方式访问 iPad/iOS 的视频解码器来解码这些数据?

更新: 显然是 iOS 4.0 核心媒体框架 supports decoding frames 并且知道 H.264,但是没有示例代码,我也看不到我实际上应该调用什么来进行实际解码.


更新(十年后!)

对于在此处使用谷歌搜索的任何人,这些天您可以在 iOS 中使用“VideoToolbox”进行此操作。


【问题讨论】:

  • AVAssets 还不支持流式传输。似乎低级的核心媒体框架是值得一看的地方。 H.264 编解码器在那里定义,这是一个好兆头,并且有块缓冲结构,您不必将整个资产存储在内存或磁盘上。我想查看其中任何部分的代码,尤其是样本缓冲区与图层协调或捕获的部分。
  • @Peter:谢谢,这看起来更有希望。它似乎应该支持解码到CVImageBuffer,但我并没有真正看到实际解码的功能。
  • MoviePlayer 演示对您没有帮助吗? developer.apple.com/iphone/library/samplecode/…
  • @karl:这只是将 URL 传递给高级类,这意味着它必须是特定类型的流。我有一个自定义、非标准的流,我通过它接收电影样本并需要对这些样本进行解码。
  • 您找到了适合这个问题的解决方案吗?我也希望实现类似的目标。

标签: iphone ipad video-streaming


【解决方案1】:

2019

有两种解决方案

  1. “手动”执行,这意味着使用 AVFoundation,尤其是 VideoToolbox。

要开始,你基本上从https://developer.apple.com/videos/play/wwdc2014/513/开始享受!

不得不说,这确实是“正确且更好”的解决方案。

  1. 如果您可以让 ffmpeg-api 在您的 iOS 应用程序中运行,您可以使用 ffmpeg,FFmpeg 会在经过一番摆弄后进行硬件解码。

有很多方法可以开始。 (一个绝对令人惊叹的新事物是 sunlubo 制作的 SWIFT ffmpeg:https://github.com/sunlubo/SwiftFFmpeg

请注意“ffmpeg”方法,简而言之,ffmpeg / iOS 存在许多法律/许可问题。人们可以搜索和阅读这些问题。

但是在技术方面,现在确实可以将 ffmpeg 直接编译到 iOS 中,并在您的 iOS 代码中使用它。 (使用 C 库可能是最简单的。)

我们刚刚做了一个巨大的项目来做这件事,以及其他方法。 (我再也不想看到FFmpeg了!)

实际上可以在 iOS 中使用 FFmpeg 实现实际的硬件解码

我们发现它非常繁琐。并且需要在 FFmpeg 中修补几个错误。 (我希望我再也见不到videotoolbox.c:/)

所以你在 iOS 中的两个硬件解码选项是

  1. “手动”完成 AVFoundation/VideoToolbox。

  2. 使用 FFmpeg。

第 2 项非常繁琐,而且耗费大量时间。第 1 项使用大量时间。艰难的选择:/

【讨论】:

  • 这个使用 ffmpeg 的建议在几个方面都失败了。首先,许可证。大多数公司不希望将 LGPL 或 GPL 代码链接到应用程序中。二是运行时性能。 ffmpeg 代码是 C 代码,比 iOS 设备内置的硬件要慢得多。
  • 嗨@MoDJ - 关于许可,嗯,你读过关于许可的段落吗? :)
  • 嗨@MoDJ - 关于性能。当然,您使用硬件解码(即在 FFmpeg 中)。在 iOS 上,我们发现确保 FFmpeg 确实使用硬件解码非常繁琐。
【解决方案2】:

在 iOS 8 中,您可以使用视频工具箱 (https://developer.apple.com/reference/videotoolbox) 将 H264 解码为原始帧。 VT API 是硬件加速的,与 libavcodec 相比,将为您提供更好的性能。如果要播放帧或生成预览,可以使用基于 eagl 的渲染器进行播放。我编写了一个示例应用程序来将帧从 raw 编码为 h.264 (https://github.com/manishganvir/iOS-h264Hw-Toolbox)。 h.264 到 raw 应该没那么难!

【讨论】:

  • 一件事,这些天你可以,如果你挣扎,让 ffmpeg 在 iOS 上进行硬件解码。
  • 这是一个很棒的示例应用程序。我相信它实际上是地球上唯一一个真正让 VT 在 iOS 上工作的例子。太棒了!
  • 存在许多 VideoToolbox 示例应用程序,这里有一个用于无缝循环高清内容的应用程序。 github.com/mdejong/H264SeamlessLooping
【解决方案3】:

在向 Apple DTS 提出问题后,事实证明目前无法解码来自自定义流源的视频数据。

我将为此提交增强请求。

【讨论】:

  • 增强请求是否向公众开放?我想投票给它:)
  • @Gili:不,但您也可以就此提出错误/增强请求。
  • 嗨,乔治。我知道从那时起已经过去了相当长的一段时间,但是对于这个问题仍然没有很好的答案。如果有任何使用自定义流源的方法,您能否分享一下?谢谢一百万!
【解决方案4】:

如果你仍然遇到问题,我建议你看看 libavcodec 来解码数据(在ffmpeg project 上可用)。

dranger 上有很棒的 ffmpeg 教程,其中展示了如何正确解码(通过 libavcodec)和显示视频数据(使用 libsdl)等等。

【讨论】:

  • 此时我并没有在寻找替代品,但无论如何谢谢。
  • 有趣。但是,libavcodec 是 LGPL,所以据我了解,不能将它用于商业 iOS 应用程序(因为它需要静态链接)。还是我误解了什么?
  • 这个fine thread 讨论了一些问题。
  • 将 ffmpeg 库链接到您的 iOS 应用程序中存在一些真正的法律问题,只是将其称为“框架”并不会改变任何事情。请参阅multinc.com/2009/08/24/… 了解更多信息。 ffmpeg 在服务器或桌面上运行良好,但它不是链接到 iOS 应用程序的解决方案。
  • 这些天(2019 年),将 ffmpeg 编译到 iOS 中确实有效(在读取某些流时存在一些技术问题)。但是是的,法律问题仍然存在。
【解决方案5】:

您是否尝试过将从协议接收到的 H.264 流写入您不断附加到的临时文件中,然后在写入足够的字节以避免缓冲播放后,将临时文件的 url 传递给 MPMoviePlayerController ?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2010-11-07
    • 2018-01-19
    • 2021-08-17
    相关资源
    最近更新 更多