在后台使用AVAssetExportSession导出视频

4

我正在开发一个iOS 8应用程序,它可以录制视频,使用AVMutableVideoComposition进行修改,并通过调用exportAsynchronouslyWithCompletionHandlerAVAssetExportSession导出结果。

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

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在后台工作 我尝试了各种方法,比如使用beginBackgroundTaskWithExpirationHandler请求更多的执行时间(不起作用,因为在时间耗尽之前导出被中断),将音频添加为应用程序功能的后台模式(不起作用,也许是因为我使用了AVMutableVideoComposition?),在主线程之外的自定义队列中启动导出,但都无济于事。
即使在应用程序进入后台时尝试重新启动导出,也会失败。我尝试监听UIApplicationDidEnterBackgroundNotification,并在应用程序已经在后台时重新启动导出,但我仍然会得到相同的错误。
这个线程中的讨论暗示了这可能是因为AVMutableVideoComposition不能在后台使用: 在后台启动AVAssetExportSession iOS 8仍然如此吗?是否有任何解决方法,或者有谁知道我如何实现所需的功能(即编辑和导出用户刚刚录制的视频,即使他将应用程序发送到后台)?
非常感谢任何帮助,我已经花费了很多时间在这个问题上。
2个回答

3

iOS 13测试通过。导出时播放静音声音。

音频会话应配置如下:

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

需要后台模式。


2
很遗憾,对于iOS 8仍然是真实的。当应用程序在后台运行时,您无法导出,但可以在回到前台后立即开始导出。只需在您的应用程序进入后台之前保存AVMutableCompostion即可,在applicationDidEnterBackground中完成此操作。然后可以在applicationDidBecomeActive中重新开始导出。请注意:您必须重新开始导出。如果在进入后台之前未完成,则无法恢复。

真糟糕,我真的希望有一种方法可以在后台运行导出。我想我不得不采用你提出的解决方案。感谢你的帮助! - Andi S.
有没有任何官方文档链接指明这段代码只能在GPU上运行,而不能在后台运行? - Salman Khakwani
1
@SalmanKhakwani : 不幸的是,即使我在官方文档中也找不到。但请阅读以下内容:https://dev59.com/OYjca4cB1Zd3GeqPsirH 。其中包含更多的源代码和链接,这些链接在stackoverflow上有相同的建议。 - blancos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接