OGeek|极客世界-中国程序员成长平台

标题: ios - 在后台运行 AVAssetExportSession [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 15:29
标题: ios - 在后台运行 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} 

但是,当我有背景模式“音频、Airplay 和画中画”时,导出工作正常。

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

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

干杯,红

复制步骤 我创建了一个示例项目来展示这个问题。

下载地址:http://up.red.to/WKo1MMstzD



Best Answer-推荐答案


你的问题:

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/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://jike.in/) Powered by Discuz! X3.4