使用AVAssetExportSession在后台导出视频背景

时间:2015-08-31 08:22:59

标签: ios avfoundation

我正在制作一个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

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

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

2 个答案:

答案 0 :(得分:2)

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

音频会话应配置为:

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

需要背景模式。

答案 1 :(得分:1)

不幸的是,iOS 8仍然如此。当应用程序处于后台时,您无法导出,但可以在前台出现时立即开始导出。 只需在应用转到后台之前保存AVMutableCompostion即可。这可以在applicationDidEnterBackground中完成。然后,您可以在applicationDidBecomeActive中再次开始导出。

注意:您必须重新开始导出。如果在进入后台之前没有完成,则无法恢复。