应用程序在渲染期间进入背景时,AVAssetWriter失败

时间:2011-10-03 16:48:43

标签: objective-c ios video-processing

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

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

我只是想知道当我希望用户输入其他应用程序时的一般方法。如果渲染可以在后台继续,那么最好的解决方案就是。我想我需要UIApplication的后台线程。但是现在我很高兴,如果渲染可以在恢复我的应用程序后继续。

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

编辑1: 在iOS 4.3和iOS 5上测试过。我在其他应用程序(如iTimelapse)上看过后台渲染,但我不确定他们使用的是哪些框架。

EDIT2: 我现在有一个苹果devforum成员的信息,AVAssetWriter在后台不起作用。那么还有其他任何能够呈现快速视频的框架吗?

2 个答案:

答案 0 :(得分:5)

事实证明,AVAssetWriter无法在暂停的应用程序中存活。您可以通过请求后台时间添加额外10分钟的渲染时间,但之后AssetWriter会失败。如果您在手机上使用某些服务,也会发生相同情况例如,拨打或接听电话也会使AVAssetWriter失败。

答案 1 :(得分:1)

如果您的应用在后台进行任何OpenGL调用,那么这可以解释这种行为,看起来很可能。来自OpenGL ES Pragramming Guide

  

后台应用程序可能无法在图形硬件上执行命令

     

如果OpenGL ES应用程序尝试执行,则会终止该应用程序   图形硬件上的OpenGL ES命令。这不仅指   当您的应用程序在后台时调用OpenGL ES,   但也指先前提交的尚未命令的命令   完成。防止后台应用程序的主要原因   处理OpenGL ES命令是制作图形处理器   完全可用于最前面的应用程序。最前面的   应用程序应始终为用户提供良好的体验。   允许后台应用程序占用图形处理器可能   防止这种情况您的申请必须确保以前所有   提交的命令在进入之前已经完成   背景

文档继续枚举输入后台/前台应用委托回调的一套指南。我认为找到一种在没有图形硬件的情况下进行渲染的方法会很棘手,而且允许mp4编码的框架(如ffMpeg)主要是GPL / LGPL,因此在处理商业产品时需要小心(LGPL意味着您可以动态链接到库,而不是静态链接,这在iOS上是无用的),因为许可证会传播到您的代码。

相关问题