你会如何继续从图像创建长视频?这需要很长时间,用户将无聊等待它,所以我想在后台生成电影并在完成后通知用户。
我的app结构是这样的,我有一个UINavigationController,它包含一个带模拟电影的控制器,只有一些图像随CoreAnimation移动。然后我推出一个生成电影的新控制器。在controller2中,我向controller1发送请求,向我发送带有帧的图像,以便在电影上写入(我使用CoreGraphics生成图像)。这几乎阻止了一切,因为它花费了大量时间并且是连续的。
我阅读了有关后台任务的内容并且似乎是唯一的解决方案,但它们不会持续很长时间并且可能会在中间停止,生成30秒的视频大约需要6分钟。我也无法宣布我的应用程序在后台运行,因为它不是VoIP或其他支持的类型。
感谢您的想法。
答案 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];
我希望有所帮助。