iOS的视频解码器访问权限?

25

iPad/iOS支持使用MPMoviePlayerController等方式对H.264进行视频流播放,但我通过自定义专有流接收H.264数据,并需要在软实时场景下进行解码。
iPad/iOS的视频解码器能否以任何方式访问以解码此数据?

更新: 显然,iOS 4.0 Core Media框架支持解码帧并知道H.264,但没有示例代码,我也无法看到实际应该调用什么进行解码。


更新(十年后!)

对于任何在这里搜索的人,现在在iOS中可以使用"VideoToolbox"来实现此功能。



1
AVAssets目前还不支持流式传输。看起来低级别的Core Media Framework是需要查找的地方。H.264编解码器在那里被定义,这是一个好迹象,并且有块缓冲结构,您不必将整个资产存储在内存或磁盘上。我想看到任何部分的代码,特别是样本缓冲区与图层或捕获协调的部分。 - Peter DeWeese
@Peter:谢谢,看起来更有希望了。它似乎支持解码为CVImageBuffer,但我并不真正明白哪些函数是用于实际解码的。 - Georg Fritzsche
你找到了这个问题的合适解决方案吗?我也在寻求类似的实现。 - Sander
@Sander:目前 - 直到苹果可能开放API - 你必须自己解决。 - Georg Fritzsche
你是如何看待Core Media Framework支持解码帧的?我阅读了你提供的文档,但只找到了压缩帧存储的参考,没有实际解码的内容。 - Cthutu
显示剩余2条评论
5个回答

12
在向苹果的开发技术支持团队反映了此问题后,得知目前没有办法从自定义流媒体源中解码视频数据。我将提出一个增强请求来解决这个问题。

这个增强请求对公众开放吗?我想投票支持它 :) - Gili
@Gili:不,但你可以在这个问题上开一个 bug / enhancement 请求。 - Georg Fritzsche
嗨,乔治。我知道自那时以来已经过了相当长的时间,但仍然没有一个好的答案来回答这个问题。 你能否分享一下是否有使用自定义流源的方法?非常感谢! - Lukasz Czerwinski

6
如果你仍然遇到问题,我建议你查看解码数据的libavcodec(在ffmpeg项目中可用)。
dranger上有很棒的ffmpeg教程,展示了如何正确解码(通过libavcodec)和显示视频数据(使用libsdl),以及其他内容。

我目前并不在寻找替代方案,但还是谢谢你。 - Georg Fritzsche
有趣。然而,libavcodec是LGPL许可的,所以据我理解,不能将其用于商业iOS应用程序(因为它需要静态链接)。或者我有什么误解吗? - Sander
1
这个好帖子讨论了一些问题。 - karlphillip
1
将ffmpeg库链接到iOS应用程序中存在一些真正的法律问题,仅仅称其为“框架”并不能改变任何事情。请参阅http://multinc.com/2009/08/24/compatibility-between-the-iphone-app-store-and-the-lgpl/以获取更多信息。ffmpeg在服务器或桌面上运行良好,但它不是将其链接到iOS应用程序的解决方案。 - MoDJ
现在(2019年),将ffmpeg编译到iOS确实可以使用(但读取某些流时可能会有一些技术问题)。但是,法律问题仍然存在。 - Fattie

4

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 - 关于许可证,你有看到关于许可证的段落吗? :) - Fattie
嗨@MoDJ - 关于性能。当然,您可以使用硬件解码(即在FFmpeg中)。在iOS上,我们发现确保FFmpeg使用硬件解码非常棘手。 - Fattie

2

有一件事,如果你努力,现在可以做到的是,在iOS上让ffmpeg进行硬件解码。 - Fattie
这是一个非常棒的示例应用程序。我相信这实际上是地球上唯一一个有人成功在iOS上使用VT的示例。太神奇了! - Fattie
1
许多VideoToolbox示例应用程序存在,这是一个无缝循环高清内容的示例:https://github.com/mdejong/H264SeamlessLooping - MoDJ

1

你尝试过将从协议接收到的H.264流写入一个临时文件中,然后不断地追加内容,一旦写入足够的字节以避免缓冲播放,就将临时文件的URL传递给MPMoviePlayerController吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接