ios - 在后台运行 AVAssetExportSession

标签 ios background avassetexportsession

当应用程序在后台时,我无法让 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/

相关文章:

ios - AVFoundation 导出方向错误

ios - 如何将视频转码为16 :9 format and vary the bit rate (and perhaps FPS)?

iphone - 当我们为 iPhone 输入第一个字母时显示搜索的所有名称

iphone - 从网络服务器加载 PLIST

ios - Dropbox iOS SDK 中的 loadStreamableURLForFile() 不返回任何内容

ios - Swift - 按子值从 Firebase 中选择

bash - 在后台 BASH 上运行 Matlab

javascript - 在图像更改时更改轮播的 bg 颜色

ios - 使用 AVFoundation 裁剪 AVAsset 视频

jquery - 全屏视差背景