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

Objective c 当应用程序在渲染过程中进入后台时,AVAssetWriter失败,objective-c,ios,video-processing,Objective C,Ios,Video Processing,在我的应用程序中,我正在渲染从用户照片中检索的图像生成的视频。我已经用AVAssetwriterInput设置了AVAssetwriter,它有一个AvassetWriterInputPixelBufferAdapter。我能够将从用户库检索到的ALAsset对象转换为CVPixelBuffers,并将它们添加到视频中,然后将其保存为mp4。将所有图像添加到视频是在后台线程上完成的,该线程每帧向主线程发送一个通知,因此可以更新接口。所有这些都很有效,我从应用程序中获得了一个可用的电影文件 我现在

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

我现在的问题是,当用户进入另一个应用程序时,在再次激活后,ALAssetWriter的状态变为“失败”,我无法向电影文件添加更多图像。首先,我想我可能必须在writer上结束当前会话,并在应用程序再次激活后重新打开一个新会话,但这似乎没有帮助

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

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

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

编辑2:
我现在有一个apple devforum成员的信息,AVAssetWriter不能在后台工作。那么,有没有其他框架能够呈现quicktime视频呢?

如果在应用程序处于后台时进行了任何OpenGL调用,那么就很可能解释这种行为。从

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

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


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

结果表明,AVAssetWriter无法在应用程序挂起后继续生存。您可以通过请求后台时间来额外添加10分钟的渲染时间,但在此之后AssetWriter将失败。如果您在电话中使用某些服务,也会发生同样的情况。例如,拨打或接听电话也会使AVAssetWriter失败

当应用程序转到后台时,AVAssetWriter是否可能也会断开与它正在编写的文件的连接?谢谢您的想法。我也考虑过这种可能性,但该应用程序实际上并没有被终止。只是在应用程序处于后台后向图像缓冲区添加内容时,AVAssetWriters的状态变为“失败”。即使我在“ApplicationWillEnterBackground”上停止renderprocess并在返回时重新启动它,该进程也会失败。我没有使用任何OpenGL ES调用,我不知道是否有AVFoundation或CoreVideo框架使用。这可能是因为AV工具内置了防止进行OpenGL调用的保护,并检查应用程序是否已进入后台,如果已进入“失败”状态,则进入“失败”状态,而不是完全关闭应用程序。我不明白为什么在应用程序重新进入前台后会再次失败。您是否创建新的AV对象?(可能一旦失败,他们就无法摆脱那种状态)。事实上,我不使用新的AV对象。当重新进入前台时,AssetWriter的状态仍然正常。在应用前景化后,我添加另一个pixelbuffer后,它就会失败。你有什么解决方案吗?