显示视图时播放视频时SwiftUI错误

6qfn3psc  于 5个月前  发布在  Swift
关注(0)|答案(2)|浏览(69)

我有一个基本的视频播放器,它可以从一个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>) { }
}

字符串

sqserrrh

sqserrrh1#

你可以尝试一种不同的(更现代的)方法,使用Apple VideoPlayer,比如下面的示例代码:
在我的测试中效果很好。在MacOS 14. 3上,使用Xcode 15,在真实的iOS 17设备(和预览版)、MacCatalyst和MacOS上测试。

import Foundation
import SwiftUI
import AVKit
 
 
struct ContentView: View {
    var body: some View {
        MainVideoPlayer(url: URL(string: "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4")!)
    }
}

struct MainVideoPlayer: View {
    let url: URL
    @State var player = AVPlayer()
    
    var body: some View {
        VideoPlayer(player: player)
            .frame(height: 300)
            .onDisappear {
                player.pause()
            }
            .onAppear {
                player = AVPlayer(url: url)
                player.play()
            }
    }
}

字符串
标签:VideoPlayer

ddhy6vgd

ddhy6vgd2#

不能将@State@Binding与类一起使用。AVPlayer需要进入AVPlayerViewController。您需要一个let url,如果url与上次表示的init不同,您可以使用updateUIViewController开始播放,例如:

let url: URL

func updateUIViewController(_ uiViewController: AVPlayerViewController, context: UIViewControllerRepresentableContext<VideoPlayer>) { 

    if uiViewController.player.url != url {
        uiViewController.player = AVPlayer(url: url)
    }
}

字符串

相关问题