AVAssetExportSession 在第一次运行时停止

问题描述 投票:0回答:1

在我的 iOS 应用程序中,我使用 AVAssetExportSession 来压缩视频文件

if let exportSession = AVAssetExportSession(asset: singleVideoComposition, presetName: AVAssetExportPresetMediumQuality) {
                
   exportSession.outputFileType = .mp4
   exportSession.timeRange = videoTrack.timeRange
                
   await exportSession.export() // cause a main thread to stall when called for the very first time
                
   if exportSession.status == .completed {
      completion(outputURL)
   } else {
      completion(nil)
   }
}

此代码在

Task
内部运行。问题是 - 在第一次压缩时,它会使主线程停止 1-2 秒,这会导致 UI 中出现不愉快的感觉。第一次使用后,它根本不会停止主线程,它在后台运行,UI 漂亮流畅。

为什么会发生这种情况以及如何解决这个问题?谢谢!

swiftui concurrency task avfoundation avassetexportsession
1个回答
0
投票

只要我的2分钱。

此代码在任务中运行

如果您从主要参与者创建

Task
,那么您将在主要参与者本身上运行代码。

要检查是否添加此行

print("Task.isMainActor: \(Task.isMainActor)")

确定了你是主角之后,我们就重点关注这个吧

await exportSession.export()

我们不知道导出函数在哪里运行操作。

  • 它可能位于继承的 actor 上(在这种情况下,它解释了 UI 滞后)。
  • 或者可能是特定的参与者(在这种情况下,后续步骤可能无济于事)。

但是你可以尝试! 在后台线程上运行整个代码,看看延迟是否消失。

Task(priority: .background) {
        
}
© www.soinside.com 2019 - 2024. All rights reserved.