iOS 17.4真机使用AVPlayer时主线程阻塞问题求助
问题:SwiftUI VideoPlayer加载网络视频触发主线程阻塞警告
环境
- iOS 17.4
- iPhone 14 Pro 真机
错误信息
Main thread blocked by synchronous property query on not-yet-loaded property (PreferredTransform) for HTTP(S) asset. This could have been a problem if this asset were being read from a slow network.
触发问题的代码
struct ContentView: View { @State var player: AVPlayer = AVPlayer(url: URL(string: "https://video.twimg.com/amplify_video/1760315643142750208/vid/avc1/640x360/-1etorSK7w2g9Nlc.mp4?tag=16")!) var body: some View { VideoPlayer(player: player) } }
对比情况
使用本地Bundle中的视频初始化AVPlayer不会触发该错误:
AVPlayer(url: Bundle.main.url(forResource: "video", withExtension: "mp4")!)
已尝试的无效方案
在通过AVPlayerItem将资源交给AVPlayer前,使用try await AVAsset.load(_:)加载元数据,问题未解决。
疑问
是否有人遇到同样错误?这是SDK的bug吗?
解决方案与分析
这个警告在iOS 17.x的网络视频加载场景中不少开发者都遇到过,大概率是AVFoundation框架处理网络Asset元数据时的同步查询逻辑问题,属于SDK层面的小瑕疵。
可以试试以下几种规避方法:
- 延迟异步初始化AVPlayer
不要在@State里直接同步初始化网络AVPlayer,改为在视图出现后异步加载元数据再创建:
struct ContentView: View { @State private var player: AVPlayer? var body: some View { if let player { VideoPlayer(player: player) } else { ProgressView() .task { let url = URL(string: "https://video.twimg.com/amplify_video/1760315643142750208/vid/avc1/640x360/-1etorSK7w2g9Nlc.mp4?tag=16")! let asset = AVAsset(url: url) do { // 异步加载触发警告的属性 let _ = try await asset.load(.preferredTransform) let playerItem = AVPlayerItem(asset: asset) player = AVPlayer(playerItem: playerItem) } catch { print("加载失败:\(error)") } } } } }
- 改用AVPlayerViewController包装
暂时用UIKit的AVPlayerViewController包装到SwiftUI中,部分开发者反馈这种方式不会触发该警告:
struct VideoPlayerWrapper: UIViewControllerRepresentable { let url: URL func makeUIViewController(context: Context) -> AVPlayerViewController { let player = AVPlayer(url: url) let vc = AVPlayerViewController() vc.player = player return vc } func updateUIViewController(_ uiViewController: AVPlayerViewController, context: Context) {} } // 使用方式 struct ContentView: View { var body: some View { VideoPlayerWrapper(url: URL(string: "https://video.twimg.com/amplify_video/1760315643142750208/vid/avc1/640x360/-1etorSK7w2g9Nlc.mp4?tag=16")!) } }
目前这个警告不会导致崩溃,但会影响主线程性能(弱网环境下更明显)。苹果大概率会在后续iOS版本中修复该问题,暂时可以用上述方法规避。
内容的提问来源于stack exchange,提问作者mbc
相关产品推荐
相关产品推荐

