当应用程序在后台时,我无法让 AVAssetExportSession 工作。
我的应用程序启用了后台模式“Background Fetch”。
当这个 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}
但是,当我有背景模式“音频、Airplay 和画中画”时,导出工作正常。
这很好,但是我们的提交被拒绝了,因为我们没有在后台播放任何音频。
还有其他方法可以在后台导出视频吗?
干杯,红色
重现步骤 我创建了一个示例项目来展示这个问题。
下载地址:http://up.red.to/WKo1MMstzD
- 在设备上运行应用
- 接受权限
- 按下主页按钮
- 在 Xcode 中,转到调试 -> 模拟后台刷新
- 查看错误(在控制台中打印并显示为本地通知)
最佳答案
您的问题:
is there any other way to export video in the background?
当然可以,但有一些限制。
NSProcessInfo
有一组 API,用于在应用程序处于后台时请求更多时间来完成任务。例如:
id activity = [[NSProcessInfo processInfo] beginActivityWithOptions:NSActivityAutomaticTerminationDisabled reason:@"Good Reason"];
[exportSession exportAsynchronouslyWithCompletionHandler:^{
[[NSProcessInfo processInfo] endActivity:activity];
}];
这会给你更多的时间。还有其他用于同步操作的 API,无论哪种情况,您的应用程序仍应为系统做好准备,不会允许更多时间。这在 2015 年 WWDC session 上有广泛讨论。
您还必须确保您的后台事件没有写入文件系统的 protected 部分。确保输出位置具有正确的 NSFileProtection
属性设置,即使在设备锁定时也允许访问。
现在,特别是对于后台提取,您完成工作和调用后台提取完成处理程序的时间非常有限。后台获取 API 旨在与 NSURLSession
一起使用,以安排在您的应用程序进程之外执行的后台下载。使用 NSProcessInfo
API 可能不会再为您争取时间,而且后台获取 API 非常不适合编码/导出媒体。即使是小型媒体文件,完成所需的时间也会超过后台提取处理程序的时间限制。
关于ios - 在后台运行 AVAssetExportSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36185277/