2013-04-23 71 views
-1

如何继续从图像创建长视频?这需要相当长的时间,用户会觉得无聊等待,所以我想在后台生成电影并在完成后通知用户。iOS在后台任务中生成视频

我的应用程序结构是这样的,我有一个UINavigationController,其中包含模拟电影的一个控制器,只是一些图像与CoreAnimation一起移动。然后我推一个新的控制器来生成电影。在控制器2我发送请求给控制器1发送我的图像与帧写在电影(我生成的图像与CoreGraphics)。这几乎阻塞了一切,因为它需要很长时间并且是连续的。

我阅读了关于后台任务的内容,似乎是唯一的解决方案,但它们不会持续很长时间,可能会停在中间,生成30秒的视频需要大约6分钟。我也不能声明我的应用程序在后台运行,因为它不是VoIP或其他支持的类型。

感谢您的意见。

+0

但这会快速烧毁电池,因为这涉及大量计算和RAM I/O。 – Raptor 2013-04-23 09:05:21

+0

如果生成的电影值得他们使用它,如果不是不。也许可以在速度上做一些改进,现在每帧处理一个图像几次。 – 2013-04-23 10:21:40

回答

1

根据我的理解你可以做到这一点,虽然你的应用程序只能运行有限的时间,但取决于你的视频大小,这可能就足够了。实际上,我在我的动画创作应用idAnimate - Animating on the iPad with the touch of a finger上完成了这个操作。据我所知,该应用程序将被授予约10分钟的时间来完成任务,这可能就足够了。如果您的应用需要额外的时间,您可能需要了解如何优化视频渲染算法,降低视频质量等等。

反正这里是有点怎么我这个假设的代码使用AVAssetWriter生成视频: 首先你要拨打电话获得背景的许可,并提供适合做什么块当你的时间完成(后台任务到期处理):

UIApplication *app = [UIApplication sharedApplication]; 

_backgroundRenderingID = [app beginBackgroundTaskWithExpirationHandler:^{ 
    [app endBackgroundTask:_backgroundRenderingID]; 
    _backgroundRenderingID = UIBackgroundTaskInvalid; 
}]; 

之后,你可以开始渲染视频:

videoWriter = [[AVAssetWriter alloc] initWithURL: 
       [NSURL fileURLWithPath:self.moviePath] fileType:AVFileTypeMPEG4 
              error:&error]; 
NSParameterAssert(videoWriter); 
... 

当你完成确保你让OS知道,您的任务清晰了背景是com成品:

[[UIApplication sharedApplication] endBackgroundTask:_backgroundRenderingID]; 

我希望有所帮助。

+0

谢谢,这是有效的。只需要看看我要做什么,如果这个过程需要10分钟以上,也许会暂停。 – 2013-04-23 10:36:45

+0

不要忘记接受答案,如果它为你工作,以便下一个搜索它的人可以立即知道它的一个很好的解决方案。 – 2013-04-25 08:29:22

+0

是的。顺便说一句,我试过你的应用程序只是为了比较速度,我认为你需要更多地在用户界面上工作,我几乎不知道该怎么做,也无法找到导出功能。今天,我刚完成我的应用程序,并找到了一些提高速度的方法,而不是生成图像,调整大小,翻转,分层和所有这些东西,我只捕获显示在UIView中的结果图像,并且几乎实时更快。允许的10分钟在后台运行的问题仍然存在问题,我希望没有人愿意创建视频这么久。 – 2013-04-25 09:09:15