【问题标题】:VideoPlayer Autoplay SwiftUI IssueVideoPlayer 自动播放 SwiftUI 问题
【发布时间】:2021-08-27 10:49:28
【问题描述】:

我正在尝试让VideoPlayer 与视频控制器一起自动播放,但我似乎无法弄清楚!我应该怎么办?我对 SwiftUI 还很陌生。

struct VideoView: View {
    // MARK: - PROPERTIES
    
    //: BINDING
    @Binding var videoView: Bool
    
    //: STATE
    @State var player = AVPlayer()
    @State var isplaying = true
    @State var showcontrols = true
    
    //: VAR
    var allowsPictureInPicturePlayback : Bool = true
    var wrkflw: Wrkflw
    
    // MARK: - BODY
    
    var body: some View {
        
        VideoPlayer(wrkflw: wrkflw, player: $player)
            .edgesIgnoringSafeArea(.all)
            
            .onAppear {
                player.play()
            }
        
    }
}
    

标记:- 视频控制器

struct VideoPlayer : UIViewControllerRepresentable {
    
    var wrkflw: Wrkflw
    @Binding var player : AVPlayer
    
    func makeUIViewController(context: Context) ->  UIViewController {
        
        
        let player = AVPlayer(url: wrkflw.wrkvideo)
        let controller = AVPlayerViewController()
        
        controller.player = player
        controller.showsPlaybackControls = true
        controller.exitsFullScreenWhenPlaybackEnds = true
        controller.allowsPictureInPicturePlayback = true
        
        return controller
    }
    
    func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
        
        
    }
}

【问题讨论】:

  • 您在AVPlayer不同实例 上调用play - 查看您如何在VideoView 中创建一个,然后创建另一个在makeUIViewController 里面?如果您要这样调用play(),它们必须是相同的实例
  • 是的,我明白了。无论我是从 VideoView 还是 makeUIViewController 中取出实例,结论都是一样的。你有什么建议?

标签: swift swiftui autoplay


【解决方案1】:

最简单的解决方案是将AVPlayer 引用从您的VideoView 传递给VideoPlayer。您可以使用player.replaceCurrentItem,这样您就可以设置正确的 URL,但保持相同的播放器引用。

确保删除VideoPlayer 中的let player...


struct VideoView: View { // MARK: - PROPERTIES
    
    //: BINDING
    
    @Binding var videoView: Bool
    
    //: STATE
    @State var player = AVPlayer()
    @State var isplaying = true
    @State var showcontrols = true
    
    //: VAR
    var allowsPictureInPicturePlayback : Bool = true
    var wrkflw: Wrkflw
    
    // MARK: - BODY
    
    var body: some View {
        
        VideoPlayer(wrkflw: wrkflw, player: player)
            .edgesIgnoringSafeArea(.all)
        
            .onAppear {
                player.replaceCurrentItem(with: AVPlayerItem(url: wrkflw.wrkvideo)) //<-- Here
                player.play()
            }
        
    }
}
// MARK: - VIDEO CONTROLLER

struct VideoPlayer : UIViewControllerRepresentable {
    
    var wrkflw: Wrkflw
    var player : AVPlayer
    
    func makeUIViewController(context: Context) ->  UIViewController {
        
        //<-- Here
        
        let controller = AVPlayerViewController()
        
        controller.player = player
        controller.showsPlaybackControls = true
        controller.exitsFullScreenWhenPlaybackEnds = true
        controller.allowsPictureInPicturePlayback = true
        
        return controller
    }
    
    func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
        
        
    }
}

【讨论】:

  • 哇!效果很好!太感谢了!我被踩了!!你帮了很多忙!!再次感谢您!
猜你喜欢
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
相关资源
最近更新 更多