【问题标题】:iOS generating a video in the background taskiOS 在后台任务中生成视频
【发布时间】:2013-04-23 07:25:20
【问题描述】:

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

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

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

感谢您的想法。

【问题讨论】:

  • 但这会很快消耗电池,因为这涉及大量计算和 RAM I/O。
  • 如果最终的电影值得他们使用,如果不是,他们会使用它。也许可以在速度上做一些改进,现在是为每帧处理几次图像。

标签: ios multitasking


【解决方案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);
...

当你完成后,确保你让操作系统知道你的后台任务已经完成:

 [[UIApplication sharedApplication] endBackgroundTask:_backgroundRenderingID];

希望对你有所帮助。

【讨论】:

  • 谢谢,是的,这行得通。只需要看看如果这个过程需要超过 10 分钟我会做什么,也许可以暂停。
  • 如果它对您有用,请不要忘记接受答案,以便下一个搜索它的人可以立即知道这是一个很好的解决方案。
  • 是的。顺便说一句,我尝试了你的应用程序只是为了比较速度,我认为你需要在用户界面上做更多的工作,我几乎不知道该怎么做,也找不到导出功能。今天我刚刚完成了我的应用程序并找到了一些提高速度的方法,而不是生成图像、调整大小、翻转、分层和所有这些东西,我只是捕获了显示在 UIView 中的结果图像,而且速度更快,几乎是实时的。允许在后台运行10分钟的问题仍然是一个问题,我希望没有人愿意制作这么长时间的视频。
  • 感谢您的反馈,很高兴您找到了优化代码的方法。
猜你喜欢
  • 1970-01-01
  • 2012-06-15
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多