iOS在后台任务中生成视频

时间:2013-04-23 07:25:20

标签: ios multitasking

你会如何继续从图像创建长视频?这需要很长时间,用户将无聊等待它,所以我想在后台生成电影并在完成后通知用户。

我的app结构是这样的,我有一个UINavigationController,它包含一个带模拟电影的控制器,只有一些图像随CoreAnimation移动。然后我推出一个生成电影的新控制器。在controller2中,我向controller1发送请求,向我发送带有帧的图像,以便在电影上写入(我使用CoreGraphics生成图像)。这几乎阻止了一切,因为它花费了大量时间并且是连续的。

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

感谢您的想法。

1 个答案:

答案 0 :(得分:4)

根据我的理解,你可以这样做,虽然你的应用程序只会在有限的时间内运行,但根据你的视频大小,它就足够了。事实上,我在我的动画创作应用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);
...

完成后,请确保让操作系统知道您的后台操作清晰完成:

 [[UIApplication sharedApplication] endBackgroundTask:_backgroundRenderingID];

我希望有所帮助。