当应用程序在后台时,我无法让 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}
但是,当我有背景模式“音频、Airplay 和画中画”时,导出工作正常。
这很好,但是我们的提交被拒绝了,因为我们没有在后台播放任何音频。
还有其他方法可以在后台导出视频吗?
干杯,红
复制步骤
我创建了一个示例项目来展示这个问题。
下载地址:http://up.red.to/WKo1MMstzD
- 在设备上运行应用
- 接受权限
- 按下主页按钮
- 在 Xcode 中,转到调试 -> 模拟后台刷新
- 查看错误(在控制台中打印并显示为本地通知)
Best Answer-推荐答案 strong>
你的问题:
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,在任何一种情况下,您的应用程序仍应为系统做好准备,以不允许更多时间。这在 WWDC 2015 的 session 中得到了广泛的介绍。
您还必须确保您的后台事件没有写入文件系统的 protected 部分。确保输出位置具有正确的 NSFileProtection 属性设置,即使设备被锁定也允许访问。
现在,特别是使用后台获取,您完成工作并调用后台获取完成处理程序的时间非常有限。后台获取 API 旨在与 NSURLSession 一起使用,以安排在您的应用程序进程之外执行的后台下载。使用 NSProcessInfo API 可能不会为您赢得更多时间,而且后台获取 API 非常不适合编码/导出媒体。即使是很小的媒体文件,完成所需的时间也会超过后台提取处理程序的时间限制。
关于ios - 在后台运行 AVAssetExportSession,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/36185277/
|