AVPlayerItem失败,AVStatusFailed,错误代码"无法解码"

use*_*293 32 iphone avfoundation ios avplayer

我遇到了一个奇怪的问题,我希望有人可以提供帮助.

在我的iOS应用程序中,我MutableComposition通过组合用户照片库中的视频和应用程序包中的音频文件来创建带有自定义音轨的视频.然后,我使用一个AVPlayerAVPlayerItem使用我制作的自定义视频播放器将视频播放回用户.

每次创建新的合成时,资产,播放器和合成都会被清除,释放,并且它基本上从干净的初始状态开始.

一切正常,直到完成4个成功的视频创建后,每次创建播放器的其他尝试都会失败并出现错误Cannot Decode.如果我正在重新创建的视频相同,与视频的大小/长度无关,或者音频文件与第五次尝试完全失败,就像发条一样无关紧要.一旦失败,它将永远失败!

这很奇怪,因为它只是对同一个视频进行了四次解码而没有任何问题,所以突然间它失败了?所以,如果有人有线索,请告诉我.

one*_*son 74

大家好,我直接从Apple那里得到答案.我使用了我的一个开发人员TSI生​​命线来提出这个问题,我将总结一下这个问题.

AVFoundation允许的并发视频播放器数量有限制.这是由于iOS硬件的限制.当前设备的限制是4名玩家.如果您创建第5个播放器,您将收到"无法解码"错误.它不是AVPlayer或AVPlayerItem实例数量的限制.相反,它是AVPlayerItem与创建"渲染管道"的AVPlayer的关联,并且您仅限于其中的4个.例如,这会导致新的渲染管道:

AVPlayer *player = [AVPlayer playerWithPlayerItem:somePlayerItem];  
// assuming the AVPlayerItem is ready to go with an AVAsset that has been loaded
Run Code Online (Sandbox Code Playgroud)

我也被警告你不能假设你有4个管道可供你使用.另一个App可能正在使用一个或多个.事实上,我已经在iPad上看到过这种情况,但目前尚不清楚哪个应用程序正在使用管道.

所以,你去了,它完全没有记录,但这就是故事.

  • 对于任何有兴趣的人,我已经在tvOS上证实了这个问题.但是,在实践中,我可以在问题出现之前达到大约18个管道.最大计数必须取决于平台/硬件.此外,当我达到极限并且播放失败时,没有错误:没有来自AVKit的日志,也没有任何播放器发出错误(错误属性为零且状态良好). (6认同)
  • 你究竟是怎么解决这个问题的?您是否创建了包含许多项目的玩家并在它们之间切换?您是否在播放每个视频之前创建新的播放器和项目? (2认同)
  • 播放器项目确实会发出错误,但您必须观察播放器项目状态变量的键值,当它更改为 .error 时,您可以打印与播放器项目关联的错误变量。 (2认同)

And*_*ood 7

我在创建4个AVPlayer实例后遇到了相同的错误消息,但我的情况下的修复程序并不完全相同.也许这会帮助遇到这个问题的其他人.

我最终发现,当我认为AVPlayers没有被释放时.就我而言,我正在将AVPlayer View Controller推送到导航控制器上.尽管我一次只创建一个AVPlayer实例,但当视图控制器弹出导航控制器时,它们并没有立即释放.在清理旧的View控制器之前,我很容易达到4个AVPlayer实例.

直到我确定先前的球员被释放,这个问题消失了.为了完成,我发布了AVPlayerItem,AVPlayer,并在释放之前将AVPlayerLayer上的播放器设置为nil.

我不得不怀疑AVPlayer实例是否有一些限制,无意或无意.来自文档的相关信息:https: //developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/02_Playback.html

"多个玩家图层:您可以从单个AVPlayer实例创建任意多个AVPlayerLayer对象,但只有最近创建的此类图层才会在屏幕上显示任何视频内容."


use*_*293 2

好的,我找到了一个解决方案,我希望这对任何可能偶然发现类似问题的人有所帮助。

我的解决方案是在主线程上初始化 AVPlayer 和 AVPlayerItem 的资源,并确保在 playerItem 和播放器对象返回状态为“ReadyToPlay”之前不会创建实际的 AVPlayerLayer。

事实证明,隔离起来很困难,我仍然不知道为什么它在前 4 次有效,但在第 5 次却始终失败。

直到我无法真正包含代码,这不是一行甚至几个函数的问题。这是一个复杂的问题,我一开始就无法隔离。不过还是谢谢你的评论。