如何在SwiftUI的AVPlayer中显示视频结束时的播放按钮
我试图在视频结束时显示默认的播放图标。作为默认行为,它显示所有其他控件,如第二张图所示,但我希望播放按钮与第一张图相同 我正在使用下面的代码如何在SwiftUI的AVPlayer中显示视频结束时的播放按钮,swift,swiftui,avplayer,avplayerviewcontroller,Swift,Swiftui,Avplayer,Avplayerviewcontroller,我试图在视频结束时显示默认的播放图标。作为默认行为,它显示所有其他控件,如第二张图所示,但我希望播放按钮与第一张图相同 我正在使用下面的代码 struct AVPlayerView: UIViewControllerRepresentable { var videoURL: URL @State var playerController:AVPlayerViewController? @State var player:AVPlayer?
struct AVPlayerView: UIViewControllerRepresentable {
var videoURL: URL
@State var playerController:AVPlayerViewController?
@State var player:AVPlayer?
func makeUIViewController(context: UIViewControllerRepresentableContext<AVPlayerView>) -> AVPlayerViewController {
let controller = AVPlayerViewController()
controller.player = AVPlayer(url: videoURL)
controller.videoGravity = .resizeAspect
self.player = controller.player
self.playerController = controller
return controller
}
func updateUIViewController(_ uiViewController: AVPlayerViewController, context: UIViewControllerRepresentableContext<AVPlayerView>) {
}
}
struct AVPlayerView:UIViewControllerRepresentable{
var videoURL:URL
@状态变量playerController:AVPlayerViewController?
@状态变量播放器:AVPlayer?
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->AVPlayerViewController{
let controller=avplayervewcontroller()
controller.player=AVPlayer(url:videoURL)
controller.videoGravity=.resizeAspect
self.player=controller.player
self.playerController=控制器
返回控制器
}
func updateUIViewController(uViewController:AVPlayServiceWController,上下文:UIViewControllerRepresentableContext){
}
}
我计划在视频结束时重新初始化AVPlayer,但不确定这是否正确。以下是我所做的,效果很好
struct AVPlayerView: UIViewControllerRepresentable {
var videoURL: URL
let controller = AVPlayerViewController()
func makeUIViewController(context: UIViewControllerRepresentableContext<AVPlayerView>) -> AVPlayerViewController {
controller.player = AVPlayer(url: videoURL)
controller.videoGravity = .resizeAspect
self.addPeriodicTimeObserver()
return controller
}
func updateUIViewController(_ uiViewController: AVPlayerViewController, context: Context) {
}
func addPeriodicTimeObserver() {
self.controller.player?.addPeriodicTimeObserver(forInterval: CMTime(seconds: 1, preferredTimescale: CMTimeScale(NSEC_PER_SEC)), queue: DispatchQueue.main, using: { (currentTime) in
if let endTime = self.controller.player?.currentItem?.duration {
if currentTime == endTime {
// Reset the player
self.controller.player = AVPlayer(url: self.videoURL)
self.addPeriodicTimeObserver()
}
}
})
}
}
struct AVPlayerView:UIViewControllerRepresentable{
var videoURL:URL
let controller=avplayervewcontroller()
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->AVPlayerViewController{
controller.player=AVPlayer(url:videoURL)
controller.videoGravity=.resizeAspect
self.addPeriodicTimeObserver()
返回控制器
}
func updateUIViewController(uUIViewController:AVPlayerViewController,上下文:上下文){
}
func addPeriodicTimeObserver(){
self.controller.player?.addPeriodicTimeObserver(forInterval:CMTime(秒数:1,首选时间刻度:CMTimeScale(NSEC_/秒)),队列:DispatchQueue.main,在中使用:{(currentTime))
如果让endTime=self.controller.player?.currentItem?持续时间{
如果currentTime==endTime{
//重置播放器
self.controller.player=AVPlayer(url:self.videoURL)
self.addPeriodicTimeObserver()
}
}
})
}
}