在后台使用 AVAssetExportSession 导出视频

Exporting videos with AVAssetExportSession in background the background

我正在开发一个 iOS 8 应用程序,它可以录制视频,使用 AVMutableVideoComposition 对其进行修改,然后使用 AVAssetExportSession 调用 exportAsynchronouslyWithCompletionHandler 导出结果。

只要应用程序在前台运行,一切正常。但是,当用户在导出完成之前按下主页按钮并将应用程序发送到后台时,会引发以下错误:

Error Domain=AVFoundationErrorDomain Code=-11847 "Operation Interrupted"     
UserInfo=0x174271c40 {NSUnderlyingError=0x170246c90 "The operation couldn't 
be completed. (OSStatus error -12125.)", NSLocalizedRecoverySuggestion=Stop 
other operations and try again., NSLocalizedDescription=Operation 
Interrupted}

看起来其他人也遇到过与音频相同的错误:AVAssetExportSession working in background

我尝试了各种方法,例如使用 beginBackgroundTaskWithExpirationHandler 请求更多执行时间(不起作用,因为在时间用完之前导出被中断),在应用程序中添加音频作为背景模式功能(不起作用,可能是因为我使用了 AVMutableVideoComposition?),在主线程外的自定义队列中开始导出,但没有任何效果。

即使在应用进入后台时导出尚未完成的情况下尝试重新启动导出也会失败。我试着听 UIApplicationDidEnterBackgroundNotification 并在应用程序已经在后台后重新启动导出,但我得到了同样的错误。

该线程中的讨论暗示这可能是因为 AVMutableVideoComposition 无法在后台使用:

Starting AVAssetExportSession in the Background

iOS8 是否仍然如此?是否有任何解决方法或有人知道我如何实现所需的功能(编辑和导出用户刚刚录制的视频,即使他将应用程序发送到后台)?

非常感谢任何帮助,我在这个问题上花了很多时间。

不幸的是,iOS 8. 应用程序在后台时无法导出,但是一进入前台就可以开始导出。 只需在您的应用进入后台之前保存 AVMutableCompostion。这可以在 applicationDidEnterBackground 中完成。然后您可以在 applicationDidBecomeActive 中再次开始导出。

注意:您必须重新开始导出。进入后台前未完成无法恢复

iOS 13 个测试。导出时播放静音。

音频会话应配置如下:

try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.mixWithOthers, .allowAirPlay])
try AVAudioSession.sharedInstance().setActive(true)

需要后台模式。