当应用程序在后台时,我无法使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”背景模式时,导出工作。
这很棒,但我们的提交被拒绝了,因为我们不在后台播放任何音频。
还有其他方法可以在后台导出视频吗?
干杯,红色
再现的步骤 我已经创建了一个示例项目来展示这个问题。
下载答案 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非常适合编码/导出媒体。即使是小型媒体文件,完成所需的时间也会超过后台获取处理程序的时间限制。