imp*_*7vx 10 xcode ios avassetexportsession swift
与此问题类似,
我有问题,我的应用程序以同样的方式崩溃.我会假设与另一个问题相同的答案:记忆问题; 除了我在AVAssetExportSession调用期间遇到崩溃.
guard let exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality) else { return }
exporter.outputFileType = AVFileTypeMPEG4
exporter.outputURL = url
exporter.videoComposition = mainComposition
print("done")
exporter.exportAsynchronously(completionHandler: {
DispatchQueue.main.async(execute: {
self.exportDidFinish(exporter)
print("removing AI")
self.removeAI()
print("removed AI")
completion()
})
})
func exportDidFinish(_ exporter:AVAssetExportSession) {
if(exporter.status == AVAssetExportSessionStatus.completed) {
print("cool")
}
else if(exporter.status == AVAssetExportSessionStatus.failed) {
print(exporter.error as Any)
}
}
Run Code Online (Sandbox Code Playgroud)
它打印"完成"但它从不打印"删除AI".它也不打印"酷"或"(错误)"; 它崩溃并在XCode的顶部说"失去与iPhone的连接......"就像另一个问题所说的那样.
我认为这是一个内存问题,但在异步导出期间(我知道它是如何工作的)之间没有任何事情发生,因为我只是在等待调用完成处理程序.但是之间没有任何东西被调用,我不确定如何处理这个问题.有什么想法吗?
我认为AVAssetExportSession在运行异步任务时该对象可能会被释放。考虑将其作为类变量以确保异步块可以完成其任务。它会是这样的:
class myClass {
var exporter: AVAssetExportSession?
func export() {
exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality)
guard exporter != nil else { return }
exporter.outputFileType = AVFileTypeMPEG4
exporter.outputURL = url
exporter.videoComposition = mainComposition
print("done")
exporter?.exportAsynchronously(completionHandler: {
DispatchQueue.main.async {
self.exportDidFinish(exporter)
print("removing AI")
self.removeAI()
print("removed AI")
completion()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我真的不确定为什么你也把所有东西都放在完成块的主线程上,但也许你想稍后用 UI 做一些事情,所以我把它留在那里。
但最重要的是 - 让你AVAssetExportSession不存储在可能释放它的方法上。这是可能导致此问题的内存问题。
我以前也遇到过这个问题,这对我来说不是内存问题。我不知道我到底是如何解决的,但我做了这些事情:
我删除了应用程序,硬重置手机,清理了 Xcode 上的构建,重新启动了 Xcode,删除了派生数据,如果我没记错的话,更改了 USB 端口,直到它得到修复。
我还打开了控制台和虚拟机,我也关闭了它们。
| 归档时间: |
|
| 查看次数: |
619 次 |
| 最近记录: |