在后台运行AVAssetExportSession

时间:2016-03-23 17:49:28

标签: ios background avassetexportsession

当应用程序在后台时,我无法使AVAssetExportSession正常工作。

我的应用程序启用了后台模式“后台获取”。

调用此UIApplicationDelegate方法时

func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)  
调用

我使用AVAssetExportSession导出AVAsset,使用以下方法:

exportAsynchronouslyWithCompletionHandler

然后我收到此错误:

Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSUnderlyingError=0x147dae560 {Error Domain=NSOSStatusErrorDomain Code=-16980 "(null)"}, NSLocalizedFailureReason=An unknown error occurred (-16980), NSLocalizedDescription=The operation could not be completed} 

但是,当我有“Audio,Airplay和Picture in Picture”背景模式时,导出工作。

这很棒,但我们的提交被拒绝了,因为我们不在后台播放任何音频。

还有其他方法可以在后台导出视频吗?

干杯,红色

再现的步骤 我已经创建了一个示例项目来展示这个问题。

从:http://up.red.to/WKo1MMstzD

下载
  • 在设备上运行应用
  • 接受权限
  • 按主页按钮
  • 在Xcode中,转到Debug - >模拟后台刷新
  • 查看错误(在控制台中打印并显示为本地通知)

1 个答案:

答案 0 :(得分:1)

你的问题:

  

还有其他方法可以在后台导出视频吗?

绝对有一些限制。

NSProcessInfo有一组API,用于在应用程序处于后台时请求更多时间来完成任务。例如:

id activity = [[NSProcessInfo processInfo] beginActivityWithOptions:NSActivityAutomaticTerminationDisabled reason:@"Good Reason"];
[exportSession exportAsynchronouslyWithCompletionHandler:^{
    [[NSProcessInfo processInfo] endActivity:activity];
}];

那会给你更多时间。还有其他用于同步操作的API,在任何一种情况下,您的应用程序仍应为系统准备允许更多时间。 2015年WWDC会议对此进行了广泛报道。

您还必须确保您的后台活动未写入文件系统的受保护部分。确保输出位置设置了正确的NSFileProtection属性,以便即使设备被锁定也允许访问。

现在,特别是使用后台提取功能,您只需要非常有限的时间来完成工作并调用后台提取完成处理程序。后台提取API旨在与NSURLSession一起使用,以安排在应用程序进程外执行的后台下载。使用NSProcessInfo API可能不会再为您带来任何时间,并且后台提取API非常适合编码/导出媒体。即使是小型媒体文件,完成所需的时间也会超过后台获取处理程序的时间限制。