首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >SwiftUI视频播放器如何设置url

SwiftUI视频播放器如何设置url
EN

Stack Overflow用户
提问于 2021-03-22 20:36:52
回答 1查看 1.9K关注 0票数 4

我正在尝试创建一个视图,允许我发送我想播放的视频的URL。我的看法如下:

代码语言:javascript
代码运行次数:0
运行
复制
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设置为传递的参数,则会得到以下错误:

代码语言:javascript
代码运行次数:0
运行
复制
Cannot use instance member 'videoURL' within property initializer; property initializers run     before 'self' is available

如何将aURL传递到视图以播放不同的电影?

我按建议修改了代码,视频没有播放:

代码语言:javascript
代码运行次数:0
运行
复制
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()
        } 
    }
}

我在试着改变计时器上的视频。我试过这个:

代码语言:javascript
代码运行次数:0
运行
复制
} 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
         }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-22 21:07:33

实现这一目标的方法有很多种,但是由于您已经在使用onAppear,这似乎是实现这一目标的好地方:

代码语言:javascript
代码运行次数:0
运行
复制
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,因为它应该在视图的呈现之间持久化。

基于注释的更新,处理可能更改的场景

代码语言:javascript
代码运行次数:0
运行
复制
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
                }
            }
    }
}

在更新中,您可以看到我将播放机存储在ObservableObject中。当url字符串被更改时,它会重新加载播放机。onAppear在您的代码中是不必要的--它只是在不同时间显示加载不同视频的一种方式(第一个是您提供的URL,第二个是来自我包的URL )。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66753505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档