我有一个基本的视频播放器,它可以从一个URL中播放视频。当视图出现时,我调用player.play()
,这样做我认为它会导致下面的错误。我想我必须等到视频完全从URL中获取才能尝试播放它。我如何才能实现这一点?
主线程被HTTP(S)资产的尚未加载的属性(RedRedTransform)上的同步属性查询阻塞。如果从慢速网络读取此资产,则可能会出现问题。
import SwiftUI
import AVKit
struct MainVideoPlayer: View {
let url: URL
@State var player = AVPlayer(url: URL(string: "https://www.google.com")!)
var body: some View {
ZStack {
VideoPlayer(player: $player)
}
.onAppear {
player = AVPlayer(url: url)
self.player.play()
}
}
}
struct VideoPlayer : UIViewControllerRepresentable {
@Binding var player : AVPlayer
func makeUIViewController(context: UIViewControllerRepresentableContext<VideoPlayer>) -> AVPlayerViewController {
let controller = AVPlayerViewController()
controller.player = player
controller.showsPlaybackControls = false
controller.videoGravity = .resizeAspectFill
return controller
}
func updateUIViewController(_ uiViewController: AVPlayerViewController, context: UIViewControllerRepresentableContext<VideoPlayer>) { }
}
字符串
2条答案
按热度按时间sqserrrh1#
你可以尝试一种不同的(更现代的)方法,使用Apple
VideoPlayer
,比如下面的示例代码:在我的测试中效果很好。在MacOS 14. 3上,使用Xcode 15,在真实的iOS 17设备(和预览版)、MacCatalyst和MacOS上测试。
字符串
标签:VideoPlayer
ddhy6vgd2#
不能将
@State
或@Binding
与类一起使用。AVPlayer
需要进入AVPlayerViewController
。您需要一个let url
,如果url与上次表示的init不同,您可以使用updateUIViewController
开始播放,例如:字符串