当应用程序在渲染过程中进入后台时AVAssetWriter失败

在我的应用程序中,我渲染从用户照片中检索的图像生成的video。 我已经build立了一个AVAssetwriter AVAssetwriterInput有一个AVAssetWriterInputPixelBufferAdaptor。 我能够将从用户库中检索到的ALAsset对象转换为CVPixelBuffers,并将它们添加到video中,然后将video保存为mp4。 将所有图像添加到video是在后台线程上完成的,后台线程每帧发送一个通知给主线程,因此可以更新接口。 所有这一切运作良好,我从应用程序中获得一个可用的电影文件。

我现在的问题是,当用户进入另一个应用程序,再次成为活动后,ALAssetWriter的状态更改为“失败”,我不能再添加更多的图像到电影文件。 首先,我想我可能不得不结束当前的作者会议,并重新打开一个新的,一旦应用程序再次变得活跃,但似乎没有帮助。

我只是想知道,如果我希望用户input其他应用程序,一般的方法是如何。 最好的解决办法是,如果渲染可以在后台继续。 我想我需要从UIApplication的后台线程。 但现在我很高兴,如果渲染可能会继续后,恢复我的应用程序。

我现在不会发布任何代码,因为它真的很多,我的问题可能是概念性的。 如果您需要查看代码,我会发布它。

编辑1:在iOS 4.3和iOS 5上testing。我已经看到了其他应用程序,如iTimelapse背景渲染,但我不知道他们使用的框架。

编辑2:我现在有一个苹果devforum成员的信息,AVAssetWriter不能在后台工作。 那么有没有其他框架能够呈现快速video?

原来,AVAssetWriter只是不能幸免于被暂停的应用程序。 您可以通过请求后台时间添加额外的10分钟的渲染时间,但之后AssetWriter将失败。 如果您在手机上使用某些服务,也是如此。 例如拨打或接听电话将使AVAssetWriter失败。

如果在你的应用程序在后台进行任何OpenGL调用,那么这将解释这种行为,看起来相当可能。 从OpenGL ES指导手册

后台应用程序可能不会执行graphics硬件上的命令

如果OpenGL ES应用程序尝试在graphics硬件上执行OpenGL ES命令,则它将被终止。 这不仅是指在应用程序处于后台时对OpenGL ES的调用,而且还指先前提交的尚未完成的命令。 防止后台应用程序处理OpenGL ES命令的主要原因是使graphics处理器完全可用于最前面的应用程序。 最前面的应用程序应该总是给用户带来很好的体验。 允许后台应用程序占用graphics处理器可能会阻止这种情况发生。 您的应用程序必须确保之前提交的所有命令在移动到后台之前已经完成。

文档继续列举了一系列进入后台/前台应用程序委托callback的准则。 我认为find一种不使用graphics硬件的方法来实现渲染是非常棘手的,而允许mp4编码的框架(如ffMpeg )主要是GPL / LGPL,因此,如果处理商业产品(LGPL意味着你需要小心可以dynamic链接到库,而不是静态的,这在iOS上是无用的),因为许可证会传播到您的代码。