SwiftUI视频播放器如何设置url

SwiftUI视频播放器如何设置url,swift,swiftui,video-player,Swift,Swiftui,Video Player,我正在尝试创建一个视图,允许我发送我想要播放的视频的URL。我的观点是这样的: import SwiftUI import AVKit struct PlayerView: View { var videoURL : String private let player = AVPlayer(url: URL(string: "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8")!)

我正在尝试创建一个视图,允许我发送我想要播放的视频的URL。我的观点是这样的:

import SwiftUI
import AVKit

struct PlayerView: View {
    var videoURL : String
    private let player = AVPlayer(url: URL(string: "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8")!)

var body: some View {
    VideoPlayer(player: player)
        .onAppear() {
            // Start the player going, otherwise controls don't appear
            player.play()
        }
        .onDisappear() {
            // Stop the player when the view disappears
            player.pause()
        }
    }
}
如果尝试将URL设置为传递的参数,则会出现以下错误:

Cannot use instance member 'videoURL' within property initializer; property initializers run     before 'self' is available
如何将aURL传递给View以播放不同的电影


我按照建议更改了代码,但视频无法播放:

import SwiftUI
import AVKit

struct PlayerView: View {
    var videoURL : String
    @State private var player : AVPlayer?

var body: some View {
    VideoPlayer(player: player)
        .onAppear() {
            // Start the player going, otherwise controls don't appear
            guard let url = URL(string: videoURL) else {
                return
            }
            print(url)
            let player = AVPlayer(url: url)
            self.player = player
            self.player?.seek(to: CMTime.zero)
            self.player!.play()
        }
        .onDisappear() {
            // Stop the player when the view disappears
            player?.pause()
        } 
    }
}
我正在尝试更改计时器上的视频。我试过这个:

} else {
    VideoPlayer(player: viewModel.player)
    .onAppear {
          viewModel.urlString = "https://testsite.neumont.edu/images/green.mp4"

                        }

    .onReceive(movieSwitchTimer) { _ in
       DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
      viewModel.urlString = "https://testsite.neumont.edu/images/earth.mp4"
                            }
    self.activeImageIndex = (self.activeImageIndex + 1) % slideStore.images.count
         }
    }

有很多方法可以实现这一点,但由于您已经在使用Appear上的
,因此这似乎是一个实现这一点的好地方:

struct PlayerView: View {
    var videoURL : String
    @State private var player : AVPlayer?
    
    var body: some View {
        VideoPlayer(player: player)
            .onAppear() {
                // Start the player going, otherwise controls don't appear
                guard let url = URL(string: videoURL) else {
                    return
                }
                let player = AVPlayer(url: url)
                self.player = player
                player.play()
            }
            .onDisappear() {
                // Stop the player when the view disappears
                player?.pause()
            }
    }
}
您希望
player
成为
@State
,因为它应该在视图的渲染之间保持

根据评论进行更新,处理URL可能更改的情况

class VideoViewModel : ObservableObject {
    @Published var urlString : String? {
        didSet {
            guard let urlString = urlString, let url = URL(string: urlString) else {
                return
            }
            player = AVPlayer(url: url)
            player.seek(to: .zero)
            player.play()
        }
    }
    var player = AVPlayer()
}

struct ContentView : View {
    @StateObject var viewModel = VideoViewModel()
    
    var body: some View {
        VideoPlayer(player: viewModel.player)
            .onAppear {
                viewModel.urlString = "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8"
                DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
                    viewModel.urlString = Bundle.main.url(forResource: "IMG_0226", withExtension: "mp4")!.absoluteString
                }
            }
    }
}

在更新中,您可以看到我将播放器存储在一个
可观察对象中。只要url字符串发生更改,就会重新加载播放器。您的代码中不需要出现
onAppear
,它只是一种显示在不同时间加载不同视频的方式(第一个是您提供的URL,第二个是我的捆绑包中的URL)。

我尝试了您的建议,但仍然没有视频。查看问题中的更改我刚刚尝试了您使用原始示例中的URL粘贴到更新中的代码,对我来说加载很好。iOS 14.4,Xcode 12.4。您是否尝试过在项目中不运行任何其他内容的情况下从空白的ContentView加载,以查看是否有任何其他内容正在影响它?它现在在第一个视频上对我有效,但我传递的第二个视频不显示什么“第二个视频”?你的问题没有提到那件事。我做了一个假设,因为您已经在使用onAppear(它只会被触发一次),而且您的问题从未提及url参数不会改变的任何其他内容。但是你是说URL参数可能会改变吗?我将我的代码分离到另一个项目中,你的建议奏效了!我真的很感激你对我的帮助。